拿到一个APK,向教直接扔进Jadx里看反编译的向教Java代码,这是向教大多数人接触Android逆向的第一步。但你会发现,向教很多时候看到的向教代码逻辑是断的,或者关键方法里全是向教native声明。原因很简单——APK里的向教dex文件只是冰山一角,真正干活的向教代码可能藏在so库里,也可能被加固厂商抽走了。向教
我刚开始玩逆向那会儿,向教拿一个简单的向教CrackMe练手。用apktool反编译,向教smali代码翻来覆去看,向教就是向教找不到判断注册码的地方。后来用JD-GUI打开dex,向教发现有个类的方法体是空的。那时候不懂,以为反编译工具出了问题。其实是被抽代码了,运行时才从别的地方还原回来。这种就叫加固。
所以工具链得配齐。Jadx看Java层逻辑最快,但遇到混淆过的代码,变量名全是a、b、c,方法名也看不出含义。这时候得靠动态调试。Frida是个好东西,不用改APK就能hook方法,打印参数和返回值。比如你怀疑某个check方法返回了布尔值,直接Frida脚本一挂,看它到底返回true还是false。比静态猜快多了。
说到动态调试,Xposed和Frida是两条路子。Xposed需要root,改系统框架,适合长期监控某个App。Frida更轻量,把frida-server往设备上一推,端口转发一下就能用。我习惯用Frida做快速验证,比如hook String.equals看比较了什么字符串,或者hook MessageDigest.update看摘要算法输入了什么。这些操作在静态分析里可能要翻几十个类,动态一两行代码就搞定。
但Frida不是万能的。有些App会检测frida-server的进程名或者默认端口。改个名字,换个端口,或者用frida-gadget注入,都是常规对抗手段。更狠的是用自定义的so加载器,把dex加密存在assets里,运行时解密到内存中加载。这种就得脱壳了。
脱壳工具现在比较成熟的有FART、Youpk、BlackDex。原理大同小异,都是在ART虚拟机里找到 dexFile 结构体,把内存中的dex dump出来。但壳也在进化,有的会抹掉dex头部,有的会抽掉某些方法的字节码。脱出来的dex还得修复,用dexfixer或者自己写脚本补回来。
Native层逆向是另一道坎。IDA Pro是标配,但ARM64汇编看着头疼。我的经验是先从JNI_OnLoad入手,看注册了哪些native方法。然后找导出函数,或者根据字符串交叉引用定位关键逻辑。有时候算法就在so里,比如签名校验、加密解密。这时候Frida的Interceptor.attach比IDA动态调试方便,直接替换函数实现,返回你想要的值。
举个实际例子。之前分析一个App的登录协议,抓包看到密码字段是加密的。静态翻Java代码,发现调用了native方法encode。把so拖进IDA,找到那个函数,发现是AES加密,密钥硬编码在so的.rodata段。用Frida hook AES_set_encrypt_key,打印出密钥和IV,协议就解开了。整个过程不到半小时,比硬啃汇编快得多。
逆向这事,工具重要,思路更重要。别一上来就死磕汇编,先跑起来看行为,抓包看数据流,再用Frida验证猜想。静态分析用来定位关键点,动态调试用来确认逻辑。两者结合,效率最高。遇到加固别慌,先看是哪家的壳,找对应的脱壳工具。实在脱不掉,就动态hook,绕过检测直接拿结果。目的达到了就行,没必要追求完美还原代码。
顶: 46961踩: 5






评论专区