У меня такой вот вопрос: я ломаю exe call of duty (safedisc3), но у меня нет оригинального диска с файлом 00000001.tmp, содержащим ключ для распаковки программы. Так вот можно ли распаковать exe с помощью 00000001.tmp от doom3?(в нем тоже safedisc3). Или ключи распаковки для всех игр разные?
Ключи разные, но ходят упорные слухи что можно снять и без диска, т.е. ключ как-то можно забрутфорсить за приемлимое время.
rddvl А вот тоже ломаю щас SafeDisc 3.20. Олии чует за версту. Никакие плагины не спасают (в том числе HideDebugger 1.2).
FEUERRADER > Никакие плагины не спасают (в том числе HideDebugger 1.2) И не спасут, может там антитрейс. Ещё нужно пропатчить в самом OllyDbg.exe класс окна. Вообще Olly не правильно с плагинами работает, плагины нужно грузить до создания главного окна, тогда можно и класс окна в рантайме патчить будет. > А вот тоже ломаю щас SafeDisc 3.20. Если это игра(OpenGL, Direct 3D) full screen mode, то отладчик ring-3 тебе вообще не поможет.
Защиту от отладчика я благополучно обезвредил одним только Olly, не скажу, что раз плюнуть, но и не так уж сложно. Основная сложность в этом самом ключе. Вот если бы достать где-нибудь 00000001.tmp с лицензионного диска... FEUERRADER А можно поинтересоваться, какую именно игру ты ломаешь? Может чем поможем друг другу?
Asterix > И не спасут, может там антитрейс. не факт... я тут пакер один распаковывал, дык вот в нём для антиотладки используются SetUnhandledExceptionFilter (защита - патч UnhandledExceptionFilter) и CheckRemoteDebuggerPresent (защита - патч самой этой апи, чтоб она всегда 0 возвращала). Допиши плз их в свой плагин, а то как-то лениво вручную при каждом запуске патчить, хотя можно конечно скрипт для пачта написать, но его всё-равно запускать надо, а плагин сразу "автоматом" патчит... =)
Mario555 > я тут пакер один распаковывал Что за пакер? Колись, нужно ж на чем то тестить > в нём для антиотладки используются SetUnhandledExceptionFilter (защита - патч UnhandledExceptionFilter) Тут у меня пробел в знаниях, зачем нужны эти функции, не нанесу ли я вред приложению запатчив. Вобщем без понимания смысла я не врубаюсь как корректно запатчить. Кажется кстати IceExt тоже их патчит?? > CheckRemoteDebuggerPresent Это вообще какая-то новая API, в моей борландовской справке такой даже нету, нужно в msdn топать смотреть..
Mario555 Так, просветился я уже насчет UnhandledExceptionFilter у Рихтера, но не понял что ты хочешь там пропатчить? А насчет CheckRemoteDebuggerPresent, дык вобще не актуально, она имеется только в OS >= XP(Sp1), у меня таких нет
Asterix > Что за пакер? Колись, нужно ж на чем то тестить Обсидиум 1.2, правда там из нового, по сравнению с 1.1, только вот эта антиотладка и есть =) > но не понял что ты хочешь там пропатчить? если использовать SetUnhandledExceptionFilter, то при наличие отладчика управление на Unhandled исключение передаётся ему, а без отладчика управление передаётся функции обработчика адрес которого задан через SetUnhandledExceptionFilter. Сама эта апи у меня выглядит так: Код (Text): 77E7E5A1 MOV ECX,DWORD PTR [ESP+4] 77E7E5A5 MOV EAX,DWORD PTR [77ED73B4] 77E7E5AA MOV DWORD PTR [77ED73B4],ECX 77E7E5B0 RETN 4 адрес обработчика записывается в 77ED73B4, а в UnhandledExceptionFilter есть такое: Код (Text): 77E93101 CALL DWORD PTR [<&ntdll.NtQueryInformationProcess>] 77E93107 TEST EAX,EAX 77E93109 JL SHORT kernel32.77E93114 77E9310B CMP DWORD PTR [EBP-20],ESI 77E9310E JNZ kernel32.77E937D9 // тут прыгаем, если под отладчиком 77E93114 MOV EAX,DWORD PTR [77ED73B4] // ! адрес обработчика 77E93119 CMP EAX,ESI 77E9311B JE SHORT kernel32.77E93132 77E9311D PUSH EDI 77E9311E CALL EAX // к обработчику тоесть если условный переход по адресу 77E93109 поменять на безусловный, то и под отладчиком управление будет передаваться на заданный прогой обработчик. PS кста оказывается есть уже плагин к оле, который подобным образом (нопит переход по адресу 77E9310E) патчит UnhandledExceptionFilter. > А насчет CheckRemoteDebuggerPresent, дык вобще не актуально ещё как актуально... ибо OS >= XP(Sp1) - очень распостранены =)
И ещё, насколько я понял, в обеих этих апи (UnhandledExceptionFilter и CheckRemoteDebuggerPresent) проверка на наличие отладчика сводится к вызову ZwQueryInformationProcess с параметрами: |hProcess = FFFFFFFF |InfoClass = 7 |Buffer = XXXXXXXX |Bufsize = 4 \pReqsize = NULL
Так, теперь понятна суть проблемы, но патчить(nop'ить) переходы думаю нужно в последнюю очередь, только если нельзя решить проблему "изящными" методами, гораздо интереснее узнать откуда функция UnhandledExceptionFilter берёт инфу о том что процесс под отладчиком, судя по приведённому тобой коду она вызывает NtQueryInformationProcess, далее хотелось бы проследить куда эта функция лезет за информацией и какие там права доступа на чтение/запись, если раскопаешь было бы неплохо, я сейчас качну этот обсидиум > ибо OS >= XP(Sp1) - очень распостранены =) Всё равно актуальность сомнительна, ибо в наше время любой может себе позволить иметь установленными 2-3 OS, у меня 3-и =)
Asterix > далее хотелось бы проследить куда эта функция лезет за информацией дык в ринг0 лезет... куда ж ещё =) Но вот пропатчить её вызов наверно можно. Посмотри в своих 3-х осях - какие параметры передаются ZwQueryInformationProcess, если так же hProcess = FFFFFFFF и InfoClass = 7, то тут: Код (Text): 77F76035 >MOV EAX,9A 77F7603A >MOV EDX,7FFE0300 77F7603F >CALL EDX 77F76041 >RETN 14 ставим "jmp свой код", в котором проверяются эти параметры , и если совпали, то в переменную которая XXXXXXXX (Buffer) кладём 0 и выход из функции, если параметры вызова не совпали, то пусть себе лезет в ринг0.
> InfoClass = 7 Это InfoClass = ProcessDebugPort естественно во всех NT эта функция в этом месте вызывается с InfoClass = 7 (ProcessDebugPort) > ставим "jmp свой код" Я знаю как патчить Нехорошо это, очень грубо. > дык в ринг0 лезет... куда ж ещё =) Я имел ввиду что за инфой она наверняка полезет в какую-нибудь недокументированную или слабо документированную структуру, задача - узнать в какую > и если совпали, то в переменную которая XXXXXXXX (Buffer) кладём 0 Лучше InfoClass подменить, пусть проверяет что-нить другое с заведомо предсказуемым возвращаемым значением
Mario555 > а, не, глючу =) кроме как в [Buffer] класть ноль, нужно ещё регистры eax, ecx, edx изменять... Ну вообще-то после подмены необходимых значений на стеке нужно дать отработать оригинальной функции, а для этого нужно весь ее код сохранить и передать на него управление. А регистры трогать не нужно
Ну я так делал (тоесть не давал выполнятся функции) и всё работало... Хотя конечно может это и не правильно > после подмены необходимых значений на стеке нужно дать отработать оригинальной функции это уже способ реализации... можно подменять InfoClass (если ты нашёл подходящий) до апи, можно класть ноль в [Buffer] и т.п. после апи, можно не выполнять апи в случае InfoClass=7 (ну у меня же так сработало ). А реализация - дело программера, я только про эти апи сказал, и про способ проверок в них... о реализации мне с тобой спорить нет смысла, ибо в этом ты лучше разбираешься. PS а структура из которой ZwQueryInformationProcess берёт инфу наверно тоже в ринг0 лежит...
а структура из которой ZwQueryInformationProcess берёт инфу наверно тоже в ринг0 лежит... Ага. EPROCESS называется.
volodya > Ага. EPROCESS называется. Диагноз ясен, придётся патчить код API.. т.к. струтура эта ещё и различна для разных OS.