Ребята помогите пожалуйста. вот такая у меня проблема я нашел в проге место где проверяется серейник и изменил 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
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 а как ты узнал что именно на CreateFileA нужно бряк ставить ? и что это за функция CreateFileA ?
Code: .text:00418EA4 mov edi, 0ADF89ED0h ; init .text:00418EA9 mov eax, 0F158FDEAh .text:00418EAE mov edx, 589485FCh .text:00418EB3 mov ecx, 15898FCEh .text:00418EB8 mov [esi+0DCh], edi .text:00418EBE mov [esi+0ECh], edi .text:00418EC4 mov [esi+0FCh], edi .text:00418ECA mov [esi+0E8h], eax .text:00418ED0 mov [esi+0F8h], eax .text:00418ED6 mov [esi+108h], eax .text:00418EDC pop edi .text:00418EDD mov [esi+0E0h], edx .text:00418EE3 mov [esi+0E4h], ecx .text:00418EE9 mov [esi+0F0h], edx .text:00418EEF mov [esi+0F4h], ecx .text:00418EF5 mov [esi+100h], edx .text:00418EFB mov [esi+104h], ecx .text:00418F01 mov dword ptr [esi+10Ch], 0F53h .text:00418F0B mov dword ptr [esi+110h], 0F52h ================================================== .text:004188C6 mov dword ptr [esi], 0FC148ABh ; init .text:004188CC mov dword ptr [edi], 1C1F87B0h ; init ================================================== .text:0041CD4C mov edx, [eax+0E8h] ; edx=0A889F8A5h .text:0041CD52 cmp edx, [eax+0E0h] ; [eax+0E0h]=0A889F8A5h .text:0041CD58 jz short loc_41CD84 ================================================== .text:0040BA4A mov ecx, [eax+104h] ; ecx=1AEA103Bh .text:0040BA50 cmp ecx, [eax+0FCh] ; [eax+0FCh]=1AEA103Bh .text:0040BA56 jz short loc_40BA65 ================================================== .text:00406255 mov edx, [eax+0ECh] ; edx=162063EFh .text:0040625B mov ecx, [eax+0F4h] ; ecx=162063EFh .text:00406261 cmp ecx, edx .text:00406263 setz dl ================================================== .text:00405094 mov ecx, [eax+0F4h] ; ecx=162063EFh .text:0040509A cmp ecx, [eax+0ECh] ; [eax+0ECh]=162063EFh .text:004050A0 jz short loc_4050A4 ================================================== .text:00406305 mov edx, [eax+0E0h] ; edx=0A889F8A5h .text:0040630B mov ecx, [eax+0E8h] ; ecx=0A889F8A5h .text:00406311 cmp ecx, edx .text:00406313 setz dl Беглого осмотра достаточно чтобы понять что команды читающие значения crc - одинаковые. Поэтому можно их все найти поиском с помощью Olly. Code: .text:0041EB10 ; [0000000A BYTES: COLLAPSED FUNCTION SetCRCFlag01. PRESS KEYPAD "+" TO EXPAND] .text:0041EB1A align 10h .text:0041EB20 ; [0000000A BYTES: COLLAPSED FUNCTION SetCRCFlag04. PRESS KEYPAD "+" TO EXPAND] .text:0041EB2A align 10h .text:0041EB30 ; [0000000A BYTES: COLLAPSED FUNCTION SetCRCFlag03. PRESS KEYPAD "+" TO EXPAND] Ну а тут все функции переименованы для наглядности. Каждая ставит флаг Bool: IsCrcValid; Далее флаги проверяются там сям при работе. Ну вот как-то так.
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 как ставить бряк на буффер ? что писать чтоб ставить бряк на мемори ? если можно по подробнее,я только учусь
Folow in dump, адрес, где расположен буфер, а потом уже в окне дампа Breakpoint->Memory on access/write
Нет, пароль узнать нельзя. Но вместо настоящего пароля, можно подобрать другой, с таким же хэшем. В твоем случае это будет 2E AF CB 44 в шестнадцатеричной системе счисления. Ввести его с клавиатуры не получится, но можно передать программно. Для ввода с клавиатуры можешь использовать пароль cAprB