CRC32+regfile.dat Помогите

Discussion in 'Реверсинг' started by cryptX, 6 Sep 2008.

  1. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    Ребята помогите пожалуйста.
    вот такая у меня проблема
    я нашел в проге место где проверяется серейник и изменил 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,а когда нажимаю на одну кнопку виснет, как это объяснить? и как можно найти настоящее место проверки серейника?
     
  2. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    >>Как можно изменить несколько байт в code section,чтоб црц секций не менялось?, как узнать црц32 код секций ?
    если у кого нить такие туториалы,статьи,примеры ?


    нет нет. дело в том, что программа хранит у себя верное crc. и если вы что-то поменяете оно будет другое. ищите проверки. по другому никак. мало просто изменить какой-то джамп. возможно значения, которые возвращает функция проверки crc где-то сохраняется и потом у вас все глючит. или вы нашли неверный переход. или само значение crc где-то используется. дайте лучше ссылку на софт, телепатов-удаленнореверсеров нет.
     
  3. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    0x0c0de неправа. универсальный выход - заюзать плиг для пеида CRC32, он позволяет подменить CRC32 файла на произвольное зна4ение. соотвественно ищи эталонное (контрольная сумма файла до пат4инга), пат4 переходы, меняй в плаге зна4ение выходного файла на то которое было до него. все. должно работать, если проверка стоит только на CRC32
     
  4. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    0x0c0de
    Просто одна просьба,если найдешь место генераций серейника обясни мне как ты нашел,а кейген постораюсь сделать сам,ЗАРАНЕЕ ОЧЕНЬ БЛАГОДАРЕН
    Вот сама программа http://rapidshare.com/files/143136794/HistoryKiller.rar.html
     
  5. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    2 ProTeuS
    друг там НЕ ВЕСЬ КОД Проверяется а только несколько секций а црц32 плагин тут не поможет
     
  6. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    ProTeuS, а гарантия есть, что там только CRC32? Ты предложил хороший метод под конкретный алгоритм.
     
    1 person likes this.
  7. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    0x0c0de, ТС написал 4то токо CRC32\16 есть, стало быть должно проканать было

    cryptX, ставишь бряк на 4тение секции данных (или какая там у тебя) при старте в ольке, ловишь бряки на проверках, записываешь места, трейсишь вверх, смотришь 4то далее с 4ем сравнивается, подмяняешь результат на эталонный, или пат4ишь переходы. все
     
  8. fromRIDDER

    fromRIDDER Member

    Joined:
    2 Aug 2008
    Messages:
    8
    Likes Received:
    5
    Reputations:
    2
    Part I

    Ставишь бряк на CreateFileA, третья остановка при открытии regkey.dat, потом чтение файла в память, ставишь memory breakpoint на эту память и ты в функции проверки файла. Функция должна вернуть 1, делать патч или кейген решай сам. Структура файла проста: 12 байт - то, что проверяется; 80< - ключ, не проверяется, но отображается в окне About. Я так думаю, при регистрации ключ проверяется, если он валиден, создаётся его хэш и вместе сним записывается в файл.

    Part II

    Ставишь бряк на CreateFileA, вторая остановка при открытии самого себя, потом чтение в память, ставишь memory бряк на эту память и ты в функции проверки crc, точнее в месте, где происходит сравнение crc текущего файла с crc оригинального. Можно пропатчить ( je --> jmp ), а можно посмотреть crc текущего файла и hex-editor-ом заменить его crc оригинального.

    Если что-то непонятно, могу написать более подробно с адресами и комментами.
     
  9. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    2 fromRIDDER
    СПАСИБОО БОЛЬШОЕЕЕ,шас постораюсь сделать патч или кейген если что сообщу :)
     
  10. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    2 fromRIDDER
    а как ты узнал что именно на CreateFileA нужно бряк ставить ?
    и что это за функция CreateFileA ?
     
  11. neprovad

    neprovad Elder - Старейшина

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    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; Далее флаги проверяются там сям при работе.
    Ну вот как-то так.
     
  12. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    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 и тоже нечего,как попасть в функцию проверки? где именно ставить мемори бряк?
     
  13. fromRIDDER

    fromRIDDER Member

    Joined:
    2 Aug 2008
    Messages:
    8
    Likes Received:
    5
    Reputations:
    2
    Почему брикпоинт на CreateFileA.
    Функций открытия файла на так уж много, и все они в конечном счёте вызывают CreateFileW. Но если поставить бряк на него, то будет слишком много ложных остановок: функция используется не только для работы с файловой системой. Я всегда ставлю бряк на CreateFileA, а после остановки жму Alt+F9 (OllyDbg), какая бы функция не использовалась, почти всегда попадешь в пользовательский код.

    На что ставить memory breakpoint.
    После нужной остановки на бряке CreateFileA, ставишь бряк на ReadFile (или трейсишь до её использования). Когда остановишься: проверяешь по дескриптору из какого объекта происходит чтение; смотришь в аргументах указатель буфера, в который будет чтение; по какому смещению в объекте. Редко когда обработка прочитанных данных идёт сразу вслед за чтением, поэтому, чтобы не тратить время, ставим memory breakpoint на кусок памяти, куда прочитали. После срабатывания бряка анализируем ситуацию.
     
  14. fromRIDDER

    fromRIDDER Member

    Joined:
    2 Aug 2008
    Messages:
    8
    Likes Received:
    5
    Reputations:
    2
    to neprovad

    Всё не так сложно: сразу же после запуска программы, она создаёт crc файла на жёстком диске, сравнивает с оригинальным, дописанным в конец файла. Всё, больше проверок целостности экзешника нет.
     
    1 person likes this.
  15. cryptX

    cryptX Elder - Старейшина

    Joined:
    2 Sep 2008
    Messages:
    51
    Likes Received:
    1
    Reputations:
    1
    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

    как ставить бряк на буффер ?
    что писать чтоб ставить бряк на мемори ?
    если можно по подробнее,я только учусь
     
  16. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    А по-моему, как раз таки ответ на поставленный вопрос должен быть именно таким)
     
    1 person likes this.
  17. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Folow in dump, адрес, где расположен буфер, а потом уже в окне дампа Breakpoint->Memory on access/write
     
  18. fromRIDDER

    fromRIDDER Member

    Joined:
    2 Aug 2008
    Messages:
    8
    Likes Received:
    5
    Reputations:
    2
  19. patapuff

    patapuff New Member

    Joined:
    27 Mar 2017
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    crc32: EA329640
    Что это?? Можно ли из этого узнать пароль???
     
  20. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Нет, пароль узнать нельзя. Но вместо настоящего пароля, можно подобрать другой, с таким же хэшем. В твоем случае это будет 2E AF CB 44 в шестнадцатеричной системе счисления. Ввести его с клавиатуры не получится, но можно передать программно. Для ввода с клавиатуры можешь использовать пароль cAprB
     
    #20 #colorblind, 28 Mar 2017
    Last edited: 28 Mar 2017
    binarymaster likes this.