由于大部分的文件感染型病毒框架都不可以像“前置病毒”那样拥有自己的输入表,因此需要自行定位API
说一千道一万,想要定位API,大方向是要定位Kernel32.dll的基地址。
总结所以这些方法,可以分为是五个小方向,它们又产生很多变种。
一、定位kernel32.dll基地址的方法
(1)硬编码方式
由于kernel32.dll的基地址在相同版本windows下,基本上它的位置是固定的。这种方法在早期的PE病毒中很常见,现在已经很少使用了。
(2)利用程序初始化时,首先寄存器或堆栈中保留的kernel32.dll内存模块中的某个地址,之后无论哪种变体,都是以这个kernel内的地址向前搜索,找到kernel.dll的基地址。
以下地方就存储着这些地址:
①寄存器EDI
②刚刚初始化的堆栈:[esp]、[esp+4H]、[esp+10H]
以[esp+10h]为例,我们看一下参考代码(另外注释里有一些常见错误代码的写法):
Start:
mov edx,[esp+10h]
SearchDosHeader:
dec edx
xor dx,dx ;加速搜索,因为DLL以1M长度对齐,所以这里以64K字节为跨度来加速搜索
cmp word ptr[edx],'ZM' ;不要自作聪明写成'MZ',那是以字节逐个读取的结果