高手就不用看了,仅以此献给和我一样第一次接触在引入表中新增函数的各位
起因是改造第一题的pediy.dll。
最初没有引入API,用PEB搜索Kernell32基址->搜GetProcAddress->LoadLibraryA->ShellExecuteA的ShellCode模式,写了个长达115+字节的OpenUrlA ,于是决定寻找其他解法。
按书上所说,LoadPE可以自动增加函数,但会在DLL末尾增加一个节。看了 【原创】看雪论坛.腾讯公司2008软件安全技术竞赛第一题分析过程 一文的相关部分,原来可以通过移动新节的内容来完成引入表的添加,我果然小白了
自己试着做了一下,把整个过程详细记录了下来,有什么问题欢迎指正。
-------------------------------------------------------------------------------------------
拿出原始DLL,用LoadPE载入。点击"Directories"(目录)按钮弹出如下对话框:

找到引入表,点击其后的"..."按钮。在弹出窗口的上方DLL信息框中点反键,选择"add import..."(新增引入):

输入要添加新函数和DLL名称,例如:
SHELL32.DLL
ShellExecuteExA
点击"+",然后"OK"。

确定保存修改的DLL,接着用WinHex打开查看。找到刚才添加的新节内容:
复制这个部分到.rdata节的空白处,例如这里选取的 000006B0 处。修改代码中的RAV地址(红色标出的部分):

蓝色的4个字节暂时不管,先看红色部分。
003F504E 1E 50 00 00 对应文件中的 00000C4E 1E 50 00 00
查 引入表结构 可知,这是用于存放API实际地址的位置(从上图也可以看出,其值再被加载时自动修正了)。它正好在'ShellExecuteExA',0后面,所以对应的,移动后 000006FE 的值也要指向在'ShellExecuteExA',0的后面,即000020CE处。
这里过了就完成了大半,稍微调整引入表的偏移地址:
00000150 26 50 00 00 &P..
->
00000150 D6 20 00 00 ?..
至此已经完成了大半,DLL的功能已经没有问题。(二楼待续)