call @vstart
@vstart:
pop ebx
sub ebx,offset @vStart //把绝对地址和相对偏移相减就可以获得相对偏移与绝对地址的转换关系
mov eax, [ebx+offset var] //offset 关键字好似可省写
ebx为编移量.
//一个实例.
.code
mycode:
lpmsg dd ?
sztil db '密码为: ',0
szstr db 'password is '
szpwd db 70h dup (0)
; --------------------
startcode:
pushad
call l1
l1:
pop ebx
sub ebx,offset l1
;很经典的代码自定位技术,不陌生吧!
lea edi, [ebx + offset szpwd]
mov edx,[ebp - 8]
add edi,edx
mov byte ptr [edi],al
inc edx
mov eax,[ebp -4]
cmp edx,eax
jl ext1
-------------------------------------------------
关于远程线程中的自定位:
dwvar dd ? ;全局变量dwvar
call @F
@@:
pop ebx
sub ebx,offset @B
mov eax,[ebx + offset dwvar]
@F 向下最近的@@标号的地址
@B 向上最近的@@标号的地址
call 所取得是 函数地址
$ 则是当前地址
这里的offset @B,是相对偏移地址,那么将程序的一部分(其中包含以上自定位代码)写到其它的进程中,以便在其它进程中产生远程线程
那么这时的offset @B的相对偏移地址怎么解释,哪位大虾帮讲解一下!!!
感觉offset @B应该是@@标号,相对于本地进程的偏移地址,但本地进程只是把其中的一部分代码写进了其它进程,那么相对于写进其它进程的这部分代码,它的offset @B应该不对呀?
offset @B是@@标号在源进程中的地址,是一个立即数,这段代码复制到其它进程后,这个数是不变的。“sub ebx,offset @B”,ebx是@@标号在当前进程(被注入的进程)中的地址,向减之后就是被注入的代码在当前进程与源进程中偏移量的差。
对于注入的代码,因为注入的地址与原本的地址不同,所有代码中不能使用绝对地址。通常情况下,只要不使用直接寻址(直接使用全局变量),不使用标号的偏移量(OFFSET伪指令),就不会有问题。当使用全局变量或者偏移量时,可以使用上面ebx+的方法来修正,如果在其它函数中也需要使用全局变量或者偏移量时,可以用同样的方法,也可以在调用函数的时候把ebx作为参数传递过去。