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

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

2008-10-4 20:48
10440

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

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

关于10字节以内搞定OpenUrlA的做法,shoooo的帖子总结了一下:
【娱乐】某些牛人们的方法 (好吧,这题目确实不引人注目

广告一下,我在该贴6楼把这些代码简要注释了一下,14楼有对方法3(7字节)的详细说明。
话说7字节的方法果然精妙啊 !原来参数这样可以输入来着。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
2
继续修改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)
上传的附件:
2008-10-4 20:49
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
3
有工具真好。。。我很原始一个个字节敲的,汗。。。
2008-10-4 20:56
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
这工具好像人手一份,其实用字节敲更省事。
2008-10-4 20:59
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
5
我之前就是敲进去的,不过很容易出错 ,这样只移动一下就简单多了。

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



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

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

我就不继续班门弄斧了。
2008-10-5 08:35
0
游客
登录 | 注册 方可回帖
返回
//