能力值:
( 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强大。。。^_^)。
祝你早日解决问题。解决了也告知下解决方法哈。^_^
能力值:
( LV2,RANK:10 )
3 楼
push tyui 。。。。。。。。
能力值:
( LV2,RANK:10 )
4 楼
我自己的DLL如果让主程序(程序)加载(添加Shell code 的方法)的话,可以正常执行并正常运行。同样的方法,我用自己的DLL让主程序调用的DLL去加载,我自己的DLL代码也会执行,但执行完就会提示“Automation 错误”。用Relox重定位,也是一样的错误。
具体是什么原因也不清楚!
能力值:
( LV3,RANK:30 )
5 楼
这个。。。你试试看用OD跟踪看看。你的DLL的代码执行完毕后返回到哪里去了。如果返回到原DLL入口点应该不会有问题了呀。。。我也不是很清出这个问题了。。。慢慢调试看看呢。呵呵。
能力值:
( 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注册,修改后注册就闪一下就没了!
能力值:
( LV3,RANK:30 )
7 楼
根据你说的情况我做如下猜测:
EXE调用原DLL,原DLL执行SHELLCODE调用你的DLL并初始化,SHELLCODE执行完毕跳转到原DLL的原始入口点执行原DLL初始化,初始化完成根据堆栈返回地址返回EXE领空。
从你提供的代码片段来看,能够执行到“原DLL初始化”这一步并且完成了初始化。问题在于跳回EXE领空是跳错了地方。所以我猜测你的SHELLCODE可能破坏了堆栈。你仔细检查你的SHELLCODE执行的每一步,看看有没有什么地方导致堆栈被破坏呢。
因为堆栈被破坏了。所以即使你强制跳回了EXE领空正确地址,但是仍然执行错误。
能力值:
( LV13,RANK:260 )
8 楼
原dllmain 最好不要调用 loadlibrary...要答案 直接百度,你就知道为什么....a.dll调用b.dll
它 加载b 后 会 顺便 加载 引用dll 就是a
能力值:
( 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所说的情况。
能力值:
( LV2,RANK:10 )
10 楼
很感谢你耐心的分析!
现在目前的问题主要是解决修改后的DLL能够正常被Regsvr32注册!因为原DLL没被我添加Shell Code之前能够正常被Regsvr32注册,但我添加Shell Code后就不能正常被Regsvr32注册。 而不能被Regsvr32注册的原因有哪些呢?
能力值:
( LV2,RANK:10 )
11 楼
我自己的DLL可以添加到主程序(EXE)中,正常运行!
也可以用LPK正常加载执行!
但就是用这个DLL来加载我的DLL就出现错误·
能力值:
( 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的注册步骤了。
能力值:
( 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)失败~!
能力值:
( LV3,RANK:30 )
14 楼
那和Regsvr32.exe有啥关系额?
加载不了我猜测的堆栈被破坏的可能有没有跟踪过呢?
能力值:
( LV2,RANK:10 )
15 楼
我跟踪了一下,都不一样!
如果是堆栈被破坏,该怎么修复呢?
能力值:
( LV2,RANK:10 )
16 楼
麻烦知道的帮忙指点一下·!
能力值:
( LV2,RANK:10 )
17 楼
没办法解决~!
最后只好用Hook处理了