PDA

Просмотр полной версии : [Помогите!] Чтение Ассемблера в игре.


Foreworld
27.03.2014, 14:43
Здравствуйте. Помогите решить проблему.
1. С помощью Cheating Engine 6.3 я ищу оффсеты для игры.
2. Нашел, базовый адрес, нашел "Environment struct", но ни как не могу определить структуру персонажа, так как присутствует код.

Например:
В белом списке cheating engine выпадает куча адресов, и там написано:
mov edx, [ecx+edi*4] или mod ecx, [edx+edi*4] или mov edi, [edx+ebx*4]
бывает что и ebp*4, разнице нет так как:

Эти edi, ebx, ebp, esi, имеет значения от 0 до 9 и до F умноженное на 4 в калькуляторе. И каждый раз когда я перезапускаю игру, то edi, ebx, ebp, esi и т.д меняет значение на другое, это значит что адрес динамический. Я не могу понять откуда он берет эти числа. Я смотрел код до этого и находил например push edi и все... я не понимаю что сделать чтобы найти чему рано эти индексы. Работаю в среде Делфи 7

Добавлено через 7 часов 38 минут
Поясните чему будет равно edi? mov ecx,[eax+edi*4]
Вот полный код:
53 - push ebx
8A 5C 24 0C - mov bl,[esp+0C]
55 - push ebp
8B 6C 24 0C - mov ebp,[esp+0C]
56 - push esi
57 - push edi
8B F1 - mov esi,ecx
33 FF - xor edi,edi
8B 8E A8010000 - mov ecx,[esi+000001A8]
85 C9 - test ecx,ecx
74 53 - je PerformPacket+6D
8B 86 AC010000 - mov eax,[esi+000001AC]
2B C1 - sub eax,ecx
C1 F8 02 - sar eax,02
3B F8 - cmp edi,eax
73 44 - jae PerformPacket+6D
85 C9 - test ecx,ecx
74 0F - je PerformPacket+3C
8B 86 AC010000 - mov eax,[esi+000001AC]
2B C1 - sub eax,ecx
C1 F8 02 - sar eax,02
3B F8 - cmp edi,eax
72 06 - jb PerformPacket+42
FF 15 54E67400 - call dword ptr imp___invalid_parameter_noinfo]
8B 86 A8010000 - mov eax,[esi+000001A8]
8B 0C B8 - mov ecx,[eax+edi*4]
8B 11 - mov edx,[ecx]
8B 92 E0000000 - mov edx,[edx+000000E0]
66 0FB6 C3 - movzx ax,bl
50 - push eax
55 - push ebp
FF D2 - call edx
84 C0 - test al,al
75 05 - jne PerformPacket+64
83 C7 01 - add edi,01
EB AC - jmp PerformPacket+10
5F - pop edi
5E - pop esi
5D - pop ebp
B0 01 - mov al,01
5B - pop ebx
C2 0800 - ret 0008
33 FF - xor edi,edi
90 - nop

VeTaL_UA
28.03.2014, 16:34
Поясните чему будет равно edi?
xor edi,edi
cmp edi,eax
mov ecx,[eax+edi*4]
add edi,01
edi будет равно от 0 до eax :)(

Foreworld
28.03.2014, 21:08
Хм)))Спасибо, большое, а тогда чему будет eax, и что делать если, edi динамический адресс

VeTaL_UA
29.03.2014, 03:14
м)))Спасибо, большое, а тогда чему будет eax, и что делать если, edi динамический адресс
edi - это итератор цикла, оно меняется от 0 до значения eax с шагом в единицу. Чем будет eax?
mov eax,[esi+000001A8]
Значению, взятому по указателю, сложенному из значения esi и литеральной константы 1A8h.

Дабы предупредить следующий вопрос, говорю сразу, в esi лежит значение ecx, а что в ecx надо смотреть раньше по коду. Я думаю, что в ecx лежит некий базовый адрес.

Foreworld
30.03.2014, 17:00
Я думаю, что в ecx лежит некий базовый адрес.
Я вот когда смотрел есть один адрес(Value), он не базовый но, он статичен и я его всегда вижу, когда ищю офсеты, через него я нахожу адрес, по которому я нахожу базовый адрес.

VeTaL_UA
01.04.2014, 00:07
Я не могу понять
1) Что ты делаешь?
2) Если я таки понял, что ты делаешь, то на кой чёрт все эти вопросы, что тут звучат? о_О

Foreworld
01.04.2014, 11:21
Я просто очень плохо разбираюсь в асаме и не совсем хорошо в Delphi. Я хочу найти способ решить эту проблему с edi. Мне сказали сделать это указателем, но для этого нужен адрес(какой то) чтобы вставить в этот код: P :=@??

VeTaL_UA
02.04.2014, 01:02
Всё равно ничего не понял. Что ты хочешь сделать в итоге? Что должно получится?

Foreworld
02.04.2014, 01:51
Бот должен получиться, при поиске структуры персонажа, приходиться находить чему будет равно edi так ка он меняется. Мне сказали что можно с помощью указателя решить, проблему но я не знаю как. Работаю в среде Delphi и понятие не имею как должен выглядить код на решение данной проблемы

VeTaL_UA
02.04.2014, 14:50
Та что же такое, ты не понимаешь, чего я от тебя хочу. Это ты хочешь цепочку оффсетов вывести для считывания структуры?

Foreworld
02.04.2014, 19:09
Именно, но проблема в edi. Причем когда в белом списке выпадают адреса, там не только edi там и esi и другие и они все равны одному значению. Пример:
mov ecx,[esi+edi*4] mov eax,[edi+esi*4] самое главное, после + идет индекс(edi,esi,ebx...) и они равны от 0 до 3С. Обычно они ровны 0,4,1C, 24, 28, 2C. Я не знаю что мне делать с этим... :(

VeTaL_UA
05.04.2014, 23:28
Я не знаю что мне делать с этим...
ну дак в оффсете так и напишите [i * 4]. Это мы тут из-за этого ковыряли асм код?

Foreworld
06.04.2014, 02:54
Да))))
В каком смысле ("ну дак в оффсете так и напишите [i * 4]")?
вот цепочка адреса показывающая хп 007E3600+1A8+(i*4)+1B8. И проблема в I, я не знаю как ее считать, даже не знаю как выглядит код если указывать указатель.
Указатель в Delphi - тоже самое что и интератот просто мы указываем на него, на эту ячейку памяти, если я не ошибаюсь :/

VeTaL_UA
06.04.2014, 10:43
Ты попал на цепочку данных, если тебе надо прочитать всю цепочку, то читай в цикле с итератором i, если конкретный элемент, то напиши его индекс в i.

Foreworld
06.04.2014, 12:39
то читай в цикле с итератором i,
Проблема, я не знаю как код выглядит :/

VeTaL_UA
06.04.2014, 14:33
Проблема, я не знаю как код выглядит :/
var
i: integer;
{ ... }
begin
i := 0;
while i < $100 do //TODO: insert correct value
begin
//TODO: Read value from process memory
inc(i);
end;
i := 0;
repeat
//TODO: Read value from process memory
inc(i);
until
i = $100; //TODO: insert correct value
for i := 0 to $100 do //TODO: insert correct value
begin
//TODO: Read value from process
end;
end;
Выше примеры трёш цыклов. Выбирай любой.

Foreworld
06.04.2014, 16:29
:/ Эти циклы увеличивают значение " i " от 0 до 100.
Не совсем понимаю каким образом он будет находить истину(правильное значение " i ")

Я каждый раз использую таков вид подключения и считывания к процессору:

var
...
KlientWindow:HWND;
ProcessId:Integer;
hProcess:Integer;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
KlientWindow := FindWindow(nil, PChar('Perfect World'));
GetWindowThreadProcessId(KlientWindow,@ProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
if hProcess <> 0 then
begin
Label1.Caption :='Игра запущена!';
Timer1.Enabled := True;
end
else
Label1.Caption :='Игра не запущена!';
end;

begin
try
ReadProcessMemory (hProcess, Pointer($C38B6C), @WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP+$1C), @WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP+$34), @WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP+$4A8), @WHP, sizeof(WHP), NoB)

i:Integer;
begin
For i :=0 to $100 do
begin
...
end;
ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, 4, NoB);

Что еще нужно добавить? Я просто плохо знаю Delphi

VeTaL_UA
06.04.2014, 16:39
от 0 до 100.
от 0 до 255
ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, 4, NoB);
внутри цыкла
Я просто плохо знаю Delphi
дак пиши на том, что знает лучше, разницы нету.

Foreworld
06.04.2014, 16:45
i:Integer;
begin
For i :=0 to $100 do
begin
ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, 4, NoB);
end;

Таким обрахом он может мне выдать любое значение, а мне нужно правильное.

VeTaL_UA
06.04.2014, 22:11
Таким обрахом он может мне выдать любое значение, а мне нужно правильное.
255-ое значение оно тебе выдаст.

Foreworld
07.04.2014, 00:04
:D Но зачем 255-ое значение. i меняется каждый раз, когда (захожу в инвентарь, захожу в другую локацию и т.д)
Вот например я найду в cheating engine, что i = 5. Я умножу 5*4 и получу структуру равную 14. Перезайду и бац i будет равно другому значения. А этим кодом i будет равно 255-му значению. Я не врубаюсь каким образом цепочка будет работать??? o_O

VeTaL_UA
07.04.2014, 05:28
Повторю ещё раз, это структура, значит в ней есть много значений, значит ты ищешь оффсет на часть того, чего много, соответственно, стоило бы определится, что тебе надо из этого извлечь.

Foreworld
07.04.2014, 10:41
Я не понимаю что мне тогда делать...

VeTaL_UA
07.04.2014, 23:04
Я не понимаю что мне тогда делать...
Учить основы, а не лезть в дебри реверсинга ;)

Foreworld
08.04.2014, 00:58
Может все же научишь?))) Основу я знаю Delphi, но опыт написания кодинга очень мал...

VeTaL_UA
10.04.2014, 02:29
Может все же научишь?)))
Я не настолько пацифист, чтобы бесплатно проводить лекции, да ещё и в таком объёме. Изучение ассемблера, даже основ, занимает не один месяц времени.
Основу я знаю Delphi
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Foreworld
10.04.2014, 10:06
:DDD ну хотяб дай ссылки или подскажи названия книг, где ты учился)))
Не я в правду знаю слегка Delphi. Первый раз когда смотрел код в Delphi думал что это за кракозябры. А сейчас спокойно понимаю, что выполняет код.)

RenatPro
15.05.2014, 07:09
:DDD ну хотяб дай ссылки или подскажи названия книг, где ты учился)))
Не я в правду знаю слегка Delphi. Первый раз когда смотрел код в Delphi думал что это за кракозябры. А сейчас спокойно понимаю, что выполняет код.)

Я думаю не так все просто тебе надо определить хотя бы часть значения на которое заканчивается или начинается нужное значение. (офсет)