-
-
[原创]给pediy.dll手动增加引入函数(附图)
-
2008-10-4 20:48
9971
-
[原创]给pediy.dll手动增加引入函数(附图)
高手就不用看了,仅以此献给和我一样第一次接触在引入表中新增函数的各位
起因是改造第一题的pediy.dll。
最初没有引入API,用PEB搜索Kernell32基址->搜GetProcAddress->LoadLibraryA->ShellExecuteA的ShellCode模式,写了个长达115+字节的OpenUrlA
,于是决定寻找其他解法。
按书上所说,LoadPE可以自动增加函数,但会在DLL末尾增加一个节。看了
【原创】看雪论坛.腾讯公司2008软件安全技术竞赛第一题分析过程 一文的相关部分,原来可以通过移动新节的内容来完成引入表的添加,我果然小白了
自己试着做了一下,把整个过程详细记录了下来,有什么问题欢迎指正。
关于10字节以内搞定OpenUrlA的做法,shoooo的帖子总结了一下:
【娱乐】某些牛人们的方法 (好吧,这题目确实不引人注目)
广告一下,我在该贴6楼把这些代码简要注释了一下,14楼有对方法3(7字节)的详细说明。
话说7字节的方法果然精妙啊 !原来参数这样可以输入来着。
-------------------------------------------------------------------------------------------
拿出原始DLL,用LoadPE载入。点击"Directories"(目录)按钮弹出如下对话框:
找到引入表,点击其后的"..."按钮。在弹出窗口的上方DLL信息框中点反键,选择"add import..."(新增引入):
输入要添加新函数和DLL名称,例如:
SHELL32.DLL
ShellExecuteExA
点击"+",然后"OK"。
确定保存修改的DLL,接着用WinHex打开查看。找到刚才添加的新节内容:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000C00 53 48 45 4C 4C 33 32 2E 44 4C 4C 00 00 00 53 68 SHELL32.DLL...Sh
00000C10 65 6C 6C 45 78 65 63 75 74 65 45 78 41 00 0C 50 ellExecuteExA..P
00000C20 00 00 00 00 00 00 5C 20 00 00 00 00 00 00 00 00 ......\ ........
00000C30 00 00 72 20 00 00 0C 20 00 00 50 20 00 00 00 00 ..r ... ..P ....
00000C40 00 00 00 00 00 00 9C 20 00 00 00 20 00 00 1E 50 ......?... ...P
00000C50 00 00 00 00 00 00 00 00 00 00 00 50 00 00 1E 50 ...........P...P
复制这个部分到.rdata节的空白处,例如这里选取的 000006B0 处。修改代码中的RAV地址(红色标出的部分):
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
000006B0 53 48 45 4C 4C 33 32 2E 44 4C 4C 00 00 00 53 68 SHELL32.DLL...Sh
000006C0 65 6C 6C 45 78 65 63 75 74 65 45 78 41 00 BC 20 ellExecuteExA..P
000006D0 00 00 00 00 00 00 5C 20 00 00 00 00 00 00 00 00 ......\ ........
000006E0 00 00 72 20 00 00 0C 20 00 00 50 20 00 00 00 00 ..r ... ..P ....
000006F0 00 00 00 00 00 00 9C 20 00 00 00 20 00 00 CE 20 ......?... ..?
00000700 00 00 00 00 00 00 00 00 00 00 B0 20 00 00 CE 20 ..........?..?
其实不清楚引入表的构造也没有关系,只要把指向原来位置的几个偏移改到你移动的位置就行了。一图胜千言,用OD加载DLL,按Alt+M打开内存映射窗口,找到pediy.dll的最后一个节:
蓝色的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的功能已经没有问题。(二楼待续)
[培训]《安卓高级研修班(网课)》月薪三万计划,掌
握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法