-
-
[旧帖]
[分享]改造的一款适合驱动的反汇编引擎
0.00雪花
-
发表于:
2013-7-9 15:41
2529
-
[旧帖] [分享]改造的一款适合驱动的反汇编引擎
0.00雪花
原帖地址:
http://www.mengwuji.net/forum.php?mod=viewthread&tid=230
作者:mengwuji
最近写个工具的需求,要用到某某反汇编引擎。
网上找了一下发现可用于内核的反汇编引擎不是很多,而且基本也不怎么样。
之前在用户层用过一个c++反汇编引擎貌似很强大,但是它只能在用户层使用。于是想着把它移植到内核里去,因为反汇编引擎不依赖环境,所以想法也没有错。
因为是c++的,拿到内核去就出现了一些问题。
1,最常见的问题,不能使用运行时函数。在我这里配置的编译环境,有些c或者c++字符串相关函数是不能被引用的,具体原因是因为这个c函数中可能用到了依赖于用户层的某些函数。所以在用c字符串相关函数要注意一下.......
2,在内核中,一个c++类不能声明成全局变量或者静态变量。因为声明成全局变量或静态变量的类在应用层都是先于mian函数之前初始化了,而且依赖于某些应用层的api函数进行的初始化工作。驱动不能调用运行时函数,所以在驱动中这样的声明要么直接链接时出现问题,要么链接不会出现问题但是运行驱动时会失败。
3,注意一些关键字,比如virtual。这个是声明成虚函数声明标记,驱动中试验了下不能使用虚函数,所以为了简单起见,还是不要使用它了。如果出现驱动启动失败的情况,请确认是否违反本条。
上面几条注意下就差不多了,但是因为我编译的时候上面的错误编译器都没明显指出链接出错,所以驱动编译成功但是加载失败十分让人头痛,根本很难找到原因(因为反汇编引擎是别人写的)。然后我想应该是调用了一些不该调用的东西,于是便在编译好的驱动中看导入表里面引用了什么函数,结果第一个问题成功排除。第二个问题折磨我有点长时间,看了下别人的资料最终完美解决了。第三个问题最让我头痛,让我找了相当久时间问题所在......因为生成驱动成功但是启动不成功,害我通过我常用的蠢办法慢慢找,找了很久后发现了是virtual关键字的问题,于是,解决之.....
还有,我注意到,如果驱动生成成功,但是出现一个警告:“warning LNK4210: 存在 .CRT 节;可能有未处理的静态初始值设定项或结束符”。那么注意了,你可能已经不能运行你的驱动了,违反了上面的第一条和第二天所致。
再次注意:声明静态的类变量和使用了virtual连上述所说的警告也没有,所以驱动启动失败没有上述警告可以看看是不是我说的这个原因。
废话说了很多,我把整理过的代码发上来,不过要注意一个地方。具体如下:
#ifndef _IS_RING0_
#define _IS_RING0_ 0
#endif
#ifndef _IS_RING0_
#define _FUNC_VIRTUAL virtual
#else
#define _FUNC_VIRTUAL
#endif
#ifdef _IS_RING0_
#include <ntifs.h>
#else
#include "windows.h"
#endif
这段宏定义是在MgAsmCom.h文件中,如果你是用户程序:
#ifndef _IS_RING0_
#define _IS_RING0_ 0
#endif
这三行直接删除就行了,如果是驱动记得一定要加上这三行。
下面附上文件。
Disasm.zip
欢迎大家来到本论坛(www.mengwuji.net),本论坛坚决不做坑爹的网站
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课