一、前言
之前一般是搞搞c#
、java
的反编译,比较方便。如果是用C/C++
写的dll
或so
,用什么工具来反编译呢?最有名的应该是IDA
了。
二、IDA下载安装
链接:https://pan.baidu.com/s/1NATDYzomBYiwrwdH6qBjUA
提取码:2dmy
IDA官网:https://www.hex-rays.com/
三、IDA使用
1、编写test.c
为了方便演示,我们先协议而简单的test.c
。
test.c
代码如下
#include <stdio.h>
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、将test.c编译成so文件
然后使用ndk-build
将其编译成.so
文件
具体如何编译so文件,要用到ndk-build
,可以参见我另一篇文章:https://linxinfa.blog.csdn.net/article/details/108642977
如果是编译成exe
,可以使用gcc
,参见我另一篇文章:
https://linxinfa.blog.csdn.net/article/details/109142964
3、用IDA打开so文件
现在,我们使用IDA
反编译一下我们的这个libtest.so
。
点击菜单File - Open
选择我们的libtest.so
,打开
点击OK
反编译成功,我们可以看到对应的汇编代码
4、找函数
因为我们在test.c
中有个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#代码会编译成Assembly-CSharp.dll
,然后通过mono
加载进内存中。
如果没有对Assembly-CSharp.dll
做加密的话,可以直接使用ILSpy.exe
反编译Assembly-CSharp.dll
。
尝试了发现海王捕鱼对Assembly-CSharp.dll
做了加密,那么他们肯定修改了mono
的加载Dll
的逻辑(mono_image_open_from_data_with_name
方法)。
Unity防破解 —— 加密Dll与Key保护
:https://www.cnblogs.com/lixiang-share/p/5979981.html
我们找到海王捕鱼exe所在目录中找到mono.dll
使用IDA
打开,找到mono_image_open_from_data_with_name
方法,发现了一个惊天秘密,解密密钥是:fuckyoutencent
。
看来,海王的程序员对腾讯怨念很深啊~
五、结束语
本文介绍的知识IDA
最简单的用法,跟多高深的技巧,我会在后面的学习和使用中进行文章更新~