能力值:
( LV9,RANK:610 )
|
-
-
2 楼
什么叫重定位?DLL和EXE一样有个基址,但很多个DLL的默认基址都是一样的,当加载一个DLL时,系统会设法装DLL映射到它的默认基址。但是如果他的默认基址被占用,系统会就将它映射到其它进程空间。
也就是说你是对的 网上的很多代码都不严谨。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
谢谢回复哈。
不过事实证明直接写&NewAddr是正确的啊,不用自己加基址了。那个函数的编译后成为
SetApiAddr(::GetModuleHandle(NULL),PrcMessage,(DWORD *)MyMessageBox,"user32.dll");
68191424 push offset string "user32.dll" (68196650h)
68191429 push offset MyMessageBox (68191005h)
6819142E mov eax,dword ptr [PrcMessage (6819A004h)]
68191433 push eax
68191434 mov esi,esp
68191436 push 0
68191438 call dword ptr [__imp__GetModuleHandleW@4 (681991C8h)]
6819143E cmp esi,esp
68191440 call @ILT+305(__RTC_CheckEsp) (68191136h)
68191445 push eax
68191446 call SetApiAddr (681910F0h)
。。。。。。。。。。
仍然感谢
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
现在的地址都是平坦模型,不用加模块首地址的。
另外,如果这个模块被加载到其它的地方,这个地址还是可以直接用的,因为系统会帮你重定位的,当然这时的地址和上面的地址数值上会不一样的。
推荐你看下: 函数的调用之迷
但我发现一个奇怪的问题,你传参数进来的时候已经是函数地址了,再加&,难道是二重指针嘛?
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
MyMessageBox应该就是基地址,不是rva。
|
|
|