以下代码是<Win32 PE病毒原理分析> 这篇文章中的部分代码,有个指令我实在搞不懂它的意思,请教高手
.........
_Start:
call _delta
_delta:
pop ebp ;得到delta地址
sub ebp,offset _delta ;以便于后面变量重定位
mov dword ptr [ebp+appBase],ebp ;在appBase保存重定位值
mov eax,[esp] ;返回地址
xor edx,edx
getK32Base:
dec eax ;逐字节比较验证,速度比较慢,不过功能一样
mov dx,word ptr [eax+IMAGE_DOS_HEADER.e_lfanew] ;找PE头的地址
test dx,0xf000h
;假如找到了eax为kernel32模块的头地址,那么dx为文件的首地址
;那么根据PE文件被装入内存时是按内存页对齐的这一特性
;如果这个地址是页的其始地址,就进行下步判断
;如果不是,那么这个地址就肯定不是PE文件的起始地址
;一个页为4KB,就是说PE起始地址应该为XXXXX000的格式
jnz getK32Base
cmp eax,dword ptr [eax+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]
jnz getK32Base
;看Image_Base(模块的建议装入地址)值是否等于ecx,即模块起始值
;这里判断kernel32模块的实际装入地址与PE头结构中的建议装入地址相等,就认为找到模块
mov [ebp+k32Base],eax ;保存kernel32的起始地址
lea edi,[ebp+aGetModuleHandle] ;edi指向API函数地址存放位置的起始
lea esi,[ebp+lpApiAddrs] ;esi指向API函数名字串偏移的起始地址
lop_get:
lodsd ;在这个循环中esi是由lodsd自动增加的
cmp eax,0 ;判断函数是否搜索完毕
jz End_Get
add eax,ebp ;这时eax=kernel32模块的起始地址,而ebp是当前模块的重定位值。两个不同模块,这样相加是个什么意思?
.........
就是最后一句代码,到底是做什么的啊?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课