大家好,小弟现在遇到一个问题,不知如何解决,有劳各位大神帮忙看下哈。
我在一段代码中需要知道一个函数的入口在内存中的位置,本来在debug版本中可以通过汇编来计算偏移值然后hardcode写入,但发现到了release版本,结果那个偏移值又变了,结果总是出错,不知道有没有比较聪明点的写法啊,谁能 帮帮我?
------
void foo() //<---- 我需要知道这里函数入口在内存中的精确地址
{
DWORD funcaddr;
__asm
{
call hdtoken
hdtoken:
pop ebx
sub ebx, 17 //offset hdtoken, 17是偏移值,会变动?
mov funcaddr,ebx
//int 3
nop
nop
}
// ---- do something
}
以上的程序中的"17"偏移位,,在debug版本下和release版本下是不同的。
// -------- debug:
00B6166A 00 00 add byte ptr [eax],al
00B6166C 55 push ebp
00B6166D 8B EC mov ebp,esp
00B6166F 81 EC C8 00 00 00 sub esp,0C8h
00B61675 53 push ebx
00B61676 56 push esi
00B61677 57 push edi
00B61678 E8 00 00 00 00 call 00B6167D
00B6167D 5B pop ebx
00B6167E 83 EB 11 sub ebx,11h //此时的偏移位是对的。
00B61681 89 5D FC mov dword ptr [ebp-4],ebx
00B61684 CC int 3
00B61685 90 nop
//---------- Release:
00B6166A 00 00 add byte ptr [eax],al
00B6166C 55 push ebp
00B6166D 8B EC mov ebp,esp
00B6166F 81 EC 88 00 00 00 sub esp,88h
00B61675 53 push ebx
00B61676 E8 00 00 00 00 call 00B6167B
00B6167B 5B pop ebx
00B6167C 83 EB 11 sub ebx,11h //此时的偏移位就是错的,正好跳前了
00B6167F 89 5D EC mov dword ptr [ebp-14h],ebx
00B61682 CC int 3
---------------------
有请哪些高人帮忙看下哈 ,有啥好的解决方法没,先行谢过了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!