文章目录
- 一、前言
- 二、IDA下载安装
- 三、IDA使用
- 1、编写
- 2、将编译成so文件
- 3、用IDA打开so文件
- 4、找函数
- 四、实战
- 五、结束语
一、前言
之前一般是搞搞c#
、java
的反编译,比较方便。如果是用C/C++
写的dll
或so
,用什么工具来反编译呢?最有名的应该是IDA
了。
二、IDA下载安装
链接:/s/1NATDYzomBYiwrwdH6qBjUA
提取码:2dmy
IDA官网:/
三、IDA使用
1、编写
为了方便演示,我们先协议而简单的。
代码如下
#include <>
int AddInt(int a, int b)
{
return a + b;
}
void SayHello()
{
printf("hello world");
}
int main()
{
SayHello();
int sum = AddInt(1, 5);
printf("%d\n", sum);
return 0;
}
2、将编译成so文件
然后使用ndk-build
将其编译成.so
文件
具体如何编译so文件,要用到ndk-build
,可以参见我另一篇文章:/article/details/108642977
如果是编译成exe
,可以使用gcc
,参见我另一篇文章:
/article/details/109142964
3、用IDA打开so文件
现在,我们使用IDA
反编译一下我们的这个。
点击菜单File - Open
选择我们的,打开
点击OK
反编译成功,我们可以看到对应的汇编代码
4、找函数
因为我们在中有个
main
函数,我们在IDA
左侧的Functions Windows中按Ctrl + F
,查找main
函数
双击main
函数,可以看到对应的汇编代码
看汇编有点吃力的话,可以直接按F5
转成伪代码(注意:伪代码不可全信,它与源码是有差异的)
从上的伪代码可以见到,调用了j_SayHello
方法,我们的AddInt(1, 5);
调用直接被优化成结果6
了。
双击j_SayHello
可以跳到函数定义里,里面调用了SayHello
继续跳到SayHello
,可以看到调用了j_printf("hello world");
如果想切换会汇编视图,可以直接在上面的标签页中切换即可
四、实战
我们下载海王捕鱼的PC
版(它是Unity
做的),我们知道,Unity
的C#代码会编译成,然后通过
mono
加载进内存中。
如果没有对做加密的话,可以直接使用
反编译
。
ILSpy下载地址:/icsharpcode/ILSpy/releases
尝试了发现海王捕鱼对做了加密,那么他们肯定修改了
mono
的加载Dll
的逻辑(mono_image_open_from_data_with_name
方法)。
Unity防破解 —— 加密Dll与Key保护
:/lixiang-share/p/
我们找到海王捕鱼exe所在目录中找到
使用IDA
打开,找到mono_image_open_from_data_with_name
方法,发现了一个惊天秘密,解密密钥是:fuckyoutencent
。
看来,海王的程序员对腾讯怨念很深啊~
五、结束语
本文介绍的知识IDA
最简单的用法,跟多高深的技巧,我会在后面的学习和使用中进行文章更新~