背景知识
常用汇编指令
1、mov
move指令用于将数据从源地址复制到目的地址,但是该数据不会从源位置移除,语法格式:
Mov <dest>,<source>
不能直接将数据从内存移动到某个段寄存器中,必须要用通用寄存器作为中间跳板
Mov eax,1234h
Mov cs, ax
2、add和sub
add用于将源与目的地相加,并将结果存在目的地中。sub命令用于将源从目的中减去,并将结果存在目的地中。
语法格式:
Add <dest>,<source>
Sub <dest>,<source>
实例:
add eax,51h
sub eax,51h
3、push与pop
压栈和弹栈
语法格式:
push <value>
pop <dest>
4、xor
xor命令用于按位逻辑异或运算,二进制位相同为0,不同为1。因此xor常用将寄存器或内存位置的值置为0.例如xor eax,eax
,此操作会将eax置为0,比mov eax, 0
更省内存,效率更高。
语法格式:
xor <dest>,<source>
跳转指令
5、jne\je\jz\jnz\jmp
jne\je\jz\jnz\jmp是根据eflag将程序的流程分支到另一个位置,
命令格式 | 作用 |
---|---|
jne <dest> | 不等于则跳转 |
jnz <dest> | 不等于0则跳转 |
je <dest> | 等于则跳转 |
jz <dest> | 等于0则跳转 |
jmp | 无条件跳转 |
6、call与ret
call命令用于调用函数,ret用在函数末尾处将控制流程返回到call之后的那条命令
语法格式:
call <dest>
ret
7、inc和dec
Inc和dec用于将目的操作数递增或递减,其作用类似a++
和a--
语法格式:
inc <dest>
dec <desy>
8、lea
lea命令用于将源操作数的实际地址加载到目的操作数中。
语法格式:
lea <dest>,<source>
9、int
int命令用于向处理器抛出一个系统中断信号,常用的中断信号是0x80,它用于向内核发送系统调用。
实验环境
Windows xp sp2系统
实验目的
本实验主要介绍了代码流程的分析与key值得获取,通过本实验的学习将会了解到静态文本分析的常用方法、策略,学会静态代码分析工具IDA的使用。
实验步骤
如果想要成为一名出色的恶意代码分析师,我们需要掌握很多反汇编的工具,一般的反汇编工具分为动态分析工具,例如著名的OllyDbg,而在静态分析方面,就属大名鼎鼎的IDA了,IDA以其强大的功能和众多的插件成为了很多逆向分析师的首选。IDA pro是商业产品,不过IDA也提供了评估试用版本,高级功能上可能有些限制,可以到https://www.hex-rays.com/products/ida/去下载。本实验使用的是IDA Demo 6.6 for MS Windows评估版本。
任何一个伟大的成就,往往有一个很不起眼的开始。通过本课程的学习,你将会掌握到:
1 学会IDA常用功能和快捷键
2 学会查看字符串。
3 学会利用函数窗口定位函数和重命名
4 学会使用交叉引用这个功能
5 利用上述技巧分析一个小的demo程序,并找到最终的key
步骤一:熟悉IDA界面和常用模块
步骤二:函数重命名和数值转化
1、函数重命名
有时候IDA无法分析出程序子函数的功能,只能以sub_
为前缀命名,这样不便于代码分析。IDA提供了函数重命名的方法,可以在分析完子程序之后对其进行重命名,这样有利于代码管理。
在main函数中有条指令call sub_40100
,sub表明这条语句为函数,双击该语句,按下n
键,输入合适的函数名。
左侧的函数名也会发生变化。
2、数值转化
内存中存放的二进制数可以被解释成8进制、16进制、字符串、整型等,IDA不能完全智能判断数据类型,不过可以使用数值转化建。
如下图所示:
如果需要将0ch转化为10进制,可以通过右键选择,也可直接在0ch处按下h键,也可来回切换。
IDA中的右键是常用的功能键,点击右键之后一般就会有相应的快捷键提醒。
步骤三:分析程序执行流程与key值
- 点击main函数,main函数是程序的入口函数
- 查看程序的流程图:
由图上蓝色箭头可以看出,整个程序唯一的出口是loc_401055
处。
影响跳转的地方是jnz short_local401055
,jnz
是指不为0的时候跳转,根据上一条的test eax,eax
来判断。eax
是一个函数返回值存放的位置,将刚刚我们更改过的函数名改为check,接下来进入该函数
IDA中只能将函数中的局部变量命名为var_
,将参数命名为arg_
,所以mov ecx,[esp+arg_0]
表示取出参数值并放入ecx
中,然后xor eax,eax
是将eax
置为0,cmp
是将函数调用的参数ecx
和4D2H比较。接下来程序判断jnz,当值不相等是就会跳转到locret_401013
处,程序返回。此处eax值为0,执行像一条指令,将eax置为1返回。
check函数的作用就是检查参数的值,如果等于1234则返回1,否则返回0。
按esc
键返回到main函数查看参数含义。从最上方的注释“please input the key”,和下方ida提示的call scanf以及”%d”可以确认这是一个数字。
接下来mov指令将输入的参数存入到ecx中然后push到堆栈上。整个程序流程为:输入数字,检测是否为1234,如果不是则循环输入并检查,直到输入1234,key值就是1234.
分析与思考
1)IDA和OD相比,有什么缺点和优点,理解这些有助于你将来将两者结合使用。
动态调试,OD更为灵活和强大,而静态调试王者是IDA。
课后习题