【Android逆向案例】干掉梆梆加固免费版的反调试检测

本文并无技术含量,纯属这个壳太傻,主要分享常见工具的使用心得

目标和现象

分析目标:某行网银手机客户端

分析壳类型:
使用【d2j-dex2jar】反编译后发现关键代码缺失,因为 AndroidManifest.xml 中的绝大部分activity和server的实现都是在 cmb.pb 这个包中,但是反编译的代码里没有 cmb.pb 这个包,只有一些无关紧要的第三方sdk,判断其核心代码进行了加固。随后在反编译的代码看到了 “DexInstall” 类,并且搜索 “loadLibrary” 可以找到代码 System.loadLibrary("CmbShield");
从apk中解压出 libCmbShield.so ,使用 IDA pro 反编译分析,根据一些代码特征结合网上搜索,可以判断出这个 so 其实就是 libSecShell.so 改了个名字,为2018年的梆梆加固免费版,2019年的最新梆梆加固免费版好像已经不是这个了,所以本文可能没法直接帮到你,主要目的还是在于总结思路,不断积累进步。

调试:
无论是要脱壳还是分析,一个重要的步骤就是调试,安装目标APK,依然是使用 Xposed + BDOpener 打开调试的大门,但是使用 AndroidStudio 附加到目标进程 cmb.pb 时,APP瞬间闪退消失,进程死亡,调试器断开连接,估计这个壳做了反调试检测。

分析

调试器附加上去的一瞬间,目标进程立即退出,很快就想到可能是调试操作触发了它的检测代码,并使用 kill 之类的函数结束了自身,而非定时轮询检测。



查看死亡前的 logcat 果然找到了一些蛛丝马迹:

2019-06-06 22:20:39.675 32678-32685/cmb.pb E/2g.out: libdvm_dvmDbgActive_stub called
2019-06-06 22:20:39.730 32678-32685/cmb.pb I/art: Debugger is active
2019-06-06 22:20:39.730 32678-32685/cmb.pb E/2g.out: kill:libdvm_dvmDbgActive_stub

不得不说这个壳实在是有点愚蠢,直接就给出了重要的关键信息,告诉你:

我在这儿呢,快来搞我呀

免费版的加固服务果然有免费版的特质,想不通某行这么大的企业竟不愿花钱买梆梆企业版。

依旧是打开 IDA Pro 分析这个 libCmbShield.so

ALT + T 搜索“ libdvm_dvmDbgActive_stub”,果然很快就找到了关键代码,F5反编译,原形毕露。

查看交叉引用,果然,该壳 Hook 了 libart.so 的 _ZN3art3Dbg8GoActiveEv() 函数,在调试器附加的时候,该函数被调用,实际调用的是被 Hook 替换后的 sub_1B330() 函数,然后在 sub_1B330() 函数中使用 unix api kill() 结束自身。

干它

最简单的办法就是在 sub_1B330() 函数中把 kill() 的调用去掉。我们可以把

BLX             kill
STR             R0, [SP,#0x28+var_24]

这6个字节的指令替换为

MOVS R0, R0
MOVS R0, #0
MOVS R1, #0

即做一个无用的空操作,然后让函数返回值为0,此处函数返回值为64位的 int ,所以需要对 r0 r1 两个寄存器均赋值为0,原本的 kill() 函数如果执行成功理应返回0,我们也返回0尽量不对调用者产生影响。

替换指令我们使用到了 IDA Pro 的一个插件【keypatch】可以直接将 arm 指令转换为机器码并填充上去,相当方便,否则你还需要查阅 arm 指令手册或用其它小工具,自行翻译为机器码后使用 010 Editor、UltraEdit 等16进制编辑器修改填充。

【keypatch】项目地址:https://github.com/keystone-engine/keypatch

修改后,直接在 IDA Pro 中,使用【Edit】-【Patch program】-【Apply patches to input file...】保存回二进制文件 libCmbShield.so 中

注意,libCmbShield.so 中可能有多个类似 sub_1B330() 的函数调用了 kill() ,我们在搜索和处理的时候,不要改了一处就以为万事大吉了,继续搜索,改掉所有相似的地方。

验证结果

接下来,由于手机已经 ROOT ,我们可以在 adb shell 下以 root 权限访问系统目录,我们把修改好的 libCmbShield.so push 到手机中,然后拷贝到目标APP的安装目录下覆盖原来的 libCmbShield.so

adb push libCmbShield.so /sdcard/
adb shell
su
cp /sdcard/libCmbShield.so /data/app/cmb.pb-1/lib/arm/

重新启动应用,使用 AndroidStudio 附加进程调试,果真没有再闪退了,稳的好像一条20多年的老狗。
接下来就可以愉快的调试分析进行脱壳或调试我们开发的 Xposed 模块了。

本文由encoderlee发表于CSDN博客: https://blog.csdn.net/CharlesSimonyi/article/details/91050233 转载请注明出处

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称