逆向工程 打造免杀后门(续《逆向工程 打造隐蔽后门》)



逆向工程 打造免杀后门(续《逆向工程 打造隐蔽后门》)

文章作者:无敌最寂寞[-273℃@EST]
信息来源:邪恶八进制 中国


 
以前在x上发表过一篇《逆向工程 打造隐蔽后门》的文章,讲述了如何在一个可执行文件中嵌入后门代码的方法。但是这种方法很有可能被杀毒软件给查到,因此这次我们要打造免杀的后门。

  先看看我们需要什么“家伙”:

Olly debug 1.10b 汉化版 —— 逆向的主要工具
UltraEdit —— 经典的16进制编辑器
PEDITOR v1.7 —— PE文件编辑工具
dcmd —— 一个简单的邦定81端口的后门,会被瑞星查杀

                         
一、原理简介


其实方法有点和上一篇打造隐蔽后门中的方法类似:首先需要在可执行文件中找到一些“空”地,这里添加我们的加/解密代码,然后修改入口地址处的指令,使用一个jmp指令调转到我们添加的代码处执行,这样就可以对前面的后门代码进行加/解密。执行完我们的代码后,再跳回到程序入口处的未被修改的第一条指令。如图一:

大家可以参考《逆向工程 打造隐蔽后门》。


                            二、打造实战

原理简单介绍完了,俗话说光说不练假把式,那咱们就操练起来。首先用olly debug打开我们的后门程序dcmd,如图二。

好了,我们先把入口处的一小段数据备份出来(以防万一嘛,至于复制多少你自己看着办吧^_^),如图三。

接着我们需要看看我们是否具有对该代码段的写权限,如何检测呢?向后托动olly的窗口滚动条,找到如图四的地方(前篇文章中提到的“dead space”),

在004011f0地址处按空格键打开汇编窗口,输入下面的指令:
mov dword ptr ds:[4011f0],90909090
这条指令运行后会往004011f0地址出写入4字节的90,如果写入成功说明是可以写入的,否则就是不可写入的。那么不可写入怎么办呢?稍后我们再说。OK,右键单击我们输入的指令->“此处新建IP”,如图五。

然后按下F7键来运行这条指令,结果如图六。

呵呵,是可以写入的。那么我们接下来就就可以继续打造了,下面我们要确定需要加密的代码部分了。回到程序入口处,因为我们后面还要修改入口处的指令为一个跳转指令,因此需要加/解密的开始部分应该往后选,找到0040101F   $ 55         PUSH EBP,我们就从这里开始加密吧。接着确定加/解密的结束部分,往后翻看代码到如图七的部分。

看到下面的一行了:
结构 'IMAGE_IMPORT_DESCRIPTOR'
这个结构就是IAT了(Import Address Table)就是PE文件格式中的导入表了。我们加/解密是不能包括IAT的(详细情况读者朋友可以去翻越PE方面的资料),因此结束部分我们就选择004010fe吧。到此为止,我们已经确定了需要加/解密的部分,接下来要确定我们的加密算法了。这里我们可以使用非常简单的异或作为我们的算法,因为异或有以下特性是不错的:

XOR SOURCE,KEY=DEST
XOR DEST,KEY=SOURCE

也就是说我们对SOURCE异或两次得到的结果还是SOURCE。算法确定后,我们在olly窗口中的004011f0处开始我们的加/解密程序吧,如下:

004011F0   B8 1F104000   MOV EAX,dcmd.0040101F     ;需要加/解密部分的起始地址          
004011F5   8030 0F     XOR BYTE PTR DS:[EAX],0F   ;与0f进行异或,这个0f读者朋友可以自由替换
004011F8   40         INC EAX               ;递增eax
004011F9   3D FE104000   CMP EAX,dcmd.004010FE     ;看看是不是到了加/解密部分的结束地址
004011FE   ^7E F5       JLE SHORT dcmd.004011F5   ;如果没到继续循环了


程序就这么简单,看上去很容易哦。。。这还没完呢继续回到olly上来,来到程序的入口地址处按空格键进行汇编,输入:jmp 004011f0,如图八。

这个时候拿出我们先前备份的那段代码进行比较,看看有哪些指令被覆盖了,如图九。

只有 SUB ESP,190一条指令被覆盖了,那么我们就要在加/解密代码的最后处把覆盖的指令添上,而且还要添加一条跳转指令,跳转回入口地址的下一条地址,完整代码如图十。


到这里,我们先保存一下吧。右键单击任意代码处选择复制到可执行文件->“全部修正”,结果如图十一。

好像出错了!这个错误的意思是我们的文件不够大无法保存我们修改的代码,那么我们得手工为这个文件增加点体积了。关掉olly,用ultraedit打开该文件,在文件的最后单击鼠标右键选择HEX插入与删除,弹出如图十二的对话框,

在字节数量的文本框中输入256,确定后如图十三,然后保存退出。接着用PEDITOR打开这个文件,单击Section按钮,弹出节表窗口里面只有一个.h4x节,右键单击这个节选择edit section,如图十四。

在弹出的对话框中在New Values栏中的Raw size改成00002e4(即加上256的16进制数0x100),如图十五。点击apply changes按钮后退出。


到此,我们已经给这个程序增加了100h个字节的长度了,下面我们再重复前面的步骤来修改这个文件,修改完后我们在dump一次看看,这次就没有错误提示了。OK!最后一项工作,我们需要先把这个文件进行加密,然后再dump到一个可执行文件里,这样下次它在运行的时候就会自动异或而还原回到原来的代码从而顺利执行。于是我们在olly中,找到我们添加的代码的第一条指令,在此新建EIP,然后往后在“SUB ESP,190”指令处设置断点,如图十六。

然后单击ollydebug的运行按钮,运行结束后如图十七。

看到了吗?我们制定的代码全部被异或了,OK!我们右键单击任意代码处选择复制到可执行文件->“全部修正”,这个时候出现了一个新的调试窗口,关闭它,会提示你是否保存,选择是,保存为“修改后的dcmd.exe”。下面我们分别用瑞星对dcmd.exe 和修改后的dcmd.exe杀毒,结果如图十八。

哈哈,是不是成功躲过了杀毒软件的追杀?我们运行一下修改后的dcmd.exe看看还能运行不?如图十九。

到此,整个过程都介绍完了。向心读者朋友应该可以打造自己的免杀后门了,如果碰到无法写入怎么办呢?这个也很好说,有一下两个办法可供读者参考:

1.使用VirtualProtect API函数。使用这种方法,需要读者在添加的加解密代码的前面使用此函数修改保护属性,使之可写,剩下的和上面介绍的一样了。这个函数的具体用法可以参阅MSDN,很简单的。我就不多说了。

2.使用PE编辑工具进行修改。这个方法应该比较适合一些新手朋友,还是用PEDITOR,我拿咱们这个修改后的dcmd.exe为例简单介绍一下吧。首先打开PEDITOR,打开我们的文件“修改后的dcmd.exe”,单击section按钮打开节表对话框,右键你想修改的节表,选择edit section弹出一个新的对话框,单击“char. wizard”按钮打开特性对话框,如图二十。

看到我红框框起的属性了吗?其中“writable”就是是否可写的,在这里已经是可写了,那么我们去掉它会怎么样呢?试试看,把“writable”前面的勾去掉,然后单击“take it”按钮,然后选择“apply changes”,退出PEDITOR,运行程序,如图二十一。

啊哦,引发了写保护错误。读者朋友看到这里,你应该会修改了吧?


三、结束语


又到了该说再见的时候了,青山不改,绿水常流,咱们后会有期了!欢迎大家来邪恶八进制交流!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第三卷************** 不错的PDF电子书,共3个分卷,点我名字可以找全 第1部分 逆向101 第1章 基础 3 1.1 什么是逆向工程 3 1.2 软件逆向工程逆向 4 1.3 逆向应用 4 1.3.1 与安全相关的逆向 5 1.3.2 软件开发中的逆向 8 1.4 底层软件 9 1.4.1 汇编语言 10 1.4.2 编译器 11 1.4.3 虚拟机和字节码 12 1.4.4 操作系统 13 1.5 逆向过程 13 1.5.1 系统级逆向 14 1.5.2 代码级逆向 14 1.6 工具 14 1.6.1 系统监控工具 15 1.6.2 反汇编器 15 1.6.3 调试器 15 1.6.4 反编译器 16 1.7 逆向合法吗? 17 1.7.1 互操作性 17 1.7.2 竞争 18 1.7.3 版权法 19 1.7.4 商业机密和专利权 20 1.7.5 美国数字千禧版权法 20 1.7.6 DMCA案例 22 1.7.7 许可证协议 23 1.8 代码范例与工具 23 1.9 结论 23 第2章 底层软件 25 2.1 高阶视角 26 2.1.1 程序结构 26 2.1.2 数据管理 29 2.1.3 控制流 32 2.1.4 高级语言 33 2.2 低阶视角 37 2.2.1 底层数据管理 37 2.2.2 控制流 43 2.3 汇编语言101 44 2.3.1 寄存器 44 2.3.2 标志位 46 2.3.3 指令格式 47 2.3.4 基本指令 48 2.3.5 范例 52 2.4 编译器和编译入门 53 2.4.1 定义编译器 54 2.4.2 编译器架构 55 2.4.3 列表文件 58 2.4.4 专用编译器 59 2.5 执行环境 60 2.5.1 软件执行环境(虚拟机) 60 2.5.2 现代处理器的硬件执行环境 63 2.6 结论 68 第3章 Windows基础知识 69 3.1 组件及基本架构 70 3.1.1 简要回顾 70 3.1.2 特征 70 3.1.3 支持的硬件 71 3.2 内存管理 71 3.2.1 虚拟内存和分页 72 3.2.2 工作集 74 3.2.3 内核内存和用户内存 74 3.2.4 内核内存空间 75 3.2.5 区段对象 77 3.2.6 VAD树 78 3.2.7 用户模式的内存分配 78 3.2.8 内存管理API 79 3.3 对象与句柄 80 命名对象 81 3.4 进程与线程 83 3.4.1 进程 84 3.4.2 线程 84 3.4.3 运行状态切换 85 3.4.4 同步对象 86 3.4.5 进程初始化顺序 87 3.5 应用程序编程接口 88 3.5.1 Win32 API 88 3.5.2 本地API 90 3.5.3 系统调用机制 91 3.6 可执行文件格式 93 3.6.1 基本概念 93 3.6.2 映像区段(Image Sections) 95 3.6.3 区段对齐(Section Alignment) 95 3.6.4 动态链接库 96 3.6.5 头部 97 3.6.6 导入与导出 99 3.6.7 目录 99 3.7 输入与输出 103 3.7.1 I/O系统 103 3.7.2 Win32子系统 104 3.8 结构化异常处理 105 3.9 结论 107 第4章 逆向工具 109 4.1 不同的逆向方法 110 4.1.1 离线代码分析 110 4.1.2 现场代码分析 110 4.2 反汇编器——ILDasm 110 4.3 调试器 116 4.3.1 用户模式调试器 118 4.3.2 内核模式调试器 122 4.4 反编译器 129 4.5 系统监控工具 129 4.6 修补工具 131 Hex Workshop 131 4.7 其他类型的逆向工具 133 可执行程序转储工具 133 4.8 结论 138 第2部分 应用逆向 第5章 未公开的技术 141 5.1 逆向和互操作性 142 5.2 基本原则 142 5.3 定位未公开的API函数 143 我们要找什么? 144 5.4 案例研究:NTDLL.DLL中的 5.4 Generic Table API 145 5.4.1 RtlInitializeGenericTable 146 5.4.2 RtlNumberGenericTableElements 151 5.4.3 RtlIsGenericTableEmpty 152 5.4.4 RtlGetElementGenericTable 153 5.4.5 RtlInsertElementGenericTable 168 5.4.6 RtlLookupElementGenericTable

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值