在我的手机上找不到 apk 使用的原生库



首先,对不起我的英语。这不是我的母语。这是我第一次做这样的事情,所以我在旅途中学习。

上下文:我试图了解我从Play商店安装的游戏是如何与服务器通信的。更确切地说,是如何在向服务器发出的每个POST请求上设置特定参数的
这个名为"secret"的HTTP参数无法轻易进行反向工程,因为它是其他参数的一种散列,用于检查请求的完整性。

我所做的

  1. 我从.apk中提取了.dex文件
  2. 我使用d2j-dex2jar提取.class文件
  3. 我使用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文件

问题

  1. 你能解释一下我做错了什么/我失踪了吗
  2. 假设我找到了库,我能阅读其中的代码吗?还是需要一个特定的工具
  3. 如果问题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
起始地址值设置为第一个命令的返回值

现在我有了需要进行逆向工程的汇编代码!

最新更新