首页
社区
课程
招聘
[求助]修改一个DLL让它被加载时先加载我的DLL,问题!
发表于: 2011-5-4 20:40 17707

[求助]修改一个DLL让它被加载时先加载我的DLL,问题!

2011-5-4 20:40
17707
有个DLL,我想让他被主程序加载时就加载我的DLL,然后再返回原DLL,这样的话为什么运行主程序后原DLL被加载了,我的DLL也被加载了,可就是我的DLL执行完后,就不会返回原DLL呢?这步需要怎么做呢?我是用Delphi做的~!有知道的高手指点一下!谢谢

1、我用PEdiy添加Shell Code。可以正常加载,但运行错误!
2、我用LordPE添加输入表,
修改原DLL入口为:
Jmp CALL处 //下面的Call

然后找空地修改为:
Call TYUI (TYUI为我DLL的函数)
Jmp 原DLL入口下方

这样还是错误!

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

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
最近正好在学习PE结构相关的东东。想达成你的目标有以下几个办法:
1.修改目标DLL导入表。
2.在原来DLL添加代码。代码调用LoadLibrary函数加载你自己的DLL(代码可以自定位,也可手动添加重定位表项目),然后跳回原入口点。

关于你说的你自己的DLL调用之后无法返回原DLL问题我的想法是。不要在原DLL中添加代码跳转到你自己DLL中的函数去。原DLL在调用LoadLibrary函数后LoadLibrary会自动调用你函数的DllMain函数,你只要在DllMain函数中使用自己的函数即可。如果你自己的函数一时无法返回也可在DllMain中创建单独线程来调用你的函数。DllMain函数返回后就会到原Dll中执行。如果出错的话可能就是你修改原来DLL出错了。我上次练习在PE文件中添加代码(其实也是做个试验,让目标程序自动加载我的测试DLL,测试DLL会弹出个MessageBox提示加载成功)也出错好多次。后来用OD调试发现返回时出现了问题。另外如果是在DLL中采用添加代码(shellcode)的方式来加载DLL需要自定位。但别忘了跳回入口点时。入口点也需要重定位哦(我一开始这里也糊涂了好久。还好OD强大。。。^_^)。

祝你早日解决问题。解决了也告知下解决方法哈。^_^
2011-5-4 20:56
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
push tyui 。。。。。。。。
2011-5-4 21:48
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我自己的DLL如果让主程序(程序)加载(添加Shell code 的方法)的话,可以正常执行并正常运行。同样的方法,我用自己的DLL让主程序调用的DLL去加载,我自己的DLL代码也会执行,但执行完就会提示“Automation 错误”。用Relox重定位,也是一样的错误。

具体是什么原因也不清楚!
2011-5-4 22:18
0
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
这个。。。你试试看用OD跟踪看看。你的DLL的代码执行完毕后返回到哪里去了。如果返回到原DLL入口点应该不会有问题了呀。。。我也不是很清出这个问题了。。。慢慢调试看看呢。呵呵。
2011-5-5 12:31
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我用OD跟踪后,发现我的DLL被载入后也能正常返回到原DLL,但在原DLL一处Retn处发生改变!

未修改的原DLL执行如下:

6010AD2D 51 PUSH ECX
6010AD2E 52 PUSH EDX
6010AD2F E8 90DAF4FF CALL BC.600587C>
6010AD34 C2 0C00 RETN 0C //执行到这步发生改变
6010AD37 90 NOP
6010AD38 90 NOP
6010AD39 90 NOP
6010AD3A 90 NOP


6010AD34返回到:
7C92118A 8BE6 MOV ESP,ESI //未修改的原DLL返回到这里
7C92118C 5B POP EBX
7C92118D 5F POP EDI
7C92118E 5E POP ESI
7C92118F 5D POP EBP
7C921190 C2 1000 RETN 10
7C921193 90 NOP




修改后的原DLL运行如下:

6010AD2D 51 PUSH ECX
6010AD2E 52 PUSH EDX
6010AD2F E8 90DAF4FF CALL BC.600587C>
6010AD34 C2 0C00 RETN 0C //执行到这步发生改变
6010AD37 90 NOP
6010AD38 90 NOP
6010AD39 90 NOP
6010AD3A 90 NOP


6010AD34返回到:
60000000 4D DEC EBP //修改后的原DLL返回到这里
60000001 5A POP EDX
60000002 90 NOP
60000003 0003 ADD BYTE PTR DS:[EBX],AL
60000005 0000 ADD BYTE PTR DS:[EAX],AL
60000007 000400 ADD BYTE PTR DS:[EAX+EAX],AL
6000000A 0000 ADD BYTE PTR DS:[EAX],AL
6000000C FFFF ??? ; 未知命令
6000000E 0000 ADD BYTE PTR DS:[EAX],AL
60000010 B8 00000000 MOV EAX,0
60000015 0000 ADD BYTE PTR DS:[EAX],AL
60000017 0040 00 ADD BYTE PTR DS:[EAX],AL
6000001A 0000 ADD BYTE PTR DS:[EAX],AL
6000001C 0000 ADD BYTE PTR DS:[EAX],AL




但我测试了一下,如果强行让他返回到7C92118A,继续运行后还是发生错误!

我汗啊!原来是修改前可以正常用Regsvr32注册,修改后注册就闪一下就没了!
2011-5-5 13:34
0
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
根据你说的情况我做如下猜测:
EXE调用原DLL,原DLL执行SHELLCODE调用你的DLL并初始化,SHELLCODE执行完毕跳转到原DLL的原始入口点执行原DLL初始化,初始化完成根据堆栈返回地址返回EXE领空。

从你提供的代码片段来看,能够执行到“原DLL初始化”这一步并且完成了初始化。问题在于跳回EXE领空是跳错了地方。所以我猜测你的SHELLCODE可能破坏了堆栈。你仔细检查你的SHELLCODE执行的每一步,看看有没有什么地方导致堆栈被破坏呢。

因为堆栈被破坏了。所以即使你强制跳回了EXE领空正确地址,但是仍然执行错误。
2011-5-5 15:46
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
8
原dllmain 最好不要调用 loadlibrary...要答案 直接百度,你就知道为什么....a.dll调用b.dll
它 加载b 后  会 顺便 加载 引用dll 就是a
2011-5-5 16:01
0
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
学习了。原来还真不了解这个情况。顺便发下百度到的资料吧:http://hi.baidu.com/smile8021/blog/item/f43f83951723d40b7bf480f2.html

不过也并不是绝对不允许在DLLMain中调用LoadLibrary,因为A.DLL的DllMain中调用LoadLibrary B.DLL时一般不会出现BUG,只有在B.DLL中也需要调用A中的导出函数时才会引起BUG。

您所说的:a.dll调用b.dll它 加载b 后  会 顺便 加载 引用dll 就是a。此时如果B.DLL没有导入A.DLL的任何函数,那么B.DLL也就不会再加载A.DLL。

所以,楼主还得考虑一下你自己写的DLL是否与原DLL无关。

不过从楼主提供的代码片段可以看到:A.DLL(加入ShellCode的原DLL)能够执行到自己DllMain的返回,所以斗胆猜测应该没有出现ycmint所说的情况。
2011-5-5 16:27
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很感谢你耐心的分析!

现在目前的问题主要是解决修改后的DLL能够正常被Regsvr32注册!因为原DLL没被我添加Shell Code之前能够正常被Regsvr32注册,但我添加Shell Code后就不能正常被Regsvr32注册。

而不能被Regsvr32注册的原因有哪些呢?
2011-5-5 18:10
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我自己的DLL可以添加到主程序(EXE)中,正常运行!

也可以用LPK正常加载执行!

但就是用这个DLL来加载我的DLL就出现错误·
2011-5-5 18:34
0
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
汗。。。现在我都有点不明白你的问题了。

A.EXE添加ShellCode加载C.DLL可以成功。
你在B.DLL中添加ShellCode加载C.DLL不能成功。

提问:首先你的B.DLL是如何被加载的呢?
我原来是认为你说的B.DLL是被A.EXE导入的。A.EXE初始化时自动加载B.DLL,同时B.DLL执行ShellCode加载C.DLL。C.DLL初始化完成后出错。

根据你后来的提问。我推测:你在B.DLL中添加ShellCode,然后用Regsvr32.exe注册B.DLL,期望在B.DLL注册时加载C.DLL,同时完成注册?

Regsvr32.exe基本没用过所以不清楚对DLL有什么要求。粗略百度了一下。貌似是注册COM组件的?COM组件的话貌似必须实现IUnKnown等接口啥的?

具体你想了解的话估计也是得OD跟踪对比下加ShellCode前后Regsvr32.exe的注册步骤了。
2011-5-5 20:14
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
A.exe加载B.dll是原版就是这样!

测试C.dll让A.exe也加载,(Shell code)成功!

测试A.exe用LPK加载C.dll,(劫持)成功!

而让B.dll加载C.dll,(Shell code)失败~!
2011-5-5 21:19
0
雪    币: 85
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
那和Regsvr32.exe有啥关系额?

加载不了我猜测的堆栈被破坏的可能有没有跟踪过呢?
2011-5-5 21:48
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我跟踪了一下,都不一样!

如果是堆栈被破坏,该怎么修复呢?
2011-5-5 23:00
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
麻烦知道的帮忙指点一下·!
2011-5-7 21:46
0
雪    币: 242
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
没办法解决~!

最后只好用Hook处理了
2011-5-11 14:14
0
游客
登录 | 注册 方可回帖
返回
//