目录
1.枚举类型
2.FLIRT
1.应用FLIRT签名
3.IDC脚本
IDC分析加密代码
4.插件
5.IDA调试器
1.加载目标文件
2.调试器界面
编辑
3.调试跟踪
4.断点
5.跟踪
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.调试跟踪
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