![]() |
CRC32+regfile.dat Помогите
Ребята помогите пожалуйста.
вот такая у меня проблема я нашел в проге место где проверяется серейник и изменил jnz->jz место генераций серейника не смог найти (слишком запутано) потом патчил и вот проблема самые важные части проги начали не работать, с помощи peid(kanal)-a узнал что в проге есть 2 алгоритма хеширования crc16-ccitt и crc32, и еще я узнал что хешируется не весь код программы а только несколько секций (code section), и еще когда загружаю прогу в олли но не запускаю его а меняю jnz на jz, и вот потом запускаю прога работает нормально. Вопросы: 1.Как можно изменить несколько байт в code section,чтоб црц секций не менялось?, как узнать црц32 код секций ? если у кого нить такие туториалы,статьи,примеры ? 2.Как найти где именно црц проверка происходит, ведь если в проге есть полином crc32(16) то канал может и врать. 3.Прога ищет regkey.dat и из него читает серейник, как узнать где именно он читает серейник ? хочу сказать что Readfile-ов в проге очень много, и вообще таких функций(CreatefileA) много. 4.И как объяснить тот факт, что олли пишет program entery point - 0041204 и когда после этого я меняю байты прога работает нормально, те проверки значит не происходит, как это возможно ? ЗАРАНЕЕ ОЧЕНЬ БЛАГОДАРЕН! Нашел место где проверяется 2 байта и в файле regkey.dat изменил подходящим образом и прога в about-e пишет registered,а когда нажимаю на одну кнопку виснет, как это объяснить? и как можно найти настоящее место проверки серейника? |
>>Как можно изменить несколько байт в code section,чтоб црц секций не менялось?, как узнать црц32 код секций ?
если у кого нить такие туториалы,статьи,примеры ? нет нет. дело в том, что программа хранит у себя верное crc. и если вы что-то поменяете оно будет другое. ищите проверки. по другому никак. мало просто изменить какой-то джамп. возможно значения, которые возвращает функция проверки crc где-то сохраняется и потом у вас все глючит. или вы нашли неверный переход. или само значение crc где-то используется. дайте лучше ссылку на софт, телепатов-удаленнореверсеров нет. |
0x0c0de неправа. универсальный выход - заюзать плиг для пеида CRC32, он позволяет подменить CRC32 файла на произвольное зна4ение. соотвественно ищи эталонное (контрольная сумма файла до пат4инга), пат4 переходы, меняй в плаге зна4ение выходного файла на то которое было до него. все. должно работать, если проверка стоит только на CRC32
|
0x0c0de
Просто одна просьба,если найдешь место генераций серейника обясни мне как ты нашел,а кейген постораюсь сделать сам,ЗАРАНЕЕ ОЧЕНЬ БЛАГОДАРЕН Вот сама программа http://rapidshare.com/files/143136794/HistoryKiller.rar.html |
2 ProTeuS
друг там НЕ ВЕСЬ КОД Проверяется а только несколько секций а црц32 плагин тут не поможет |
ProTeuS, а гарантия есть, что там только CRC32? Ты предложил хороший метод под конкретный алгоритм.
|
0x0c0de, ТС написал 4то токо CRC32\16 есть, стало быть должно проканать было
cryptX, ставишь бряк на 4тение секции данных (или какая там у тебя) при старте в ольке, ловишь бряки на проверках, записываешь места, трейсишь вверх, смотришь 4то далее с 4ем сравнивается, подмяняешь результат на эталонный, или пат4ишь переходы. все |
Part I
Ставишь бряк на CreateFileA, третья остановка при открытии regkey.dat, потом чтение файла в память, ставишь memory breakpoint на эту память и ты в функции проверки файла. Функция должна вернуть 1, делать патч или кейген решай сам. Структура файла проста: 12 байт - то, что проверяется; 80< - ключ, не проверяется, но отображается в окне About. Я так думаю, при регистрации ключ проверяется, если он валиден, создаётся его хэш и вместе сним записывается в файл. Part II Ставишь бряк на CreateFileA, вторая остановка при открытии самого себя, потом чтение в память, ставишь memory бряк на эту память и ты в функции проверки crc, точнее в месте, где происходит сравнение crc текущего файла с crc оригинального. Можно пропатчить ( je --> jmp ), а можно посмотреть crc текущего файла и hex-editor-ом заменить его crc оригинального. Если что-то непонятно, могу написать более подробно с адресами и комментами. |
2 fromRIDDER
СПАСИБОО БОЛЬШОЕЕЕ,шас постораюсь сделать патч или кейген если что сообщу :) |
2 fromRIDDER
а как ты узнал что именно на CreateFileA нужно бряк ставить ? и что это за функция CreateFileA ? |
Код:
.text:00418EA4 mov edi, 0ADF89ED0h ; initКод:
.text:0041EB10 ; [0000000A BYTES: COLLAPSED FUNCTION SetCRCFlag01. PRESS KEYPAD "+" TO EXPAND]Ну вот как-то так. |
2 fromRIDDER and 2 Everybody
в 3й остановке бряка написано 00419821 |> \FF15 CC424400 CALL DWORD PTR DS:[<&KERNEL32.CreateFile>; \CreateFileA 00419827 |. 8946 04 MOV DWORD PTR DS:[ESI+4],EAX 0041982A |. 8B4E 04 MOV ECX,DWORD PTR DS:[ESI+4] 0041982D |. 33C0 XOR EAX,EAX -------------Stack Window------------------ 0012F8DC 0012F914 щ. |FileName = "D:\Program Files\pro\regkey.dat" 0012F8E0 80000000 ...Ђ |Access = GENERIC_READ 0012F8E4 00000001 ... |ShareMode = FILE_SHARE_READ 0012F8E8 00000000 .... |pSecurity = NULL 0012F8EC 00000003 ... |Mode = OPEN_EXISTING 0012F8F0 00000020 ... |Attributes = ARCHIVE 0012F8F4 00000000 .... \hTemplateFile = NULL ------------------------------------------------- потом я ставил мемори бряк на 00419827и 0041982A и нечего не происходит,ставил бряк на еси+4 и тоже нечего,как попасть в функцию проверки? где именно ставить мемори бряк? |
Почему брикпоинт на CreateFileA.
Функций открытия файла на так уж много, и все они в конечном счёте вызывают CreateFileW. Но если поставить бряк на него, то будет слишком много ложных остановок: функция используется не только для работы с файловой системой. Я всегда ставлю бряк на CreateFileA, а после остановки жму Alt+F9 (OllyDbg), какая бы функция не использовалась, почти всегда попадешь в пользовательский код. На что ставить memory breakpoint. После нужной остановки на бряке CreateFileA, ставишь бряк на ReadFile (или трейсишь до её использования). Когда остановишься: проверяешь по дескриптору из какого объекта происходит чтение; смотришь в аргументах указатель буфера, в который будет чтение; по какому смещению в объекте. Редко когда обработка прочитанных данных идёт сразу вслед за чтением, поэтому, чтобы не тратить время, ставим memory breakpoint на кусок памяти, куда прочитали. После срабатывания бряка анализируем ситуацию. |
to neprovad
Всё не так сложно: сразу же после запуска программы, она создаёт crc файла на жёстком диске, сравнивает с оригинальным, дописанным в конец файла. Всё, больше проверок целостности экзешника нет. |
2 fromRIDDER
Извены я новичок в этом деле,не могу понять как ставить бряк на мемори в олли,вот это место например где вызевается ReadFile 004198E5 |. FF15 C4424400 CALL DWORD PTR DS:[<&KERNEL32.ReadFile>] ; \ReadFile 004198EB |. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] 004198EF \. C2 0800 RETN 8 0012F8E8 00000128 (.. |hFile = 00000128 (window) 0012F8EC 01DF2A9A љ*Я |Buffer = 01DF2A9A 0012F8F0 0000000C .... |BytesToRead = C (12.) 0012F8F4 0012F904 щ. |pBytesRead = 0012F904 0012F8F8 00000000 .... \pOverlapped = NULL 0012F8FC 00418798 ?‡A. RETURN to HistoryK.00418798 from HistoryK.004198D0 как ставить бряк на буффер ? что писать чтоб ставить бряк на мемори ? если можно по подробнее,я только учусь |
Цитата:
|
Цитата:
|
|
| Время: 19:33 |