safedisc 3

Тема в разделе "WASM.RESEARCH", создана пользователем rddvl, 21 окт 2004.

  1. rddvl

    rddvl New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    5
    Адрес:
    Ульяновск
    У меня такой вот вопрос: я ломаю exe call of duty (safedisc3), но у меня нет оригинального диска с файлом 00000001.tmp, содержащим ключ для распаковки программы. Так вот можно ли распаковать exe с помощью 00000001.tmp от doom3?(в нем тоже safedisc3). Или ключи распаковки для всех игр разные?
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Ключи разные, но ходят упорные слухи что можно снять и без диска, т.е. ключ как-то можно забрутфорсить за приемлимое время.
     
  3. rddvl

    rddvl New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    5
    Адрес:
    Ульяновск
    Как это забрутфорсить? Там ведь ключ из 38 байт?..
     
  4. FEUERRADER

    FEUERRADER New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    23
    Адрес:
    Russia
    rddvl

    А вот тоже ломаю щас SafeDisc 3.20.

    Олии чует за версту. Никакие плагины не спасают (в том числе HideDebugger 1.2).
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    FEUERRADER

    > Никакие плагины не спасают (в том числе HideDebugger 1.2)



    И не спасут, может там антитрейс.

    Ещё нужно пропатчить в самом OllyDbg.exe класс окна.

    Вообще Olly не правильно с плагинами работает, плагины нужно грузить до создания главного окна, тогда можно и класс окна в рантайме патчить будет.



    > А вот тоже ломаю щас SafeDisc 3.20.



    Если это игра(OpenGL, Direct 3D) full screen mode, то отладчик ring-3 тебе вообще не поможет.
     
  6. rddvl

    rddvl New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    5
    Адрес:
    Ульяновск
    Защиту от отладчика я благополучно обезвредил одним только Olly, не скажу, что раз плюнуть, но и не так уж сложно. Основная сложность в этом самом ключе. Вот если бы достать где-нибудь 00000001.tmp с лицензионного диска...

    FEUERRADER

    А можно поинтересоваться, какую именно игру ты ломаешь? Может чем поможем друг другу?
     
  7. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    Asterix

    > И не спасут, может там антитрейс.

    не факт... я тут пакер один распаковывал, дык вот в нём для антиотладки используются SetUnhandledExceptionFilter (защита - патч UnhandledExceptionFilter) и CheckRemoteDebuggerPresent (защита - патч самой этой апи, чтоб она всегда 0 возвращала). Допиши плз их в свой плагин, а то как-то лениво вручную при каждом запуске патчить, хотя можно конечно скрипт для пачта написать, но его всё-равно запускать надо, а плагин сразу "автоматом" патчит... =)
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Mario555

    > я тут пакер один распаковывал



    Что за пакер? Колись, нужно ж на чем то тестить :derisive:



    > в нём для антиотладки используются SetUnhandledExceptionFilter (защита - патч UnhandledExceptionFilter)



    Тут у меня пробел в знаниях, зачем нужны эти функции, не нанесу ли я вред приложению запатчив. Вобщем без понимания смысла я не врубаюсь как корректно запатчить. Кажется кстати IceExt тоже их патчит??



    > CheckRemoteDebuggerPresent



    Это вообще какая-то новая API, в моей борландовской справке такой даже нету, нужно в msdn топать смотреть..
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Mario555

    Так, просветился я уже насчет UnhandledExceptionFilter у Рихтера, но не понял что ты хочешь там пропатчить?



    А насчет CheckRemoteDebuggerPresent, дык вобще не актуально, она имеется только в OS >= XP(Sp1), у меня таких нет :derisive:
     
  10. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    Asterix

    > Что за пакер? Колись, нужно ж на чем то тестить :derisive:

    Обсидиум 1.2, правда там из нового, по сравнению с 1.1, только вот эта антиотладка и есть =)



    > но не понял что ты хочешь там пропатчить?

    если использовать SetUnhandledExceptionFilter, то при наличие отладчика управление на Unhandled исключение передаётся ему, а без отладчика управление передаётся функции обработчика адрес которого задан через SetUnhandledExceptionFilter. Сама эта апи у меня выглядит так:
    Код (Text):
    1. 77E7E5A1 MOV ECX,DWORD PTR [ESP+4]
    2. 77E7E5A5  MOV EAX,DWORD PTR [77ED73B4]
    3. 77E7E5AA  MOV DWORD PTR [77ED73B4],ECX
    4. 77E7E5B0  RETN 4


    адрес обработчика записывается в 77ED73B4, а в UnhandledExceptionFilter есть такое:
    Код (Text):
    1. 77E93101  CALL DWORD PTR [<&ntdll.NtQueryInformationProcess>]
    2. 77E93107  TEST EAX,EAX
    3. 77E93109  JL SHORT kernel32.77E93114
    4. 77E9310B  CMP DWORD PTR [EBP-20],ESI
    5. 77E9310E  JNZ kernel32.77E937D9 // тут прыгаем, если под отладчиком
    6. 77E93114  MOV EAX,DWORD PTR [77ED73B4] // ! адрес обработчика
    7. 77E93119  CMP EAX,ESI
    8. 77E9311B  JE SHORT kernel32.77E93132
    9. 77E9311D  PUSH EDI
    10. 77E9311E  CALL EAX // к обработчику


    тоесть если условный переход по адресу 77E93109 поменять на безусловный, то и под отладчиком управление будет передаваться на заданный прогой обработчик.

    PS кста оказывается есть уже плагин к оле, который подобным образом (нопит переход по адресу 77E9310E) патчит UnhandledExceptionFilter.



    > А насчет CheckRemoteDebuggerPresent, дык вобще не актуально

    ещё как актуально... ибо OS >= XP(Sp1) - очень распостранены =)
     
  11. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    И ещё, насколько я понял, в обеих этих апи (UnhandledExceptionFilter и CheckRemoteDebuggerPresent) проверка на наличие отладчика сводится к вызову ZwQueryInformationProcess с параметрами:

    |hProcess = FFFFFFFF

    |InfoClass = 7

    |Buffer = XXXXXXXX

    |Bufsize = 4

    \pReqsize = NULL
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Так, теперь понятна суть проблемы, но патчить(nop'ить) переходы думаю нужно в последнюю очередь, только если нельзя решить проблему "изящными" методами, гораздо интереснее узнать откуда функция UnhandledExceptionFilter берёт инфу о том что процесс под отладчиком, судя по приведённому тобой коду она вызывает NtQueryInformationProcess, далее хотелось бы проследить куда эта функция лезет за информацией и какие там права доступа на чтение/запись, если раскопаешь было бы неплохо, я сейчас качну этот обсидиум :derisive:



    > ибо OS >= XP(Sp1) - очень распостранены =)



    Всё равно актуальность сомнительна, ибо в наше время любой может себе позволить иметь установленными 2-3 OS, у меня 3-и =)
     
  13. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    Asterix

    > далее хотелось бы проследить куда эта функция лезет за информацией

    дык в ринг0 лезет... куда ж ещё =) Но вот пропатчить её вызов наверно можно. Посмотри в своих 3-х осях - какие параметры передаются ZwQueryInformationProcess, если так же hProcess = FFFFFFFF и InfoClass = 7, то тут:
    Код (Text):
    1. 77F76035   >MOV EAX,9A
    2. 77F7603A    >MOV EDX,7FFE0300
    3. 77F7603F    >CALL EDX
    4. 77F76041    >RETN 14


    ставим "jmp свой код", в котором проверяются эти параметры , и если совпали, то в переменную которая XXXXXXXX (Buffer) кладём 0 и выход из функции, если параметры вызова не совпали, то пусть себе лезет в ринг0.
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > InfoClass = 7



    Это InfoClass = ProcessDebugPort

    естественно во всех NT эта функция в этом месте вызывается с InfoClass = 7 (ProcessDebugPort)



    > ставим "jmp свой код"



    Я знаю как патчить :derisive:

    Нехорошо это, очень грубо.



    > дык в ринг0 лезет... куда ж ещё =)



    Я имел ввиду что за инфой она наверняка полезет в какую-нибудь недокументированную или слабо документированную структуру, задача - узнать в какую :derisive:



    > и если совпали, то в переменную которая XXXXXXXX (Buffer) кладём 0



    Лучше InfoClass подменить, пусть проверяет что-нить другое с заведомо предсказуемым возвращаемым значением :derisive:
     
  15. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    а, не, глючу =) кроме как в [Buffer] класть ноль, нужно ещё регистры eax, ecx, edx изменять...
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Mario555

    > а, не, глючу =) кроме как в [Buffer] класть ноль, нужно ещё регистры eax, ecx, edx изменять...



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

    А регистры трогать не нужно :derisive:
     
  17. Mario555

    Mario555 New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2004
    Сообщения:
    21
    Ну я так делал (тоесть не давал выполнятся функции) и всё работало... Хотя конечно может это и не правильно :)

    > после подмены необходимых значений на стеке нужно дать отработать оригинальной функции

    это уже способ реализации... можно подменять InfoClass (если ты нашёл подходящий) до апи, можно класть ноль в [Buffer] и т.п. после апи, можно не выполнять апи в случае InfoClass=7 (ну у меня же так сработало :) ). А реализация - дело программера, я только про эти апи сказал, и про способ проверок в них... о реализации мне с тобой спорить нет смысла, ибо в этом ты лучше разбираешься.

    PS а структура из которой ZwQueryInformationProcess берёт инфу наверно тоже в ринг0 лежит...
     
  18. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    а структура из которой ZwQueryInformationProcess берёт инфу наверно тоже в ринг0 лежит...



    Ага. EPROCESS называется.
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

    > Ага. EPROCESS называется.



    Диагноз ясен, придётся патчить код API.. т.к. струтура эта ещё и различна для разных OS.
     
  20. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    М-м-м, хочешь, наброски третьей части упаковщиков вышлю. Там как раз это описывается...