地址)+Offset varlable
Win32下的系统功能调用一般通过调用动态连接库中的API函数实现。文件型病毒一般感染
API函数调用的实质是找到函数地址,然后
call MessageBox(0,”123”,0,0);
Call 0x7c91001c; (WIN XP SP3)`
调用时,根据函数名查引入表,就可以获取该函数的地址。
使用函数LoadLibrary装载需要调用的函数所在的dll文件,获取模块句柄。然后调用GetProcAddress获取需要调用的函数地址。这种方式是在需要调用函数时才将函数所在的模块调入到内存中,同时也不需要编译器为函数在引入表中建立相应的项。

这里主要注意下面2个特殊的API
LoadLibrary加载一个DLL,返回DLL地址
GetProcAddress通过DLL地址和API函数名获得API函数的地址
由于程序入口点是被kernel32某个函数调用的,所以这个调用函数肯定在kernel32的地址空间上。那么我们只要取得这个返回地址,就得到了一个kernel32空间中的一个地址。
通过这个地址,我们可以从高地址向低地址方向进行搜索,通过PE标志的判断,搜索到kernel32模块的基地址!
大致流程如下:
取栈顶值到寄存器A(KERNEL32中的一个地址)
A = A 与 0FFFFF000h(分配粒度是1000h,基地址必然在xxxx000h处)
循环:
如果[A] == IMAGE_DOS_SIGNATURE(判断DOS头标志)
{B = A;B =B+e_lfanew;指向PE标志
如果[B] ==IMAGE_NT_SIGNATURE (判断“PE\0\0”标志)
{跳出循环;(找到,退出!)}
A =A - 01000h;
循环结束
代码实现:
GetKBase:
mov edi ,[esp] ;取栈顶值,就是KERNEL32中的一个地址
and edi,0FFFFF0000h ;分配粒度是10000h,基地址必然在xxxx0000h处
.while TRUE
.if WORD ptr [edi] == IMAGE_DOS_SIGNATURE ;判断DOS头标志
mov esi,edi
add esi,DWORD ptr [esi+03Ch] ;esi指向PE标志
.if DWORD ptr [esi] ==IMAGE_NT_SIGNATURE ;判断PE标志
.break ;若正确,则跳出循环
.endif
.endif
sub edi, 010000h
.endw
mov hKernel32,edi ;把找到的KERNEL32.DLL的基地址保存起来
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-65351-2.html
原先一直在喝