🗒️frida jadx dalvikus初识
2026-3-3
| 2026-3-2
字数 2516阅读时长 7 分钟
type
Post
status
Published
date
Mar 3, 2026
slug
逆向/study01
summary
tags
逆向
category
网络安全
icon
password
😀
 
安卓12 python311
frida 16.2.1
frida-tools 12.1.2
notion image

app基础知识

JADX 是按「这类字节码通常对应哪种 Java 写法」的经验去猜,然后把字节码还原成那种写法。所以可能还原失败或缺失,但是smail视图是不会出错的。smail视图表示的就是dex字节码( DEX 字节码的一对一反汇编),smail视图在jadx最下方有切换按钮
notion image
APP里有资源文件夹和源代码文件夹。源代码从资源文件里调用图片,图标,字体,布局。
资源文件里AndroidManifest.xml中
android:label定义了app的名字
android:icon定义了图标
uses-permission定义权限
APK 其实是一个 zip,META-INF 是 zip 里自带的目录,安卓用来放签名和校验相关的东西:
CERT.RSA / CERT.SF / MANIFEST.MF:安装时系统用它们验证「这个 APK 没被改过、确实是某个开发者签的」
没有这些或签名不对,就装不上或升级失败
所以:META-INF = 签名和完整性校验,不是业务代码或资源。
notion image
classes.dex 代码编译后的字节码(逻辑在这)
resources.arsc 是资源索引的编译版本,把资源 ID 和实际文件的映射关系预编译成二进制格式,方便系统快速查找。这个知道就行,不用深究。

APP可改包原因+解决思路

notion image
MANIFEST.MF文件会给一些文件附加SHA-256-Digest值。
SHA-256-Digest 就是 对应文件内容的 SHA-256 哈希值,再做了 Base64 编码。所以文件内容改了,但是不改SHA-256-Digest,安卓系统就知道文件被篡改了,就无法安装。
CERT.SF对MANIFEST.MF里的原始内容再做了一次备份,所以就算修改了classes.dex后再对应修改MANIFEST.MF,也没用。
如果将classes.dex,MANIFEST.MF,CERT.SF都修改对应,CERT.RSA是用开发者私钥对 CERT.SF 做的数字签名。拿不到私钥不可能伪造对应开发者。
篡改的 app 能不能用,分两种情况:
篡改但不重签(只改 classes.dex + MANIFEST.MF + CERT.SF,不动 CERT.RSA 或造不出合法 CERT.RSA)
校验一定失败 → 系统拒绝安装 → 篡改版不能用。
篡改后用你自己的私钥重签(重新生成 MANIFEST.MF、CERT.SF、CERT.RSA)系统会认为这是另一个签名者,不是原开发者。可以安装,但:
同包名升级:原版是商店/系统装的,你的是「不同签名」→ 不能覆盖安装,要先卸再装;
运行时自校验:很多 app 会读自己的签名,发现不是官方签名就退出或限制功能(如登录、支付),所以「能装上」不等于「能正常用」。
所以:不能伪造对应开发者 ≠ 世界上任何篡改版都不能装,而是:
不重签 → 过不了校验,一定不能用;
重签成自己的 → 可能能装、能运行,但身份已变,升级和很多功能会受限或失效。
不同签名,不是同一开发者安装的,系统认为不是一个应用。但是包名又一样,要卸载原来的正版再安装。无法覆盖安装和升级。

进入主类

notion image
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
系统规定:谁声明了 MAIN + LAUNCHER,谁就会在桌面有一个图标,点图标时启动的就是这个 Activity,也就是“入口”
notion image

jadx使用细节

mcp

gui安装好插件后,编辑器的配置

用例和声明跳转

双击这个a就可以进入a函数的函数声明
notion image
鼠标悬停声明处的a点击快捷键c可以查看 用在哪
或者右键->树状用例分析也可以
notion image

frida片段意义和使用

frida运行需要在客户端和服务端都启用:
服务端(手机端):
cd /data/local/tmp
chmod +x frida-server-16.2.1-android-arm64
./frida-server-16.2.1-android-arm64
服务端命令:
frida -U -f 包名 -l js脚本
frida -U -f owasp.mstg.uncrackable1 -l CrackMe1.js

UnCrackable-Level1.apk

jadx发现检测了三个函数,跳到声明,悬停在函数定义处,右键有一个选项叫复制为frida片段。
notion image
其余的校验用相同的手法,最后就得到了如下的脚本
运行后发现报错,ai审计后判断是 java环境未就绪就运行代码,所以失败。
notion image
正确的调用是放在Java.perform(function () {})内:
notion image

快速搜索

双击选中代码段的字符串,直接右键就有搜索,和全局搜索该字符串

改包-签名dalvikus

编辑器测试:可以导入俩个一模一样的包,如果点击俩个包相同的资源文件,可以修改后对比看,有俩个视图。但是如果是源文件classes.dex内的代码文件,就分不开视图,无法对比查看。编辑器看的是smail代码,可以改。
notion image
左侧栏--反编译器可以选择引擎,默认jadx,看可视化源码
notion image
在编辑器里修改smail代码后,点击打包-->签名,签名后就会出现
notion image
notion image
签名需要zipalign,放在dalvikus根目录下
notion image
notion image
此时apk可以自己安装,也可以点击部署, 部署会把签名的app自动安装到收集上。(尽可能自己先卸载再安装)

闯关

UnCrackable-Level1.apk

通过上面的脚本绕过root和调试检测,jadx搜索if,前面4个if是环境检测,最后这个应该就是校验了
notion image
逻辑很简单,a.a.String为真显示Success。
notion image
悬停a跳转进入函数
notion image
发现bArrA很可能就是最终的字符串,因为new String(bArrA)被拿去判断了是否相等。
所以我们只需要借用app的代码完成以下的过程就行
sg.vantagepoint.a.a.a(b("8d127684cbc37c17616d806cf50473cc"), Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0))
new String(bArrA)
b函数不知道在哪,直接复制frida片段,粘贴就看见了,自动出包路径b("8d127684cbc37c17616d806cf50473cc")
Base64.decode可以在当前代码里看到import android.util.Base64
new String(bArrA)不知道用的啥java包,问ai
最后就写成
然后frida运行后就能看见了
notion image
总体代码:
另一种方案:
跳进这个a函数,这个a函数就是解密函数,2个入参最后输出解密值
notion image
// doFinal: 处理数据并完成解密,返回明文字节数组
notion image
使用frida在我们每次校验的时候将这个a函数的返回值输出到终端即可

反思:

notion image
核心在于找代码,综合前面学到的知识,资源文件不在源代码,源代码只是调用。所以此处页面显示的样式,字符串,字体,布局都属于资源文件。所以我们需要找到Enter the ...在哪写。源代码怎样调用就能找到入口。任何app都可以这样。
notion image
这个Enter的name是edit_text。源代码一定会调用,直接定位name
notion image
notion image
  • 逆向
  • weblogic XML Decoder反序列化漏洞pixel刷机,root,隐藏环境
    Loading...