加密与解密 调试篇 静态分析技术 (三)枚举/IDC/插件

目录

1.枚举类型

2.FLIRT

1.应用FLIRT签名

3.IDC脚本

IDC分析加密代码

 4.插件

5.IDA调试器

1.加载目标文件

 2.调试器界面

​编辑

3.调试跟踪

4.断点

5.跟踪

6.十六进制工具

Hiew

跳转

修改

保存

7.静态分析技术应用实例

1.爆破

8.逆向工程初步

1.移除报错对话框

 2.显示一个对话框 然后输出用户输出的内容

 3.修改字符串内容

4.修改序列号


1.枚举类型

这是一段c语言源代码

#include <stdio.h> 
int main(void)
{
	enum weekday { MONDAY, TUESDAY, WEDNESDAY, THUSDAY, FRIDAY, SATURDAY, SUNDAY }; 

	printf("%d,%d,%d,%d,%d,%d,%d",MONDAY,TUESDAY, WEDNESDAY, THUSDAY, FRIDAY, SATURDAY, SUNDAY );

	return 0;
}

 在IDA的反汇编中却成为了没有意义的数字

 因为是有规律的 所以我们可以使用枚举类型来表示这个数字

View ->Open subviews->Enumerations->Shift+0

插入一个新的weekday

然后在 weekday枚举中 按N

 我们重新选择需要定义的数据处

 

Edit->Operand types->Enum member 

 

 如果我们想在操作数类型中重新定义现有数据

Edit->Operand types -> Enum member /按M/右键->Symbolic constant

2.FLIRT

FLIRT(库文件快速识别与鉴定技术)

可以让IDA在一系列编译器的标准库文件里自动找出调用的函数,使反汇编更加清晰

1.应用FLIRT签名

一般反汇编 无法给出具体函数名字

例如

C语言 strlen 函数
在一般中 可能只会显示

call 406E40

这样的反汇编虽然正确但是没有意义

而IDA中FLIRT却可以正确标记所调用的库函数名称

call strlen

IDA通常可以识别一些编译器 但是不一定成功

1. 反汇编一些特定版本编译器产生的程序 

例如 微软的记事本

2. 程序中的编译器资料被删除了

例如 高级语言编写的病毒程序

3. 编译器不支持导致识别失败

打开随书文件

 我们假设这里的call无法识别

我们主要要学会如何载入

View->Open subviews->Signatures /shift +F5

 Apply new signature

 选中后应该是会自动重新分析代码

如果没有

Options -> Analysis  -> Reanalyse program

3.IDC脚本

IDA可以使用脚本来提升控制

IDA支持两个语言编写脚本 IDC、pyhton

IDA的原始嵌入脚本语言叫做IDC

IDC原本就是一种类C语言的脚本控制器、语法和C语言类似

IDC的脚本中都一条包含ida.idc语句

这是IDA的标准库函数

变量定义形式为 auto var

其他逻辑、循环等语句与C语言类似

随书带有3个例子

我们看看第二个

IDC分析加密代码

载入程序

分析一下入口代码

 

 

 这里我们能发现 sub_401080       是对 sub_401060的解密

这段代码利用了 SMC (自己修改自己代码技术)

可执行文件中保存着加密文件 然后只有在程序运行 才会通过一处返回正确的代码


call  解密子程序
call  解密后的子程序

我们分析一下解密代码

.text:00401080 ; =============== S U B R O U T I N E =======================================
.text:00401080
.text:00401080
.text:00401080 sub_401080      proc near               ; CODE XREF: sub_401020+6↑p
.text:00401080                 mov     eax, offset loc_401060
 
eax中存入 401060

.text:00401085
.text:00401085 loc_401085:                             ; CODE XREF: sub_401080+14↓j
.text:00401085                 mov     bl, [eax]

把eax中的401060首地址 放入 bl

.text:00401087                 xor     bl, 1

和1进行异或

.text:0040108A                 mov     [eax], bl

把异或后的结果存回eax的地址

.text:0040108C                 inc     eax

把eax的地址进入下一个字节

.text:0040108D                 cmp     eax, (offset loc_401070+4)

检查待查的指令是否结束

.text:00401092                 jg      short locret_401096

结束就调到 401096

.text:00401094                 jmp     short loc_401085

没有就继续

.text:00401096 ; ---------------------------------------------------------------------------
.text:00401096
.text:00401096 locret_401096:                          ; CODE XREF: sub_401080+12↑j
.text:00401096                 retn
.text:00401096 sub_401080      endp
.text:00401096
.text:00401096 ; ---------------------------------------------------------------------------

我们使用随书的代码


#include <idc.idc>
static decrypt(from, size, key ) { 
   auto i, x; 
   for ( i=0; i < size; i=i+1 ) { 
      x = Byte(from); 
      x = (x^key); 
      PatchByte(from,x); 
      from = from + 1;
   } 
 Message("\n" + "Decrypt Complete\n");
} 

 

File->Script file

File->Script command /shift +F12

 run

然后重新对 401060 进行分析

选中 401060的代码 然后U 然后重新选中 按 C

就可以出现解密后的代码了

在实际环境中

大多数程序的加密都比这复杂

但是思路都是一样

通过汇编看看是如何解密 然后就写出脚本来解密即可


在IDA中 对于由 SMC和其他加密技术的代码 也可以使用其他方式来解密

(OllyDbg的动态调试)然后通过IDA的"Additional binary file" 将解密文件程序加载

这样就会比自己写代码来的有效

 4.插件

这里我们就介绍一个插件

已经集成在IDA中了

Hex-Rays

在进行IDA反汇编分析前

View->Open Subviews-> F5/Pseudocode

 这样就能返回高级语言

5.IDA调试器

1.加载目标文件

Debugger->Select Debugger

选中 Local Windows debugger

 

 2.调试器界面

3.调试跟踪

IDA快捷键
F7单步步进,遇到call指令时跟进
F8单步步过,遇到call指令时路过,不跟进
F4运行到光标所在行
Ctrl+F7直到该函数返回时才停止
F9运行程序
Ctrl+F2终止一个正在运行的程序
F2设置断点

4.断点

F2进行断点

Debugger -> Breakpoints -> Breakpoints List

也支持条件断点

设置断点后 

右键 -> Edit Breakpoints


5.跟踪

IDA分为两个分类

一类是 指令跟踪

Debugger -> Taceing -> Instruction Tracing


IDA负责 记录地址、指令和寄存器的值


另一类是函数跟踪

Debugger -> Tracing -> Function Tracing

6.十六进制工具

HexWorkshop ,WinHex,Hiew

HexWorkshop:
提供了文件比较功能

WinHex:
可以查看内存映像文件

Hiew:
可以在汇编状态下修改代码

Hiew

修改指令

按 ENTER 可以在十六进制 文本 汇编代码中循环切换

F1可以查看帮助

注意跳转指令 
jmp xxxx 将转换成 0E9 xx xx的形式

所以 近转移 jmp指令 0EB
需要按照 jmp short xxxxx 或者 jmps xxxxx的形式输入


远转移指令的形式是 jmp xxxxx
其中 xxxxx是文件偏移地址


如果将近转移指令写出长指令形式
或者将偏移地址写成虚拟地址 在 Hiew中可能没有问题
但是执行就会出错

这里给出例子来修改指令

为 ReverseMe增加 水平和垂直滚动条

滚动条的显示 是通过 CreateWindowsEx函数来控制

 

 发现这里是调用 CreateWindowsExA的参数等

而如果我们需要显示滚动条

只需要dwStyle参数加入 WS_HSCROLL和WS_VSCROLL两个参数即可

两个参数在 winuser.h的参数是这些

因为要加上这两个 所以通过OR运算来加入数值 计算机就识别然后添加

所以我们只需要在 0040109E中写入

00CF0000h OR 100000h OR 200000h
=00FF0000h

我们通过 Hiew打开文件

跳转

F5-> .40109E

修改

F3进入编辑状态

F2 或者在 行上按ENTER

进入修改汇编

 按 ENTER ESC即可

保存

F9存盘

 这样就出现了 滚动框

7.静态分析技术应用实例

1.爆破

 打开ida        

主要通过报错的地方来修改

对比的核心代码

 我们只需要对jnz 修改为 nop 他就会执行下面的OK

修改汇编

Edit -> Patch program -> Assemble

应用到程序

Edit -> Patch program -> Apply patches to input file

 2.算法

 

 

 能发现就是对 String2进行比对 然后上面 String2 又是 9981

 

 所以序列号就是 9981

8.逆向工程初步

要求:
1.移除报错对话框
2.显示一个对话框 然后输出用户输出的内容
3.显示对话框 告知用户输入错误还是正确
4.修改 not reversed 为 - reversed -
5.修改序列号为 pediy

1.移除报错对话框

首先通过字符串窗口查看

text:0040123B loc_40123B:                             ; DATA XREF: sub_401110+FC↑o
.text:0040123B                 push    0               ; uType
获取消息样式
.text:0040123D                 push    offset Caption  ; "ReverseMe #1"
标题
.text:00401242                 push    offset aOkayForNowMiss ; "Okay, for now, mission failed !"
文本内容
.text:00401247                 push    0               ; hWnd
父窗口句柄
.text:00401249                 call    MessageBoxA
显示窗口

我们只需要直接修改跳转到 MessageBoxA函数执行完的地址即可绕过

jmp 0040124Eh

 

 2.显示一个对话框 然后输出用户输出的内容

首先 先了解程序用什么api来获取输入

在input窗口中

 发现了GetWindowsTextA

我们进入看看

t:00401202                 cmp     ax, 3
.text:00401206                 jnz     loc_4012EC
.text:0040120C                 mov     eax, offset loc_40123B
存入40123B地址
.text:00401211                 jmp     eax
跳到 40123B
.text:00401213 ; ---------------------------------------------------------------------------
.text:00401213                 push    200h            ; nMaxCount
获取字符串长度
.text:00401218                 push    offset Text     ; lpString
获取缓冲区地址
.text:0040121D                 push    hWnd            ; hWnd
获取句柄
.text:00401223                 call    GetWindowTextA
获取文本
.text:00401228                 push    0               ; uType
.text:0040122A                 push    offset Caption  ; "ReverseMe #1"
.text:0040122F                 push    offset Text     ; lpText
.text:00401234                 push    0               ; hWnd
.text:00401236                 call    MessageBoxA

 这里明显无法执行 因为跳转到了40123B 所以我们把跳转 nop即可

 

 3.修改字符串内容

使用 HexWorkshop搜索 Not Reversed

 修改为 - Reversed -

同时搜索 bad 和 good

修改

 保存即可

 在保存后放入ida

发现已经修改了

4.修改序列号

修改序列号要通过修改汇编代码来完成

Hiew

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值