本文先教大家IDA的重要技巧,在文章最后我们通过暴力破解一个CrackMe程序来巩固所学知识!
用IDA打开程序CrackMe.exe,下载链接如下:
CrackMe破解联系程序1-系统安全文档类资源-CSDN下载
这是一个32位的程序,直接用IDA x32打开,选项均默认即可:
待IDA分析完成后,我们开始介绍各个子窗口的用法:
一、IDA子窗口功能介绍:
1、反汇编窗口
中间红框框住的就是反汇编窗口,一种是图形模式,一种是文本模式,在窗口内右键可以切换:
2、Functions 函数窗口:
主窗口左侧为函数窗口,显示了程序中所有的函数,有的是系统API,有的则是程序自身实现的。支持搜索。
3、Imports 导入函数窗口
该窗口内的函数是该程序的导入表,也就是依赖于其他DLL导出,而本程序依赖的,比如各种系统API,此窗口很重要。
4、Exports 导出表函数窗口
与导入表函数窗口对应,此窗口对应导出程序的导出表,对于exe而言,导出表只有一个start函数,而DLL可能就有很多导出函数了。
5、Names 全局函数窗口
此窗口展示的是程序内部的全局函数
6、Strings 字符串窗口
此窗口中显示的字符串,是程序内部定义的各种字符串常量, 默认是ANSI编码,可以在切换成Unicode,但需要重启该窗口:
确认后要重启Strings窗口。
二、C语言伪代码:
在Names窗口随便点击一个函数,进入后按F5,即可生成C语言的伪代码,以辅助我们分析,很方便。
其他窗口的函数也可以,但若程序不是C/C++写的,有可能无法生成伪代码,有时候即便是C/C++编写的也可能无法识别,这是正常的。
三、交叉引用
我们进入到Imports窗口,双机MessageBoxA函数,右键菜单,选择(List Cross Reference to),即枚举在程序用调用该API的代码段,此功能非常重要
显然,在这个程序中只有一个地方调用了MessageBoxA,双机即可跳转过去。
四、用IDA逆向分析实战
本文重头戏来了,我们双机运行程序看看功能,
点最左边的按钮
要求输入名字和序列号,如果输入错误就会报错
开始分析:
很明显,这是一个MessageBox弹窗,我们先从Imports导入表窗口入手,看MessageBoxA或MessageBoxW的调用:
根据函数名排序,我们发现有两个MessageBoxA函数,我们依次看一下该函数的交叉引用,先跟第一个:
这个函数是一个MessageBoxA的声明:
我们再在该函数XREF上右键,查看交叉引用:
发现,此处代码并非我们想要的结果!
回到导入表窗口,我们跟进第二个MessageBoxA:
像上一步那样跟踪,我们发现确实有两处调用,但不能确定,故我们换一种方法。
我们这次用更简单粗暴的方法,我们可以看到这里有失败弹窗
我们查看字符串窗口,发现有这个字符串:
跟进并查看引用,发现有如下汇编代码:
我们按F5查看伪代码:
经分析,我们把这段代码改成强制跳转,绕过报错:
选中本行汇编:
将jge改成jmp确定即可:
我们再F5查看一下伪代码:
我们还需要处理if..else这个判断:
经分析,我们只需要将这个跳转指令改成空指令即可,然后可以直接达到暴力破解的效果:
用上面修改汇编的方法,再来一次,jnz等同于两个nop指令,
修改完成后是这样的:
看一下伪代码,确认一下:
OK,没有问题, 关掉我们启动的CrackMe程序,保存我们的修改:
此时,我们再运行一下CrackMe这个程序:
发现直接就成功啦!由于本次只使用静态分析工具,并未动静结合,然仍能搞定暴力破解,可见静态分析工具的厉害之处。
对了,顺便提一下,在IDA中ESC键是返回上一步。
还有,本文已经破解了左边那个功能,右边的就交给你练手啦!