Сейчас на форуме: rmn, exp50848 (+7 невидимых)

 eXeL@B —› Основной форум —› StarForce 5.7 MMOG
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 октября 2012 20:14 · Поправил: Once
· Личное сообщение · #1

Есть одна игра - Prime World, которая совсем недавно была защищена с помощью StarForce 5.7 MMOG
Мне нужно научиться обходить защиту или, что ещё лучше, научиться её снимать.
Снятие защиты мне необходимо для поиска багов в игре.
У меня есть старая, не накрытая Старом версия.
Раньше сам exe'шник весил мало и подтягивал все функции из dll, сейчас всё в одном exe.
Сама игра весит 1.7 GB, но я собрал необходимые файлы в архив:
Новая версия (20MB) - http://multi-up.com/780073
Старая версия (12MB) - http://multi-up.com/780089


То что нашел сам:
Файл PW_Game.exe защищён StarForce 5.70.37.002 MMOG
BM вроде нету.
Защитный модуль имеет название sakijapi.dll. В старой версии он имеется, но, похоже, не используется. Упакован UPX, распаковывается легко если надо.
Если запустить PW_Game.exe - появится MessageBox, который говорит, что нужно запустить лаунчер. Это нормально, т.к. PW_Game.exe запускается с набором параментров о сессии, логине, разрешении, и т.д.
Скрыть Olly помогает плагин фантом.
OEP - 00A094DD
В старой версии EP - 00401443
Сдампив на этом OEP без восстановления импорта, можно запустить дамп, но возникает исключение - деление на 0 в модуле защиты по адресу 015FDF57.
Не знаю, нужно ли там восстанавливать импорт?
По адресу 00A092AC происходит вызов Старовской функции, в которой вызывается _initterm_e (в старой версии exe'шника вызов этой функции виден по адресу 00401212), которая и вызывает функцию, в которой происходит исключение.

Не знаю куда дальше двигаться..
Если занопить _initterm_e и следом за ним _initterm, то исключение будет в ntdll
Эти initterm'ы, как я понимаю, вызывают конструкторы классов, используемых в приложении, а может и нет =)




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 09 ноября 2012 07:55 · Поправил: Nightshade
· Личное сообщение · #2

Вм стара выделяет 2 или 3 куска памяти(таблица контекстов и сам контекст). Прилепляем к ехе новую секцию и при вызове VirtualAlloc, правим указатели на свою секцию. В итоге на оеп у нас все память вм в последней секции и все указатели на память вм всегда валидны. Ресурсы крайне редко защищены. Иногда бывает, что ресурсы в 2 разных секциях и надо собрать их в 1.
Такие дампы очень удобны для исследования вм.
CPUID не запатчить так просто. Перед этим надо снять защиту CRC. ВМ стара проверяет овердокуя адресов в вм на валидность. Чаще всего проверки вида (константа xor кусок_кода)=номер регистра в вм.
(кусок кода) xor (кусок кода) xor (кусок кода) xor (константа)= лента пикода вм.
Другой тип проверок, когда получают определенный адрес вм, в цикле складывают dword ы от адреса и ниже. А потом смотрят на сумму и делают прыжок на ошибку, если не сошлось.
Запатчишь небольшой кусок - получишь неверный номер регистра или нарушишь логику работы вм. Cpuid ов в коде от 200-300 до 1000. А теперь прикинь сколько у тебя будет ошибок.
В правильном дампе все проверки патчатся, а потом уже патчатся cpuid, апи и всякие fs[18] и fs[30]



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 09 ноября 2012 08:20 · Поправил: MasterSoft
· Личное сообщение · #3

Pchelovod пишет:
Насколько я помню,она в 90% случаев запакована UPX ,и чтобы загрузить жертву в отладчик с распакованной dll нужно пропатчить проверку контрольной суммы (Старфорс кричит что файл заражен вирусов и типа галактика в опасности)

как патчить я уже писал, ничего там сложного нет, всё даже наоборот, но зачем вообще снимать с неё упх? ну хз, может для удобства...

Nightshade пишет:
Запатчишь небольшой кусок - получишь неверный номер регистра или нарушишь логику работы вм. Cpuid ов в коде от 200-300 до 1000. А теперь прикинь сколько у тебя будет ошибок.

смотря где находиться этот кусок, он говорит про патч сразу после анпака дллки, (а ты смело подумал, что он цпуид уже патчить вздумал) патчицо одна инструкция в PSC_StartInitialization, как правило этого достаточно, чтобы всё работало без ошибок. по поводу патча чего-либо другого - полностью согласен.

Nightshade пишет:
Сам код(не в секции вм который) ничем не защищен и там можно патчить триалы, демы, проверки на упх и прочую ерунду.

+1

Nightshade пишет:
Как сцена вообще пропускает такие релизы?

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




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 09 ноября 2012 08:29 · Поправил: Nightshade
· Личное сообщение · #4

Вм распаковывается для того, чтобы красиво ее потом вырезать и приклеить только вм, без секции кода. Сам код(не в секции вм который) ничем не защищен и там можно патчить триалы, демы, проверки на упх и прочую ерунду.
Про патч я писал Veliant у, который предлагает патч cpuid на другую инструкцию.
В том кряке от скидов, где дамп вм, не запатченны антидампы. Как сцена вообще пропускает такие релизы?



Ранг: 2.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 ноября 2012 14:05 · Поправил: Pchelovod
· Личное сообщение · #5

Nightshade пишет:
CPUID не запатчить так просто. Перед этим надо снять защиту CRC. ВМ стара проверяет овердокуя адресов в вм на валидность

Если у нас дамп с приклеенной памятью,то его работа для ВМ ничем не отличается от запуска игры под эмулятором Daemon Tools с образа. Все адреса ВМ должны быть как в оригинале,иначе у вас даже дамп с привязкой к одному CPU не будет работать. Поэтому не совсем понятен смысл данной фразы




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 09 ноября 2012 14:23
· Личное сообщение · #6

Pchelovod
Имеется ввиду дамп, работающий не только на вашей машине. Правильно подправленный дамп будет запускаться и у других, а для этого надо что-то делать с cpuid. Выше и предложены варианты, что именно надо делать и как.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 2.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 09 ноября 2012 17:52 · Поправил: Pchelovod
· Личное сообщение · #7

ARCHANGEL
Да это уже ежу давно понятно. Он пишет что "ВМ стара проверяет овердокуя адресов в вм на валидность ", а я говорю что ВМ стара и без вашего cpuid проверяет кучу адресов. Иными словами,никакой разницы в работе виртуальной машины нет если это дамп с полностью приклеянной памятью
И вообще не вижу смысла в ваших демагогиях на эту тему: завсегдатаи форума заниматься этим не хотят,кроме Veliant ,а новичкам ваши рассуждения ни к чему.Им нужны мануалы в картинках




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 10 ноября 2012 10:19
· Личное сообщение · #8

Nightshade пишет:
Как сцена вообще пропускает такие релизы?


RIP и уже давненько. Сейчас, как верно заметил MasterSoft, "лишь бы хоть как-то работало". Время чудес, к стати, любой мало-мальски грамотный реверсер может стать королем.



Ранг: 2.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 ноября 2012 18:48
· Личное сообщение · #9

Что делать,если в полученном дампе нет инструкций 0F A2 CPUID?
Трасса в аттаче

0577_10.11.2012_EXELAB.rU.tgz - rtrace.txt



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 10 ноября 2012 20:30 · Поправил: ELF_7719116
· Личное сообщение · #10

Pchelovod пишет:
Что делать,если в полученном дампе нет инструкций 0F A2 CPUID?

Они все в выделенной памяти.

Почитал и стало интересно. VM старфорса толком не исследовал. Поэтому не совсем понимаю, что мешает, как в SecuROM VM полностью перестроить aka выдрать привязку? Там все достаточно просто - CPUID идет на декодирование таблицы "островков"; запретив шифрование на первом островке, выдираем декодер в нем и остальных 254 (их же адреса известны из таблицы). По времени конечно придется посидеть (удобно написать визуализатор) - но ведь работает!

ADD: Или самый быстрый способ с минимальныйми переделками - в дампе, перед первым заходом в VM, сами перекодируем таблицу дельта-смещений с текущим CPUID...PROFIT!



Ранг: 2.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 ноября 2012 20:49 · Поправил: Модератор
· Личное сообщение · #11

Так всё равно ничего не понятно.Кто может поясните на примере,как это сделать.Достаточно 1 адреса, остальные 254 доделаем сами. Вот 3 рабочих дампа разных без фикса cpuid:
http://depositfiles.com/files/51izhm4f2
http://depositfiles.com/files/h9g3x1xxi
http://depositfiles.com/files/swqzr9emb

Рабочих означает что там уже всё что нужно приклеено,пофиксено и восстановлено. Но пашет только на 1 процессоре

Если бы можно было эмулировать CPUID ,то проблема решилась проще.Делаем 1 дамп,пишем лоадер который подсунет дампу вместо реального идентификатора процессора "правильный" и всё работало.
Но как я понимаю сделать это нельзя,потому что значение берется напрямую из железа?



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 10 ноября 2012 21:07
· Личное сообщение · #12

Pchelovod пишет:
Но как я понимаю сделать это нельзя,потому что значение берется напрямую из железа

Ага! CPUID по сути обычная инструкция, поэтому проблема одна - надо знать когда и где она вызывается. Тут два варианта - ставить перед входом в VM свой обработчик и править опкод 0F A2 на 0F 0B (UD2) чтоб получить исключение и подсунуть нужные данные (далеко не факт, что подправим абсолютно все и там где надо - проектор можен шифровать критические участки своего кода) OR заниматься самотрейсингом, проверяя каждую инструкцию на предмет схожести с CPUID... но это слишком медленно.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 10 ноября 2012 21:49
· Личное сообщение · #13

Pchelovod пишет:
Если бы можно было эмулировать CPUID

http://deroko.phearless.org/cpuid_break.rar




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 10 ноября 2012 22:57
· Личное сообщение · #14

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



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 11 ноября 2012 12:10
· Личное сообщение · #15

Nightshade
Каким образом в старфорсе CPUID используется? Что шифруется?




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 11 ноября 2012 17:09
· Личное сообщение · #16

При запуске значения cpuid шифруются. Потом в вм закриптованное значение расшифровывают и сравнивают с текущим. Не совпало - топаем на йух



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 11 ноября 2012 21:13 · Поправил: Veliant
· Личное сообщение · #17

По выложенному выше трейсу где можно распарсил формат команд. Остальные надо смотреть.

Пасс к архиву дефолтный для раздела "скачать" этого ресурса.
f1-f4 - флаги
r1-r3 - регистры
a - адреса
o - опкод
c - константа

5686_11.11.2012_EXELAB.rU.tgz - op_format.zip




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 12 ноября 2012 07:56
· Личное сообщение · #18

а можно пароль в личку?




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 12 ноября 2012 09:49 · Поправил: ClockMan
· Личное сообщение · #19



-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 12 ноября 2012 09:53 · Поправил: Nightshade
· Личное сообщение · #20

я тебя могу обрадовать. Смещения в ленте вм не постоянны и меняются в каждом билде. Такую таблицу декомпиль должен создавать сам. Руками парсить нет смысла.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 12 ноября 2012 11:19
· Личное сообщение · #21

Nightshade пишет:
я тебя могу обрадовать. Смещения в ленте вм не постоянны и меняются в каждом билде. Такую таблицу декомпиль должен создавать сам. Руками парсить нет смысла.

Да вообще-то я в курсе. А тк декомпиля у меня пока нет, то сделал руками. Да и заняло это не так много времени.
Впринципе статически это не так сложно распарсить, можно даже масками.
Все биты читаются reg = dword [edi+20+n]/shr reg, a/and reg, b.
Для начала надо сделать нормальное извлечение кода без левых переходов. В моем представлении надо смотреть последовательно команды и записывать какие флаги они изменяют, потом в случае всяких stc/jc просто отбрасывать ветвления. Тоже самое с cmp esi, 0/cmp edi,0/cmp esp,0.
Остается только как-то определять код вида
Code:
  1. mov reg, const
  2. jmp m1
  3. ...
  4. m1:
  5. cmp reg, const
  6. je good





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 12 ноября 2012 11:56
· Личное сообщение · #22

я сейчас пишу анализатор таких ветвлений. Но извлечение правильного кода, пока не придумал как делать. Во многих обработчиках есть ветвления byte, word, dword, qword.плюс логические операции. Не зная всех шаблонов команд я не пойму ветвление это обработчика или мусор. С обработкой ветвления мусора проще. Там всегда можно вычислить прыжок. Пока хочу дернуть все хендлеры без учета ветвлений самого хэндлера, а потом составить их шаблоны.




Ранг: 154.2 (ветеран), 66thx
Активность: 0.080
Статус: Участник
REVENGE Crew

Создано: 13 ноября 2012 03:31 · Поправил: kioresk
· Личное сообщение · #23

Veliant,

Остается только как-то определять код вида

Code:
  1. mov reg, const
  2. jmp m1
  3. ...
  4. m1:
  5. cmp reg, const
  6. je good


Рекомендую посмотреть связку Mediana в роли дизасма и ntldr'овский x86_64_emu в роли эмулятора.
Такие куски можно сворачивать даже с помощью несложного паттерна:

Code:
  1. i. mov  reg32_1, imm32_1   -> mov reg32, imm32
  2. j. cmp  reg32_1, imm32_2   -> nop
  3. k. jz   imm32_3      -> nop


Код:

Code:
  1. if (CMD_MOV_REG32_IMM32(i) && CMD_CMP_REG32_IMM32(j) && CMD_JZ_IMM32(k) && ARG1_REG32(i) == ARG1_REG32(j)) {
  2.          ...
  3. }


Макросы:

Code:
  1. // mov reg32, imm32
  2. #define CMD_MOV_REG32_IMM32(i) (         \
  3.          (instr[i].id == ID_MOV) &&                        \
  4.          (instr[i].ops[0].flags & OPERAND_TYPE_REG) &&        \
  5.          (instr[i].ops[0].size == OPERAND_SIZE_32)  &&        \
  6.          (instr[i].ops[1].flags & OPERAND_TYPE_IMM) &&        \
  7.          (instr[i].ops[1].size == OPERAND_SIZE_32)   \
  8. )
  9.  
  10. // cmp reg32, imm32
  11. #define CMD_CMP_REG32_IMM32(i) (         \
  12.          (instr[i].id == ID_CMP) &&                        \
  13.          (instr[i].ops[0].flags & OPERAND_TYPE_REG) &&        \
  14.          (instr[i].ops[0].size == OPERAND_SIZE_32)  &&        \
  15.          (instr[i].ops[1].flags & OPERAND_TYPE_IMM) &&        \
  16.          (instr[i].ops[1].size == OPERAND_SIZE_32)   \
  17. )
  18.  
  19. // jz imm32
  20. #define CMD_JZ_IMM32(i) (                    \
  21.          (instr[i].id == ID_JZ)          \
  22. )
  23.  
  24. // arg1 reg32
  25. #define ARG1_REG32(i) (                   \
  26.          (instr[i].ops[0].value.reg.code)     \
  27. )



Эмулятор соответственно подключается когда надо что-то вычислить.

| Сообщение посчитали полезным: Veliant

Ранг: 6.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 ноября 2012 12:37
· Личное сообщение · #24

Добрый день.Не стал создавать новую тему,я так сказать тоже интересуюсь исследованием SF.Опыта у меня пока мало,почитал темы - более менее понятно.Единственный вопрос возник,как найти проверку контрольной суммы у PROTECT.DLL? Нужно пропатчить код:
5B33C0
394D
085F
0F94C0 ЗАМЕНИТЬ НА 33C040 (SETE AL ---> XOR EAX,EAX + INC EAX)
Как найти это место и почему именно его надо патчить?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 14 ноября 2012 15:59
· Личное сообщение · #25

Можно и в других местах пропатчить.
Проверка кода ошибки тут:

Код ошибки выставляется тут:

Так что твой SETE нужно искать где-то чуть выше установки кода ошибки в одном из call'ов



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 14 ноября 2012 17:36
· Личное сообщение · #26

SETE AL? зачем его искать когда всё проще, выше функа, в ней и патчишь. на примере вышеприведённого скрина:

меняешь:
Code:
  1. CALL 02E8655A
- если CRC не совпадает, возвращает код ошибки.
на
Code:
  1. MOV EAX, 0
- реплейсим, процедуру не выполняем (нах лишние телодвижения?), возвращаем 0.
всё.



Ранг: 6.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 15 ноября 2012 10:18
· Личное сообщение · #27

Ещё такой вопрос - установил себе Syser Kernel Debugger последней версии, но он отключает драйвер SPTD из-за несовместимости. Драйвер нужен для эмуляции образа,без него игра не запустится.
Как быть,выходит что ничего другого кроме OllyDbg мы не можем использовать для исследования Стара?




Ранг: 1131.7 (!!!!), 447thx
Активность: 0.670.2
Статус: Участник

Создано: 15 ноября 2012 11:25
· Личное сообщение · #28

В гугле есть информация, как совместить.



Ранг: 6.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 22 ноября 2012 13:11
· Личное сообщение · #29

Накопал тут статью как устранить антидампы в Старфорсе 4.50 Pro
https://svn.exelab.ru/art/?action=view&id=316

Там про секуром,но в SF всё аналогично походу. Может кому пригодится


<< . 1 . 2 .
 eXeL@B —› Основной форум —› StarForce 5.7 MMOG
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати