在得到了Kernel32的模块地址以后,就可以搜索他的导出表得到GetProcAddress和LoadLibrary两个API函数的地址。
对这两个API函数的联合调用就可以得到WIN32 应用层上任何所需要的API函数地址了。
通过函数名称查找函数名地址,具体如下:
1、定位到PE文件头。
2、从PE文件头中的可选文件头中取出数据目录表的第一个数据目录,得到导出表的地址。
3、从导出表的NumberOfNames字段得到以命名函数的总数,并以这个数字做微循环的次数来构造一个循环。

4、从AddressOfNames字段指向的函数名称地址表的第一项开始,在循环中将每一项定义的函数名与要查找的函数名比较,如果没有任何一个函数名符合,说明文件中没有指定名称的函数。
如果某一项定义的函数名与要查找的函数名符合,那么记住这个函数名在字符串地址表中的索引值(如x),然后在AddressOfNameOrdinals指向的数组中以同样的索引值x去找数组项中的值,假如该值为y。
5、以y值作为索引值,在AddressOfFunctions字段指向的函数入口地址表中获取的RVA就是函数的入口地址,当函数被装入内存后,这个RVA值加上模块实际装入的基址(ImageBase),就得到了函数真正的入口地址。
exportD=hKernel32.OptionalHeader.DataDirectory.VirtualAddress + hKernel32;
int i,iA;
for (i=0;i<exportD.NumberOfNames;i++)
{
p=hKernel32+exportD.AddressOfNames[i]; If (!strcmp(p,name)) break;
}
WORD *pw = (WORD*)(hKernel32 + exportD.AddressOfNamesOrdinals);
iA = pw[i];
DWORD *pA = (DWORD*)(hKernel32 + exportD.AddressOfFunctions);
DWORD address = pA[iA];
PE病毒通常以PE文件格式的文件(如EXE、SCR、DLL等)作为感染目标。在对目标进行搜索时一般采用两个关键的API函数:
FindFirstFile
FindNextFile
其一般搜索“.exe”、“.scr”等文件进行感染。在算法上可以采用递归或者非递归算法对所有盘符进行搜索。
一个被病毒感染的HOST程序通常首先执行病毒代码,然后执行HOST程序的正常代码。这既保证病毒首先获得控制权,同时也不影响HOST程序的正常执行。
另外也可能在HOST程序执行的过程中调用病毒代码,例如病毒的EPO技术中就采用这种方式。
主要有这三种方式:添加节;扩展节;插入节。
在文件的最后建立一个新节,在节表结构的后面建立一个节表,用以表述该节。入口地址修改为病毒所在节.
1、把病毒代码追加到文件尾部。
2、在节表中增加一个sectionheader各项数据填写正确(VirtualSize,VirtualAddress,PointerToRawData…..)。
3、在FILEHEADER中修改节表项数目: +1。
4、重新计算SizeofHeaders,并替换原值。
5、重新计算SizeofImage,并替换原值。
6、记录未感染时的AOEP(入口地址),因为在病毒代码结束时要让宿主程序正常执行。所以要先记录AOEP,在病毒程序结束后JMP跳到宿主程序的AOEP。
7、修改OptionalHEADER中的AddressOfEntryPoint,让它指向新加节的入口代码
这种方式不增加节的个数和文件长度,病毒搜寻到一个可执行文件后,分析每个节,查询节的空白空间是否可以容纳病毒代码,若可以,则感染之。CIH病毒就是采用这种方法感染可执行文件的。
SizeOfRawData - VirtualSize
最后分享2个实验,感兴趣的坛友可以动手实践下
(1)打造最小的PE文件。
(2)动态获取API函数地址及观察被PE文件型病毒感染的文件
建议在吾爱虚拟机中实验。百度网盘链接,明天会放上来!!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-65351-3.html
有几条命
然后可以直接干过去
你必须抱我美国人的大腿
你现在就可以去伊拉克竞选总统