我反编译了一个APK文件,该程序在.so文件中包含本机代码。

我想在Linux中使用.so文件以便使用内联函数。
这些代码具有以下功能:连接到服务器,并对传输的数据执行加密/解密。我可以将ARM代码反编译并重新编译为x64 CPU并在Linux中运行吗?反编译代码,我看到了汇编函数,但是我不习惯汇编,也不习惯反向工程。如何将这些函数转换为C或python函数?

评论

您需要一个模拟器。这里有一个ARM VM-opensecuritytraining.info/IntroARM.html

您不应该再使用IDA,因为Ghidra可以更好地将其反编译为纯C代码,而没有任何形式的内联ARM等形式。这使您可以将C代码重新编译为x86-64架构或任何其他所需的东西。而且没有x64这样的语言,我不知道是谁开始使用它,唯一存在的语言是x86-64 / IA64,这是同一件事。

@Danil我没有将您的评论转换为评论,因为这不是答案。 x64确实是一回事。特别是微软早在x86-64时就使用了该术语,因为它们支持AMD和Intel CPU。维基百科甚至提到x64。哦,很抱歉把它给您破解,但是x86-64和IA-64并不是同一件事……而“ IA64”就更不重要了。 x(86-)64是IA-32的64位扩展。因此,尽管您对Ghidra的建议可能总体上是有效的,但2015年也没有向公众提供。

#1 楼

首先,提取整个APK(这是​​一个重命名的ZIP),并检查除ARM之外,是否还没有x86版本的二进制文件。
以下选项假定您已使用IDA,Hex-Rays或Hopper之类的工具分析了二进制文件,并且可以确定要实现的功能。 br />
如果您需要在基于GLIB的Linux系统和以.so为目标的Android库之间模拟调用约定,并且模拟体系结构不是问题,例如,因为您有x86版本的可在APK中使用的库:来自常规GCC或Clang编译的GLIBC程序的反向工程JNI。 libhybris的教程并不多,但是您会在Internet上找到一些依赖它的开源项目,这些项目将作为示例代码。
但是,libhybris将模仿调用约定,而不是体系结构。



如果您需要模拟架构和Android ABI:

这里有一些选择,可以运行程序的一部分在ARM主机上-可以是Android模拟器,智能手机,廉价的ARM VPS,Raspberry Pi或其他设备-在用户模式下使用诸如QEMU的模拟器(允许您在chroot中模拟单个ELF文件环境而不模拟整个系统)。另外,您可能必须交叉编译代码。自己解析ELF /使用代码处理内存布局的费用:


另一种选择是使用Unicorn引擎,这是一个基于QEMU代码的库,通过读取/写入寄存器,内存和设置断点,您可以使用调试器类似的方式在外部主机上仿真机器代码。几乎是裸机:要使用它,您自己解析elf(5)结构,然后您自己分配和编写二进制文件的相关部分,然后设置寄存器(目标函数的PC指向SP,可用空间,R0,R1等参数,LR设置钩子)并启动仿真器。您可以在C和Python中找到一些易于理解的示例。 />


#2 楼

要反编译APK文件,可以使用其他工具(https://mobilesecuritywiki.com/)。
如果使用python,这是最好的方法:

https://github.com / androguard / androguard或https://code.google.com/p/androguard/(另请参见以下示例:https://github.com/androguard/androguard/tree/master/demos)

您可以针对ARM进行反编译,但为了进行测试,应使用quemu(对于ARM)或eclipse。

#3 楼

看看frida的NativeFunction API。它可以帮助您调用任何本机函数。稍微反转一下,您将得到类似

var func = new NativeFunction(Module.findExportByName('libxx.so', 'fun'), 'uint32', []);