Написание надстройки для редактора

Добавлен , опубликован
Раздел:
1. Основы
Хорошо, план работы такой:
  • Обратная инженерия - ищем аддресса нужных нам отрезков кода.
  • Пишем программу, которая запускает процесс редактора, и пишет в наш код.
  • Наш код - сплайсинг, он скачет куда либо, откуда загружает dll и передает ей управление, в dll описываем все необходимые функции.
Оборудование:
Бррр, суровые сайты у асм'щиков, не правда ли? ;)
  • SCII актуальной версии
  • SCII beta версии от 0.11.0.15097 до 0.20.0.16036. Именно с ними мог работать PhynGal - будет намного проще анализировать логику работы программ
Минимальные знания:
  • x86-32 языка комманд (желательно уметь в уме интепритировать комманды)
  • Понимание логики работы современных ЭВМ
  • Знакомство с WIN API (достаточно знаний общих принципов работы ядра, справочник также поможет)
Лучшая подборка такого рода материалов на русском языке на wasm.ru.

Поехали

В версиях, с которыми работал я антиотладки не было. Как сейчас обстоят дела - не знаю. Возможно придется бороться и с антиатладкой.
Запускаемся из под Оли.
В редакторе создаем карту. Пишем в нее код с синтаксической ошибкой. Сохраняем карту и наблюдаем кроме всего прочего окно с описанием синтаксической ошибки. Так по крайней мере было в мою молодость :) Закомментируем код, сохраняем - окна нет. Ставим точку остановки на CreateWindow (Ex) .Далее движемся вверх (вниз?) по стеку, ставя точку останова в начале процедуры, которая вызвала процедуру, создавшую окно, и снова сохраняем карту с корректным и с некорректным синтаксисом. Со временем мы найдем точку ветвления, раньше там вызывалась процедура, которая устанавливала EAX в 0 или 1, она и отвечала за проверку синтаксиса. Изменяя значение EAX в данном отрезке кода мы можем заставить редактор "проглатывать" любой код, что бы потом мы могли работать с ним перед упаковкой архива.
SCII редактор карт при сохранении создает временную директори в директории редактируемой карты, в которую кладет все файлы, которые он хочет добавить в архив конечного файла-карты. Устанавливайте точку остановки в вашем отладчике на процедуру CreateFile, насколько я помню, есть отдельная процедура, которая создает временные файлы, и потом вызывается процедура, которая создает архив из переданной ей директории. Именно ее вызов и есть смысл перехватывать.
Опять же, обратная инженерия занятие творческое, и предложил лишь один вариант поиска нужных аддрессов, Вы возможно будет приходить к этому другими путями. Хотя использовать вызовы известных WIN API действительно удобно.
Хорошо, мы знаем аддресса, куда что писать, можно начинать писать рабочую программу. Но для начала я предлагаю в Оле немного переправить код редактора и сохранить отдельным файлом - если в редактор не проверяет свои исполняемые файлы мы сможем легко отладить наши изменения.

Едем дальше

Я использовал таблицу аддрессов, т.к. код постоянно меняется, стоит добавить где то одну строчку, и при перекомпиляции весь код сместится, хотя по сути никаких изменений в интересующих нас модулях не будет. В PhynGal Вы можете видеть файл address.asm, в котором перечислены все аддресса для всех версий, при запуске программа определяла версию редактора и использовала необходимые аддресса. Используйте связку GetFileVersionInfoW и VerQueryValueW для этого. Далее я просто switch конструкцией выбирал нужные аддресса.
Я не буду рассматривать поиск исполняемого файла редактора, можно искать его через реестр, можно пытаться обнаружить его в current directory нашей программы, можно использовать *.cfg файлы, в которых пользователь сам укажет его явно.
Зовем CreateProcess и в аргументе dwCreationFlags передаем CREATE_SUSPENDED, это создаст процесс, но не запустит его, мы сможем немного над ним поработать. Я также с помощью VirtualAllocEx выделял память для него, что бы можно было спокойно писаться в нее.
Я думаю, вы понимаете разницу в операндах асм инструкции call, обычный вызов библиотечной функции это по сути call dword [x], где x - аддресс памяти из таблицы импорта, в которой находится реальный аддресс процедуры, и есть call x, и тут уже x - реальный аддресс процедуры, может быть задан непосредтсвоенно в коде или в регистре, это используется как правило при вызове своих процедур. Так вот, оказавшись в чужом коде нам не удобно пользоваться его таблицей импорта. Поэтому я в встраиваемом коде писал нечто подобное:
;; это в коде, которых пишется в выделенную
;; для процесса редактора память

;;----------------
;; import
_xFixFunc_00	=		$ - _xInjCodeStr ;; метка используется для аддрессной арифметики
_pLoadLibraryW		dd	?

_xFixFunc_01	=		$ - _xInjCodeStr ;; метка используется для аддрессной арифметики
_pGetProcAddress	dd	?

;; а это - в начале работы программы

mov	edi,				[LoadLibraryW]
mov	[_pLoadLibraryW],		edi
mov	edi,				[GetProcAddress]
mov	[_pGetProcAddress],		edi
Мы просто берем аддресса процедур из нашей таблицы испорта, и пишем ее в код, который будет записан в память процесса редактора. Ах да, для таких фокусов наша секция данных должна быть readable writeable executable.
Еще раз - у меня в файле phynGalSC2.asm по сути две программы описаны, основная программа, которая запускает редактор, пишет в его память, и та, которая пишется в память редактора, она начинается с метки xInjCodeStr и заканчивыается меткой xInjCodeEnd.
У меня далее идет очень хитрая корректировка аддрессов, я вычисляю смещения, в целом это дикое колдунство, и я не имею малейшего преставления, как его описать словами человеков. Просто поймите это. added: Попытался описать, вышла такая хрень :( Разбирайтесь сами с этой магией.
Когда аддресса скоректированы - используйте WriteProcessMemory и пишите с его помощью нужные Вам данный в код редактора, причем надо писать немного кода для сплайсинга, который передаст управление коду, который выполнит наши грязные дела и вернет управление основному коду, да так, что тот и не заметит подвоха. Потом ResumeThread - редактор полетел. Завершаем работу нашей программы. Все.
`
ОЖИДАНИЕ РЕКЛАМЫ...
3 комментария удалено
0
37
12 лет назад
0
Найс, это пригодится.
1
18
12 лет назад
1
Антиотладка есть, редактор просто крашится при попытке открытия его через дебагер или аттача к процессу.
антиотладчик встроен в battle.net.dll, а с не которого патча редактор требует постоянного подключения к инету, это осложняет сильно задачу
0
33
12 лет назад
0
Уф, черт. Это сильно затрудняет задачу. Впрочем после взлома антиотладки - все делать по описанной выше инструкции. Даже интересно стало посмотреть...
Кстати, а редактор текущий сильно отличается от редактора из беты?
0
37
12 лет назад
0
NCrashed, а что если эмулировать пакеты?
0
33
12 лет назад
0
Нет, скорпи, там явно же они зашифрованы и что то передают. Легче тогда уже вызовы в эту длл перехватывать.
Еще может прокатить такой вариант - достать все-таки бету версию и текущую и анализировать статически, тем более, что для беты известны нудные аддресса.
0
37
12 лет назад
0
Зашифрованы то они могут быть для логина например, а что если залогиниться, но потом уже "поддерживать подключение" искусственно?
0
18
12 лет назад
0
Я был неточен, логин в баттлнет нужен только 1 раз, после этого можно в оффлайн работать. Проблему составляет именно антиотладка, я не шибко опытен в борьбе с ней.
0
33
12 лет назад
0
Насчет логина - я помню в последней бете я делал нечто подобное. Там был хак, который позволял толи игру запускать без лога, толи не помню. И помню, что тогда это ломалось ну очень просто.
Кстати, антиотладка не мешает (по идее не должна мешать) работе программы, т.е. если найти аддресса статическим анализатором и быть уверенным, что они не меняли алгоритм обработки - все прокатит.
Короче мы снова пришли к тому, что нужна бета 0.20.*.*, я кстати на торрентах видел полудохлые раздачи беты 0.4.*.*, интересно, они будут обновляться?
0
37
12 лет назад
0
Не знаю, у кого ее достать
0
33
12 лет назад
0
Я попробую связаться с NCrashed, думаю можно обсудить некоторые варианты.
0
25
11 лет назад
0
В инете нашел версию 1.5.3 которая не требует подключентя к инету. Для анализа вам самое оно.
Пишите если ва интересно.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.