新发的日常学习——IDA的入门使用,反编译so/dll文件(反编译神器)

18 篇文章 6 订阅
5 篇文章 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文件
在这里插入图片描述
具体如何编译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

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

尝试了发现海王捕鱼对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最简单的用法,跟多高深的技巧,我会在后面的学习和使用中进行文章更新~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值