首页
社区
课程
招聘
[原创]给pediy.dll手动增加引入函数(附图)
2008-10-4 20:48 9971

[原创]给pediy.dll手动增加引入函数(附图)

2008-10-4 20:48
9971
高手就不用看了,仅以此献给和我一样第一次接触在引入表中新增函数的各位

起因是改造第一题的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虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
木桩 8 2008-10-4 20:49
2
0
继续修改DLL,让他变得更完美吧。

保存后拿LoadPE载入,看看引入表是否正常(例如点击引入表后面的"L"按钮):
->Import Table
1. ImageImportDescriptor:
OriginalFirstThunk: 0x0000205C
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x00002072 ("USER32.dll")
FirstThunk: 0x0000200C

Ordinal/Hint API name
------------ ---------------------------------------
0x01BE "MessageBoxA"

2. ImageImportDescriptor:
OriginalFirstThunk: 0x00002050
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x0000209C ("KERNEL32.dll")
FirstThunk: 0x00002000

Ordinal/Hint API name
------------ ---------------------------------------
0x0140 "GetProcessHeap"
0x0199 "HeapAlloc"

3. ImageImportDescriptor:
OriginalFirstThunk: 0x000020CE
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x000020B0 ("SHELL32.DLL")
FirstThunk: 0x000020CE

Ordinal/Hint API name
------------ ---------------------------------------
0x0000 "ShellExecuteExA"


好了,ShellExecuteExA成功引入,其调用偏移为0x20CE。

现在来去掉新增的节,还原DLL的大小。
打开区段对话框,找到最后一个由LoadPE新增的节(我这里是.Silvana) ,反键选择"wipe section header"(清除区段)。


用WinHex清除文件末尾从00000C00开始的节内容,保存退出。

之后用OD载入,Oh..NO! 怎么提示“应用程序或DLL pediy.dll 为无效的 Windows 映像。请再检测一遍您的安装盘。”!


LoadPE已经能认识新的引入表了啊?仔细回想刚才的步骤,终于发现问题所在:刚才直接删除了新节,没有去调整镜像大小到原始值。LoadPE打开DLL,找到镜像大小:0000504C,改回0000404C保存。


好了,用OD载入DLL,这次顺利载入了。测试一下吧,向上找到
003F100E  |.  FF15 0C203F00 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
双击反汇编,提示的内容是:CALL DWORD PTR DS:[3F200C]
由于ShellExecuteExA偏移为0x20CE,改成CALL DWORD PTR DS:[3F20CE]
003F100E      FF15 CE203F00 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>;  SHELL32.ShellExecuteExA

看来改造成功了!之后想怎么发挥就怎么发挥了,例如7字节完成OpenUrlA

附件中有原始的 pediy.dll 和修改好的DLL(pediy_引入ShellExecuteExA.rar)
附带我之前说的那个不用引入函数,115字节搜索API方法改造的DLL,包括引出表修改等完整的改造过程(pediy_115+字节的改造过程.zip)
上传的附件:
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
mstwugui 6 2008-10-4 20:56
3
0
有工具真好。。。我很原始一个个字节敲的,汗。。。
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-10-4 20:59
4
0
这工具好像人手一份,其实用字节敲更省事。
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
木桩 8 2008-10-4 21:15
5
0
我之前就是敲进去的,不过很容易出错 ,这样只移动一下就简单多了。

LoadPE确实人手一份了,要不是这次题目说不添加新节可以加分,我都没想过在不新增节的情况下引入API(果然优秀的工具使人懒惰么...)。
雪    币: 182
活跃值: (50)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
pathletboy 2 2008-10-4 23:53
6
0
用英文版软件做demo,看上去会很高深。
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk 2008-10-5 03:07
7
0
没看到你增加重定位项
你测试通过了么
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
木桩 8 2008-10-5 08:35
8
0
实际内容比较浅显



确实没有做重定位,而且导出OpenUrlA也没有做 ,这贴仅仅是记录一下增加引入表函数的方法。
如果真要调用这个API,就要在文件的00000A00这里顺着加自己的重定位信息了。

关于重定位的问题,icersg在这个帖子的31楼说得很详细(也有配图):
http://bbs.pediy.com/showthread.php?t=73927&page=3

我就不继续班门弄斧了。
游客
登录 | 注册 方可回帖
返回