Реверсинг. Задай вопрос - получи ответ

Discussion in 'Реверсинг' started by 0x0c0de, 2 Sep 2007.

  1. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Проблема с BinDiff
    Запускаю IDA, запускаю плагин, выбираю вторую базу. Запускается скрыто второй процесс IDA и начинает потихоньку кушать память. Доедает до 2 с лихим Гб
    Потом выдает abnormal program termination и как результат - отсутствие какого либо результата :(
    Самое что печальное что об этом прямо сказано в readme - мол большие базы сравнивать не буду. Как быть? Чем пользоваться в такой ситуации
     
  2. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Скачал последний PEExplorer, cкачал русификатор. После русификации в папке с прогой появился файл pexplorer.Rus. Прога не только оказалась не русифицирована, но и стала выдавать: "Runtime error 101 at 001B9496" и отказалась запускаться( после удаления pexplorer.Rus прога запускается и работает) . Тогда засунул EXE в PEiD, он сказал: "Borland Delphi 3.0 [Overlay]". Засунул EXE в Restorator все ресурсы видны, их можно править и сохранить. Но при запуске прога снова ругается: "Runtime error 101 at 001B9496". Это привело меня к мысли что в проге стоит проверка контрольной суммы.

    Хотелось бы в краткой форме понять как с этим бороться. Дайте краткую инструкцию к действию как находить проверки в коде. Какие инструменты подойдут, как их применить. Поскольку я только начинающий, хочется разобраться в вопросе и научиться преодолевать подобные трудности в дальнейшем. Заранее спасибо!
     
  3. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Если программа сообщает что она повреждена, то это одно, а Runtime error это уже другое, а именно - указывает на то что русификация прошла криво и какая-то из функций по работе с памятью или строками дает сбой, пытаясь прочитать или как-то обработать поврежденные ресурсы. Такой вариант кажется самым правдоподобным.
    В любом случае, отладчик никто не отменял - запускаешь под ним программу и ждешь появления Exception'a

    Delphi help
     
    #163 neprovad, 19 Aug 2008
    Last edited: 19 Aug 2008
  4. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Нет точно проверка CRC! Засунул EXE в Restorator все ресурсы видны, их можно править и сохранить (для эксперемента исправил всего одну букву в Меню). Но при запуске прога снова ругается: "Runtime error 101 at 001B9496". Это привело меня к мысли что в проге стоит проверка контрольной суммы.

    Пробывал подняться назад по коду от сообщения об ошибке, но почемуто не получается подняться более чем на 4-5 уровня. Скорее всего проверок несколько! Как можно узнать сразу все адреса предпологаемых проверок? Спасибо.
     
  5. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    4-5 уровня это уже далековато занесло. Выложи свой модифицированный файл, гляну что там.
     
  6. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Вот несколько ссылок:

    http://soft.softodrom.ru/scr/get.php?id=3013
    http://www.newestsoft.com/cat42_532.html
     
  7. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Code:
    CODE:00562F13                 call    sub_49D52C
    CODE:00562F18                 test    al, al
    CODE:00562F1A                 jnz     short loc_562F53
    ....
    ....
    CODE:00562F33                 jnz     short loc_562F53
    ....
    CODE:00562F4C                 call    @@LStrCmp
    CODE:00562F51                 jz      short loc_562F66
    
    loc_562F53:
    CODE:00562F53                 xor     ecx, ecx
    CODE:00562F55                 mov     dl, 1
    CODE:00562F57                 mov     eax, off_406468
    CODE:00562F5C                 call    sub_409F44
    CODE:00562F61                 call    @@RaiseExcept
    
    Проверка цифровой подписи файла. RaiseExcept - как раз сообщение то самое. Запатчить не составит труда.
     
  8. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Спасибо neprovad ! Исправил код
     
  9. Martyr

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

    Joined:
    29 Jun 2008
    Messages:
    33
    Likes Received:
    7
    Reputations:
    0
    Контрольная сумма-это простой способ проверки целостности данных,суть которого состоит в том , что контрольная сумма- это некоторое значение,рассчитанное путем сложения всех входных данных.
    Sum=Data % ([MAX_VAL]+1)
    Data-итоговая сумма, рассчитанная по входным данным, и MaxVal - максимально допустимое значение контрольной суммы, заданное заранее.
    Если использовать алгоритмы хэширования вместе с криптосистемами, с ключом общего пользования, то можно создать цифровую подпись, практически как человеческая подпись.Криптосистема и ключ общего пользования-составляют в сумме, метод позволяющий кодировать и декодировать данные с помощью двух ключей:общего использования и личного.
     
  10. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    В данном случае различия нет. Идет проверка на то изменен ли файл или нет, а что используется - цифровая подпись или контрольная сумма не столь важно.

    - Обычную контрольную сумму можно посчитать самостоятельно и подменить
    - Цифровая подпись сложнее и банальной подделке не поддается (насколько я знаю)
     
  11. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Я всё правильно сделал? Расскажи пожалуйста как ты нашёл код проверки (как ты обычно это делаешь, алгоритм действий) Спасибо
     
  12. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Точка останова на функцию вывода сообщения, несколько возвратов по ret и вот мы и на месте. А вообще если на лету не понятно как работает, используй IDA и применяй сигнатуры, сразу станет все понятно.
     
  13. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Как я понял такойже подход и к контрольной сумме. Выскакивает сообщение об ошибке, начинаем обратную трассировку до места падения проги. Правильно ли я понимаю? neprovad скажи я правильно подпатчил код? А то я сомневаюсь. Можно ещё один вопрос? Начал читать про инлайн патчинг. Как я понял Патч происходит в памяти, скажем когда распаковщик отработал, передал управление на OEP, адрес ОЕР подменяется Jamp*ом на наш код. После того как он отработал, возврашаем управление проге. Вопрос: Сначала в отладчике надо узнать адреса которые надо патчить? И еще, гдето прочёл в одном из топиков что если Если проверок много то применяют инлайн патчинг? Но у меня возник вопрос: Что если в коде есть проверка контрольной суммы всего файла? Инлайн в пролёте? Или как вариант приидётся писать отдельную прогу и патчить когда подопытная прога полностью распаковалась ? Или всётаки можно вклиниться между упаковщиком и прогой?
     
  14. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    - Можно было заменой одного байта обойтись :)
    - Конечно, узнать адреса необходимо до начала инлайн патчинга
    - Раз на раз не приходится, вопрос в трате времени (быстрее снять защиту совсем или нейтрализовать инлайном)
    - Если есть проверка, она находится и нейтрализуется, либо ей (проверке) подсовывают оригинальные значения. Опять же смотря как она вызывается (одно дело по таймеру периодично, другое дело один раз при запуске программы). Каждый случай обычно требует своего подхода, вернее его всегда можно найти. Пожалуй так.
     
  15. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Что это за Thinstall Setup Capture как и чем можно его снять, распаковать. Перерыл все, вразумительного ответа не нашел.
     
  16. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Так проверь чем упаковано! Использование PeID, RDG Packer Detector никто не отменял.
     
  17. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    PEiD v0.94 говорит UPolyX v0.5 [Overlay] *
    xeinfo PE - Thinstall VS 3.0.x -> Jitit Software
    RDG Packer Detector говорит Delphi
    FlexHEX в начале файла есть вот что:


    Boot loader for Thinstalled packages FileVersion 3.349
    InternalName boot_loader_exe. LegalCopyright 2005-2007. Thinstall boot_loader_exe.exe ProductName Thinstall ProductVersion 3.349
     
  18. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Ну вот, самое время самостоятельно разобраться как оно все работает.
    Бряк на CreateFileA попробуй и жди выгрузки.
     
    1 person likes this.
  19. tekton

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

    Joined:
    2 Jun 2008
    Messages:
    73
    Likes Received:
    3
    Reputations:
    0
    Ок ща попробую! От функции надо в обратном направлении трасировать или дальше по коду ?
     
  20. neprovad

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

    Joined:
    19 Oct 2007
    Messages:
    899
    Likes Received:
    274
    Reputations:
    59
    Поясняю свою мысль насчет CreateFileA. Почему я выбрал именно её?
    Thinstall известен тем что виртуализирует, помещая в песочницу "sandbox" выполняемый процесс, при этом контролируя все его попытки работы с файловой системой.
    Так вот, ставим бряк на CreateFileA, ждем срабатывания, смотрим на имя открываемого\создаваемого файла и делаем вывод - как относится данный файл к работе подопытного приложения. Если кажется что файл нужен нам, запоминаем путь, ставим бряк на CloseHandle и ждем срабатывания (по логике после CreateFileA вызовется WriteFile а затем CloseHandle). После этого можно ныжный нам файл скопировать и делать с ним что угодно.
    Для удобства понимания работы рекомендую использовать WinApiOverride (см. в разделе инструменты)