好友
阅读权限40
听众
最后登录1970-1-1
|
本帖最后由 ps520 于 2011-6-7 23:22 编辑
首先向goldsun致敬~~感谢金太阳大人的指教
--------------------------------------
我们知道,在壳的保护中,有一个叫做Anti-Hook,也有叫虚拟Api的,就是通过壳自身Load程序所需函数,然后完成调用等工作
这样导致Hook找到的并非我们所执行的函数。而在马甲Dll上,我们是否可以通过这个思想来完成不模拟所有的劫持dll的接口也可以
马甲马甲呢?答案是肯定的。
首先将我的一点点拙见及实现代码贴一下,后面提供goldsun的一个方法:
由于我Hook的针对性,我只处理了LoadLibraryA,这样就导致通过LdrLoadDll(导入表就是调用这个函数,也是LoadLibraryA的原型)
加载的dll无法被模拟,如果你有相关资料,那么你可以完成更为深入的研究。
感谢吴涛老大设计的E语言API调用格式,让我们的Hook多了个GetProcAddress,正是这个函数让我们劫持非黑月程序更加方便(黑月直接添加的导入表)
首先请允许我简单介绍一下易语言API调用流程:
LoadLibraryA->GetProcAddress->存表,如果这里不处理将会提示没找到dll,我以前就是因为这个差点放弃相关研究
*注意,这个模式是通过E语言自带的API声明来调用DLL所特有的
介绍一下模拟Dll实现马甲DLL的思想吧:
我们知道Dll的函数被调用最终都要靠DLL的Handle来查找函数,也就是说如果我们把马甲dll的handle改成原始dll的handle,那么
函数查找时就会直接找原始dll的,而不是马甲dll的,这样我们就避免了去声明被模拟dll的函数,也省去了很多功夫。
那么我们应该怎么做呢?
首先,取自身(马甲dll)的handle,然后手工Load一下被劫持dll,获得handle。
然后Hook GetProcAddress\GetModuhandleA\LoadLibraryA(最好是Hook LdrLoadDll,因为这个可以实现通用)
当发现目标在调用这些函数试图获取被劫持dll信息时,我们直接将其handle等赋值为被劫持dll的信息。比如:
GetProcAddress(handle,"test")
handle换成被劫持dll的handle
这样程序就会去查被劫持对象,而不是查我们的马甲,这样就避免了马甲要声明很多API,尤其是模拟某些系统dll时,你们懂的……
具体的东西看代码:.版本 2
hook1.安装 (“kernel32.dll”, “GetProcAddress”, &my_GetProcAddress)
hook2.安装 (“kernel32.dll”, “GetModuleHandleA”, &my_GetModuleHanleA)
handle [1] = LoadLibraryA (“test.dll”)
handle [2] = LoadLibraryA (“test1.dll”)
信息框 (“大哥,你确实执行的是我……”, 0, )
.版本 2
.子程序 my_GetProcAddress, 整数型
.参数 a, 整数型
.参数 b, 整数型
.判断开始 (a = handle [1])
a = handle [2]
.默认
.判断结束
返回 (hook1.原函数 (a, b))
.版本 2
.子程序 my_GetModuleHanleA, 整数型
.参数 dllname, 整数型
.局部变量 temp, 文本型
temp = 指针到文本 (dllname)
.判断开始 (寻找文本 (到小写 (temp), “test.dll”, , 假) ≠ -1)
返回 (handle [2])
.默认
返回 (hook2.原函数 (dllname))
.判断结束
附带一份E语言的测试源码供各位喷血。。
goldsun的思想是:通过修改存储DLL handle的handlelist达到一劳永逸,不过这个涉及到很多PE相关的知识,我还木有达到那个级别……囧- -。只能研究到这里了。
如果相逢只是为了失之交臂,我愿意倾尽一生等待那一个机会。
越像,越证明不是。
晓泪不懂妆浓,风清融入雨中。
|
-
-
桌面.rar
57.49 KB, 下载次数: 115, 下载积分: 吾爱币 -1 CB
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|