Krótka funkcja z C++ na ASM

0

Witam wszystkich, mam problem z przepisaniem funkcji napisanej w C++ do/na ASM.

Funkcja oryginalna wygląda w ten sposób:

#define CALL_6(return_type, call_type, address, a1, a2, a3, a4, a5, a6) ((return_type(call_type *)(int, int, int, int, int, int))(address))((int)(a1), (int)(a2), (int)(a3), (int)(a4), (int)(a5), (int)(a6)) 

void SaveGame(char* save_name) { CALL_6(void, __thiscall, 0x4BEB60, *(int*)0x699538, save_name, 1, 1, 1, 0); }

kod, który mam aktualnie to:

save_name: 
db 'save_name text',0 

... 
sub rsp,#56 //or sub rsp,#48 if already aligned 
mov rcx,699538  
//mov [rsp],rcx 

mov rdx,save_name 
//mov [rsp+8],rdx 

mov r8,1 
//mov [rsp+10],r8 

mov r9,1 
//mov [rsp+18],r9 

mov [rsp+20],1 
mov [rsp+28],0 

call 4BEB60 

add rsp,#56 //or 48 (see sub rsp) 

jednak powyższy nie działa -> nie problem w 11 linii ("mov r9,1"). Proszę o pomoc w tym temacie bardziej doświadczonych ode mnie kolegów :)

0

Co to znaczy nie działa?

0
Patryk27 napisał(a):

Co to znaczy nie działa?

Przesyłam screen - kod odpalany w konsoli programu Cheat Engine.

0

To jest ASM x86 czy jaki? W x86 nie ma rejestrów R8 i R9.

0

@catshy: a budujesz to na odpowiednią architekturę? Bo musisz na x86-64, bo dopiero wtedy pojawiły się rejestry r8 i r9.

0

Jak już chcesz hakować gierkę, warto byłoby sprawdzić, czy jest to aplikacja 32 czy 64 bitowa.

0

Aplikacja jest 32-bitowa, natomiast ja korzystam z systemu 64 bitowego (być może to ważna informacja)

3

Skoro aplikacja, którą chcesz zaatakować/zmodyfikować/nadpisać jej pamięć jest 32-bitowa to pisz Asma pod x86, a nie x86-64.
Twój system nie gra tutaj roli, bo z 64-bitowego systemu możesz sobie skompilować plik wykonywalny pod architekturę x86, ale z 32-bitowego systemu kompilacja poprawnych plików wykonywalnych 64-bitowych może być dość problematyczna ;)

0

Hm, być może poprzedni kod ASM jest trochę "skopany", więc cofając się o krok do tyłu, wszystko co chciałbym uzyskać to funkcja z C++ w ASM, dla procesu 32-bitowego.

@Shizzer, przejrzałem Twój blog, widzę, że jest Ci bliska "ta" tematyka, czy mógłbyś mi pomóc w tym temacie jak znajdziesz chwilę czasu i nie będziesz miał nic do roboty?

0

@catshy: A więc jeśli jest to konwencja thiscall w architekturze x86, pierwszy argument this umieszczasz w rejestrze ecx, pozostałe pushujesz na stos od prawej do lewej, a po wywołaniu czyścisz stos.

Coś takiego (chyba):

push 0
push 1
push 1
push 1
push save_name
mov ecx, 699538h
call 4BEB60
add esp, 14h
1

A nie lepiej po prostu uruchomić gcc -S? Takiego kodu nawet czytać się nie chce. Możliwe że nawet w assemblerze będzie czytelniejszy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1