文章目录

  • 一、前言
  • 二、IDA下载安装
  • 三、IDA使用
  • 1、编写test.c
  • 2、将test.c编译成so文件
  • 3、用IDA打开so文件
  • 4、找函数
  • 四、实战
  • 五、结束语


一、前言

之前一般是搞搞c#java的反编译,比较方便。如果是用C/C++写的dllso,用什么工具来反编译呢?最有名的应该是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文件

android 反编译换素材 安卓反编译so_so文件


具体如何编译so文件,要用到ndk-build,可以参见我另一篇文章:

如果是编译成exe,可以使用gcc,参见我另一篇文章:

3、用IDA打开so文件

现在,我们使用IDA反编译一下我们的这个libtest.so

点击菜单File - Open

android 反编译换素材 安卓反编译so_android 反编译换素材_02


选择我们的libtest.so,打开

android 反编译换素材 安卓反编译so_Assembly_03


点击OK

android 反编译换素材 安卓反编译so_Assembly_04


反编译成功,我们可以看到对应的汇编代码

android 反编译换素材 安卓反编译so_Assembly_05

4、找函数

因为我们在test.c中有个main函数,我们在IDA左侧的Functions Windows中按Ctrl + F,查找main函数

android 反编译换素材 安卓反编译so_so文件_06


双击main函数,可以看到对应的汇编代码

android 反编译换素材 安卓反编译so_Assembly_07


看汇编有点吃力的话,可以直接按F5转成伪代码(注意:伪代码不可全信,它与源码是有差异的)

android 反编译换素材 安卓反编译so_反编译_08


从上的伪代码可以见到,调用了j_SayHello方法,我们的AddInt(1, 5);调用直接被优化成结果6了。

双击j_SayHello可以跳到函数定义里,里面调用了SayHello

android 反编译换素材 安卓反编译so_android 反编译换素材_09


继续跳到SayHello,可以看到调用了j_printf("hello world");

android 反编译换素材 安卓反编译so_android 反编译换素材_10


如果想切换会汇编视图,可以直接在上面的标签页中切换即可

android 反编译换素材 安卓反编译so_so文件_11

四、实战

我们下载海王捕鱼的PC版(它是Unity做的),我们知道,Unity的C#代码会编译成Assembly-CSharp.dll,然后通过mono加载进内存中。
如果没有对Assembly-CSharp.dll做加密的话,可以直接使用ILSpy.exe反编译Assembly-CSharp.dll

ILSpy下载地址:https://github.com/icsharpcode/ILSpy/releases

尝试了发现海王捕鱼对Assembly-CSharp.dll做了加密,那么他们肯定修改了mono的加载Dll的逻辑(mono_image_open_from_data_with_name方法)。

Unity防破解 —— 加密Dll与Key保护
:

我们找到海王捕鱼exe所在目录中找到mono.dll

android 反编译换素材 安卓反编译so_Assembly_12


使用IDA打开,找到mono_image_open_from_data_with_name方法,发现了一个惊天秘密,解密密钥是:fuckyoutencent

android 反编译换素材 安卓反编译so_android 反编译换素材_13


看来,海王的程序员对腾讯怨念很深啊~

五、结束语

本文介绍的知识IDA最简单的用法,跟多高深的技巧,我会在后面的学习和使用中进行文章更新~