免杀的艺术-C 语言、PE

Oyst3r 于 2023-12-15 发布

前言

就是可能接下来就会去跟踪一些函数,然后去慢慢的调试一些东西,接下来的话可能就是以实践为主的多一点了,但这些实战小例子的前提就是对 C 语言和 PE 的格式等有一定基础的了解,这个还是有点不明白的话可以去看一下我之前写的有关于这方面内容的一些解释,然后再继续往下看,这篇文章的话还是去写写用到的一些好用的工具吧,然后简单做个说明。

PE 相关的

PETool

PETool 1.0.0.5下载

这个工具的话唯一的优点就是很小巧,也是我最开始去做 PE 练习的小工具,很小巧但是功能点是一点也不少,学完 PE 的话我觉得再学学 Windows 的图形化界面,做一个这个东西肯定还是轻轻松松的,然后这个导出表是看不了的,这点注意

LordPE

LordPE下载

这个和上面这个差不多,唯一多的功能就是可以很清楚的查看到导出表和重定位表,其他功能上都差不多

010 编辑器

这个有点大,上传不了,建议去吾爱破解上面下一个汉化的,然后想办法自己去破解一下,这个的话是我目前用过所有的二进制编辑器里面最好用的,它会自动区分 PE 的每一个块,然后在里面会加上上面两款工具的一些功能,能很清晰的看出每一个数据对应的 PE 结构的哪个位置,这个就是可以很方便的手动去加壳子

CFF

CFF_Explorer下载

这个 PE 的查看器应该是目前用到的 UI 界面最满意的,而且有改数据的功能,每一个小模块都会独立的把内存的数据给出来,非常方便,也很小巧

小工具还有很多很多,剩下的一些之后慢慢分享吧

动态调试

静态分析的话那就是 ida,动态的话还是 dgb 用顺手了,当然吾爱上面也有很多其他的比如 od 也很不错的,但这种东西就是一通百通吧,顶多快捷键不太一样,功能点都大差不差(主要看插件哈哈哈哈哈),接下来就简单说说 dbg 吧

窗口

主界面就是这几个窗口,CPU 汇编代码窗口, Symbols 模块列表窗口,Dump1-dump5 数据查看窗口, 寄存器窗口, 堆栈窗口,breakPoints 断点列表窗口,内存窗口的话本身就是给的比较多,确实调程序得一直在内存窗口中转来转去的,多一点方便一点

快捷键

1、 Ctrl + G 转到地址,计算表达式的值
2、 H 高亮显示(使用方法:按下 H 后,会出现一个红框,双击要高亮的显示的文字,就可以高亮显示)
3、 F4 运行到当前选中的行
4、 F2 下断点
5、 F7 单步步入
6、 F8 单步步过
7、 F9 运行
8、 CTRL + F9 执行到本函数的返回处,也就是遇到本函数 RET 指令停下
9、 * 转到 RIP 指向地址,也就是但钱汇编指令所在地址
10、 ; 给当前选中的行添加注释
11、 查找常量或字符串
汇编窗口右击->选择“当前区域”或“当前模块”或“所有模块”-> “常数”或者字符串

一些设置

断点不用选系统,就选下面这两个就行了

仅在 CIP 处显示自动注释——勾选之后界面会更整洁,该有的自动注释也还是有的,自行体验取舍

杂项

其他选项根据个人需要调整,一般保持默认,可以将搜索引擎改为百度:https://www.baidu.com/s?wd=@topic 遇到不认识的函数选中,右键,符号名称帮助,直接进行查询

修改及保存

1、鼠标选中需要修改的汇编代码(可选中多行),选择“二进制” -> “编辑”(或者使用快捷键 Ctrl + E)

2、修改十六进制代码后,按下快捷键 CTRL+ P,或者右击,选择“补丁”,弹出“补丁对话框”,然后点保存你即可

插入

1、切换到”CPU”标签页,右击选择“二进制”–>“填充”(或者直接按下快捷键 F)

2、如果想把某几行用用 nop 空指令填充,选中要填充的行(可多行)可以选择“二进制”=》“用 NOP 填充”(或者快捷键 Ctrl + 9)

然后这个的话其实还是在原有代码的基础上面去改一些东西,肯定不能说是直接在该个地址之前去插入一些新的代码,地址都是计算好的不能乱动,那怎么办呢,下面给个解决办法

找一片空白的空间,写你的汇编代码,可以跳转到这段代码执行,然后再跳转回去,注意不要破坏原来的寄存器的环境,用 pushad 和 popad 指令

原始的代码

0037143E    push eax                     kernel32.BaseThreadInitThunk
0037143F    push offset 数组.??_C@_02DPKJAMEF@?$CFd?$A>; ASCII "%d"
00371444    call dword ptr ds:[<&MSVCR120D.scanf_s>] ; msvcr120.scanf_s
0037144A    add esp,0x8               跳转到添加的代码
0037144D    cmp esi,esp
0037144F    call 数组.0037114A

修改的代码

00B0143E     push eax                                 ; kernel32.BaseThreadInitThunk
00B0143F     push offset 数组_-_???_C@_02DPKJAMEF@?$CFd>; ASCII "%d"
00B01444    call dword ptr ds:[<&MSVCR120D.scanf_s>] ; msvcr120.scanf_s
00B0144A     jmp 数组_-_?00B04DBD   修改之后,变成了一行代码,跳转到添加的代码段
00B0144F    call 数组_-_?00B0114A

在空白处新加的代码

00B04DBB    add byte ptr ds:[eax],al
00B04DBD    add esp,0x8                              ; 保存前五个字节
00B04DC0    cmp esi,esp
00B04DC2    push 0x0                                 ; MessagBox函数
00B04DC4    push 0x0
00B04DC6    push 0x0
00B04DC8    push 0x0
00B04DCA    all user32.MessageBoxW
00B04DCF     jmp 数组_-_?00B0144F           ; 跳转回之前的代码下一行
00B04DD4    nop
00B04DD5    add byte ptr ds:[eax],al

查找

右键代码后,依次单击以下的按钮

然后搜就完了

下断点调试

这个的话等下一篇文章吧,会带大家亲手去调一次程序感受感受,也不想重复写两遍了。