首先,对不起我的英语。这不是我的母语。这是我第一次做这样的事情,所以我在旅途中学习。
上下文:我试图了解我从Play商店安装的游戏是如何与服务器通信的。更确切地说,是如何在向服务器发出的每个POST请求上设置特定参数的
这个名为"secret"的HTTP参数无法轻易进行反向工程,因为它是其他参数的一种散列,用于检查请求的完整性。
我所做的:
- 我从.apk中提取了.dex文件
- 我使用d2j-dex2jar提取.class文件
- 我使用jd-gui工具来分析源代码
我的发现:这是生成"secret"参数值的源代码:
.method public static native secretForString(Ljava/lang/String;)Ljava/lang/String;
.end method
根据我所学到的,java允许您使用本机库,这要归功于native关键字。这些本机库是通过System.loadLibrary(...)
命令加载的。在Main.java文件中,我调用了这个命令System.loadLibrary("Main");
。如果我正确理解它的工作原理,我的android手机上安装了一个名为libMain.so的相应.so文件。
我在OnePlus6中生根,并在文件中查找此库。
问题:我在手机上找不到此库。/data/data//中没有关联的.so文件
问题:
- 你能解释一下我做错了什么/我失踪了吗
- 假设我找到了库,我能阅读其中的代码吗?还是需要一个特定的工具
- 如果问题2的答案是否定的,是否可以创建一个小型应用程序来加载这个特定的库并使用它
感谢您花时间帮助我:D
问题1的答案:
我发现游戏安装了多个.apk。我的错误是信任应用程序Apk提取器,它只给了我基本的.Apk
我通过SSH连接到我的手机,并列出所有安装的.apk。在我的游戏的/data/app/文件夹中安装了几个.apk!
- 其中一个专用于基本源代码(我从Apk Extractor获得的代码(
- 一个只存储本机库的.apk(libMain.so(
问题2的答案:
我使用命令readelf -s libMain.so | grep '<Name of the function>
来检索函数地址。输出类似于00000000003c69b4
readelf -h libMain.so
:给了我图书馆的架构,也就是AArch64。
我下载了用于编译二进制文件的相同工具链:$> sudo apt-get install binutils-aarch64-linux-gnu
然后将其与此命令一起使用:$> aarch64-linux-gnu-objdump -d libMain.so --start-address=0x3c69b4
起始地址值设置为第一个命令的返回值
现在我有了需要进行逆向工程的汇编代码!