#1 28-04-2010 18:50

~AquaZ~
Registered: 01-03-2010
Posts: 726

Как дебажить?

Вот у меня есть Ида и знание основ Асма, как мне пускануть игру? При нажатии F9 меня обсыпает исключениями, а потом появляется радостное окно StreamMemoryFix и говорит, что эта версия игры не поддерживается...

Offline

#2 28-04-2010 19:35

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Как дебажить?

Запускть из-под администратора.

А вообще, пользоваться отладчиком - непродуктивно. Если есть понимание, как оно работает - отладчик только мешает. Если нет - помогает очень слабо. gta_dll была сделана вообще без отладчика.

Я, обычно, если надо посмотреть что-то "в процессе", просто врезаю свою функцию, которая печатает то, что нужно и в нужном виде.


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#3 28-04-2010 20:50

Alien
Registered: 12-10-2008
Posts: 564

Re: Как дебажить?

Скажу несколько вещей по своему малому опыту (и потому, возможно, это будут более полезные вещи для такого же новичка).

1) Особенно это касается дебега игры, работающей в полноэкранном режиме. Поставишь break - все зависнет. Возврат на рабочий стол только путем убивания процесса. Поставишь trace - малоинформативно. Как уже было сказано, ведение лога - оптимальный вариант.
2) Примеры inject'ов есть в listener'овском gta_dll. Вклиниваемся в интересующее нас место при помощи injectFunction, выводим все что нужно. Если место не очень удачное (требуется выравнивание стека, восстановление значений регистров - короче то, что требует использования асмовставок), то лучше воспользоваться спецификатором __declspec(naked). Он отрубает у функции пролог и эпилог (в прологе резервируется место под локальные переменные, сохраняются в стеке значения регистров, в эпилоге все это восстанавливается и выполняется выход из функции). Тогда можно будет вернуть все на место руками. Но при этом теряется возможность объявлять локальные переменные. Я обхожу это ограничение объявлением таких переменных как static.
3) По-моему отладчики нужны только для нахождения OEP упакованных программ и снятия дампа. Наблюдение за постоянно изменяющейся картиной начинает подбешивать через пару секунд методичного тыканья в кнопку F7.
4) Чтобы понять принцип работы программы, гораздо удобнее загрузить ее в дизассемблер и спокойно проанализировать. Если анализируется своя программа, то можно выполнить экспорт символов в PDB формате. Этот файл будет загружен вместе с базой в иду и вместо dword_xxxx будут видны настоящие имена переменных и функций.

Offline

#4 28-04-2010 20:51

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Как дебажить?

Хм, вот как мне отловить вызов процедуры, сводящей поезд с рельс?

Offline

#5 28-04-2010 21:50

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Как дебажить?

@Alien - Касательно п.2. К счастью, таких функций в SA нет. Там практически все можно делать без ассемблера (максимум, методы нужно объявлять как __thiscall). Вот в IV весьма интенсивно используется кодогенерация линкером (и параметры в регистрах, притом произвольных; и регистры не сохраняются сверх необходимого).

@~AquaZ~ - Ловить проверку скорости в CTrain::processControl. Отладчиком это точно не поймаешь
UPD: Насколько я посмотрел, это младший бит CTrain::m_bWreckedFlags (+0x5B9)
Нужно смотреть, где он выставляется. (поведение любого entity обрабатывается в processControl. Но искать нужное место в функции на 8..12К - то еще занятие)


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#6 29-04-2010 00:03

Alien
Registered: 12-10-2008
Posts: 564

Re: Как дебажить?

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

char __declspec(naked) opcode_00D6()
{
	static CScriptThread *thread;
	__asm mov thread, esi
	thread->getNumberParams(1);
	debug("00D6 called with parameter %d", opcodeParams[0].nParam);
	if (opcodeParams[0].nParam)
	{
		thread->logicalOp = opcodeParams[0].nParam;
		if (opcodeParams[0].nParam >= 1 && opcodeParams[0].nParam <= 8)
		{
			++thread->logicalOp;
			thread->condResult = 1;
		}
		else if (opcodeParams[0].nParam >= 21 && opcodeParams[0].nParam <= 28)
		{
			++thread->logicalOp;
			thread->condResult = 0;
		}
	}
	else
		thread->condResult = 0;
	__asm
	{
		xor		al, al
		mov     ecx, [esp+0x40]
		pop     edi
		pop     esi
		pop     ebp
		pop     ebx
		mov     large fs:0, ecx
		add     esp, 0x3C
		retn    4
	}
}

Offline

#7 29-04-2010 07:59

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Как дебажить?

Я эту проблему решил проще: посмотри как сделан у меня CScriptThread::parseThread
Там можно поставить условие на любой опкод и подпихнуть свой обработчик для одного или нескольких опкодов.


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#8 29-04-2010 08:56

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Как дебажить?

Короче, я тут совсем тупой... CTrain::m_bWreckedFlags, как я понял, член класса CTrain, но где нарыть сисок классов?.. И вообще, как в ассемблерном коде может быть класс smile ?
__
Решил сказать основную цель - мне надо свести поезд с рельс скриптом. В определённом месте выполнить  ассемблерный код, который всё сделает, или изменить чё-то в памяти... Но чё? Вот это я и решил найти.

Offline

#9 29-04-2010 12:21

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Как дебажить?

Насчет списка классов... В полном виде, он есть только у R*
Какое-то количество имен классов, функций и переменных было восстановлено (порядка 20000..30000).

Где это брать:
1) я регулярно выкладываю свои .idb
2) ~200К кода восстановлено до С++ исходника (так называемая gta_dll), все полностью рабочее и может подменять соответствующие функции exe.
3) много непересекающейся информации есть в исходниках MTA (которые выложены на google code)

Что касается отношения классов и ассемблера - рекомендуется помедитировать над тем, чем структура отличается от класса и чем метод отличается от функции.

ЗЫ. http://sannybuilder.com/forums/viewtopi … 2356#p2356


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#10 02-05-2010 21:43

CLEO Xakep
From: Chernobyl
Registered: 14-04-2010
Posts: 30
Website

Re: Как дебажить?

Вообще я пользуюсь идой для взлома программ cool:cool::cool:...(хорошо что до сайтов ей пока не пользуюсь grin)
Но по своему хакерскому опыту скажу что надо...
1. запустить GTA:SA
2. запустить IDA PRO
3. и ПРИАТАЧИТСЯ к процессу...
ну а дальше разбирайся сам...я так делаю когда надо взломать программу с "останками smile" ASPack...Да впринципе не моё это дебажить преложения чтобы их исправить...:lol:


~Надо уметь жить~
~1 правило хакера - не убей и не повреди без особой нужды~

Offline

#11 12-07-2010 13:36

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Как дебажить?

CLEO Xakep wrote:

1. запустить GTA:SA
2. запустить IDA PRO
3. и ПРИАТАЧИТСЯ к процессу...

Приведу цитату из одной хорошей книги:

Нельзя отлаживать приложения, использующие DirectX или OpenGL. ... При наступлении критической ситуации происходит автоматическое переключение в отладчик, и это может вызвать срыв в работе OC.


programmer.png
modder.jpg

Offline

#12 12-07-2010 18:14

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Как дебажить?

@RDH - В каком тысячелетии написана эта книга?


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#13 13-07-2010 05:58

Seemann
Registered: 07-08-2006
Posts: 2,091

Re: Как дебажить?

@listener - боюсь, что BC lol

Offline

#14 16-09-2010 12:34

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Как дебажить?

Да это все понятно а как, менять значения приложения через IDA?

Offline

#15 16-09-2010 12:44

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: Как дебажить?

Менять их лучше через ArtMoney

Offline

Board footer

Powered by FluxBB