http://bbs.pediy.com/archive/index.php?t-136922.html
自重定位解析:
假设代码如下:varA dword 01234567
call @F
@@:
pop ebx
sub ebx,offset @B
mov eax,[ebx+varA]
1.如编译时预定的加载地址为0040c000
00400000 01234567
0040c004 E800000000 call 0040c009 ;这是相对跳了0字节,相当于push eip
0040c009 5B pop ebx ;这里ebx就是动态的eip了
0040c00A 81EB09104000 sub ebx,0040c009 ;这里会固定为0040c009
那么sub ebx,0040c009 ;如果加载地址是0040c000,相对基址
ebx就是0
2.当我们把这段代码加载到目标进程的0080c000(shellcode注入或线程注入的情况)。
00800000 01234567 ;加载地址变了
0080c004 E800000000 call 0080c009;代码没有变化,但是eip值变了
0080c009 5B pop ebx ;这里ebx就动态地变为0080c009
0080c00A 81EB09104000 sub ebx,0040c009 ;注意代码没有变
所以ebx就会变为0080c009-0040c009=00400000,得到一个相对基址00400000
3.所以1中 mov eax,[ebx+varA] =moveax,[0+00400000];eax=01234567
2中 mov eax,[ebx+varA] =moveax,[00400000+00400000];eax=01234567
数据的地址会变化,但是基地址ebx也随着变化,我们总能找到正确的地址
上面就是对ebx作用的一种情况分析,相信你能明白这个基地址的作用,也就理解了这个问题