diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 21:37:25 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-03 21:37:25 +0200 |
| commit | 969ee91506518c4bb56d3d1b29e66c2c23e95e4c (patch) | |
| tree | 5e507f36163cbfb4d8ef4eba8d9c758c7672294c /src | |
| parent | f56ee976769eead05e2b5e4eeb92eb1733df205c (diff) | |
| download | box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.tar.gz box64-969ee91506518c4bb56d3d1b29e66c2c23e95e4c.zip | |
More work around stack alignement and frame pointer
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64emu.c | 4 | ||||
| -rwxr-xr-x | src/emu/x64run_private.c | 5 | ||||
| -rwxr-xr-x | src/include/x64emu.h | 1 | ||||
| -rwxr-xr-x | src/libtools/threads.c | 2 | ||||
| -rwxr-xr-x | src/main.c | 3 |
5 files changed, 13 insertions, 2 deletions
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c index 9a162dea..ebf378cf 100755 --- a/src/emu/x64emu.c +++ b/src/emu/x64emu.c @@ -313,6 +313,10 @@ uint64_t GetRSP(x64emu_t *emu) { return R_RSP; } +uint64_t GetRBP(x64emu_t *emu) +{ + return R_RBP; +} void SetFS(x64emu_t *emu, uint16_t v) { emu->segs[_FS] = v; diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 3b6691e6..d9fcabfb 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -44,6 +44,9 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c } printf_log(LOG_DEBUG, "Transfert to main(%d, %p, %p)=>%p from __libc_start_main\n", my_context->argc, my_context->argv, my_context->envv, main); // call main and finish + Push64(emu, GetRBP(emu)); // set frame pointer + SetRBP(emu, GetRSP(emu)); // save RSP + SetRSP(emu, GetRSP(emu)&~0xFLL); // Align RSP PushExit(emu); SetRDX(emu, (uint64_t)my_context->envv); SetRSI(emu, (uint64_t)my_context->argv); @@ -52,6 +55,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c #ifdef DYNAREC DynaRun(emu); #endif + SetRSP(emu, GetRBP(emu)); // restore RSP + SetRBP(emu, Pop64(emu)); // restore RBP return 0; } diff --git a/src/include/x64emu.h b/src/include/x64emu.h index f0ad24dd..21f435c8 100755 --- a/src/include/x64emu.h +++ b/src/include/x64emu.h @@ -37,6 +37,7 @@ void SetRIP(x64emu_t *emu, uint64_t v); void SetFS(x64emu_t *emu, uint16_t v); uint16_t GetFS(x64emu_t *emu); uint64_t GetRSP(x64emu_t *emu); +uint64_t GetRBP(x64emu_t *emu); void ResetFlags(x64emu_t *emu); void ResetSegmentsCache(x64emu_t *emu); const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip); diff --git a/src/libtools/threads.c b/src/libtools/threads.c index 6a1455bb..ed37ca2c 100755 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -231,7 +231,7 @@ static void* pthread_routine(void* p) x64emu_t* emu = et->emu; Push64(emu, 0); // PUSH BP R_RBP = R_RSP; // MOV BP, SP - R_RSP -= 64; // Gard zone + R_RSP -= 56; // Gard zone PushExit(emu); R_RIP = et->fnc; R_RDI = (uintptr_t)et->arg; diff --git a/src/main.c b/src/main.c index 80999490..d85bdcad 100755 --- a/src/main.c +++ b/src/main.c @@ -1030,7 +1030,8 @@ int main(int argc, const char **argv, const char **env) { SetRCX(emu, (uint64_t)my_context->envv); SetRIP(emu, my_context->ep); PushExit(emu); - *(uint64_t*)GetRSP(emu) = my_context->argc; + //*(uint64_t*)GetRSP(emu) = my_context->argc; + Push64(emu, my_context->argc); ResetFlags(emu); Run(emu, 0); // Get EAX |