今天学到罗老师的WIN32汇编里的497页..就是讲远程线程的内容..我在看RemoteCode.asm里的内容中看到
_RemoteThread proc uses ebx edi esi lParam
local @hModule
call @F
@@:
pop ebx
sub ebx,offset @B
_invoke [ebx + _lpGetModuleHandle],NULL
mov [ebx + _hInstance],eax
lea eax,[ebx + offset _szDllUser]
_invoke [ebx + _lpGetModuleHandle],eax
mov @hModule,eax
lea esi,[ebx + offset _szDestroyWindow]
lea edi,[ebx + offset _lpDestroyWindow]
.while TRUE
_invoke [ebx + _lpGetProcAddress],@hModule,esi
mov [edi],eax
add edi,4
@@:
lodsb
or al,al
jnz @B
.break .if ! byte ptr [esi]
.endw
call _WinMain
ret
_RemoteThread endp
这样一个子程序 .. 头四句是重定位 但是
_invoke [ebx + _lpGetModuleHandle],NULL 这句在OllyDBG里查看竟然变成
CALL DWORD PTR DS:[EBX+401008] 而401008地址下的是GetProcAddress的函数地址
不知道这是为什么。
下面是我自己的理解:
_invoke [ebx + _lpGetModuleHandle],NULL
;获取动态链接库模块句柄
mov [ebx + _hInstance],eax ;句柄送给变量
lea eax,[ebx + offset _szDllUser] ;EAX=_szDllUser的偏移地址
_invoke [ebx + _lpGetModuleHandle],eax;获取User32.dll模块句柄
mov @hModule,eax ;句柄送给@hModule局部变量
lea esi,[ebx + offset _szDestroyWindow] ;偏移送给ESI
lea edi,[ebx + offset _lpDestroyWindow] ;偏移送给EDI
上面几句能看懂 但下面是个循环 就怎么样都看不懂了
@@:
lodsb
or al,al
jnz @B
.break .if ! byte ptr [esi]
上面这五句完全不理解什么意思 lodsb应该是SI地址下的内容送给AL 但这里AL是函数地址的低八位 然后位或操作 按理来说两个同样的值位或后值是不变的。 我知道这段指令的意思是获取所有函数的地址, 但不知道具体操作。。对不起 我这人喜欢打破沙锅问到底 。希望知道的人帮我解释下。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!