android逆向案例:干掉梆梆加固免费版的反调试检测

encoderlee encoderlee     2022-12-05     756

关键词:

目标和现象

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

分析壳类型:
使用【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 转载请注明出处

逆向手机内核,添加调试支持和反调试

 0x00前言  一个安卓应用可以被调试的条件是应用AndroidManifest.xml显示指定android:debuggable="true",如果没有设置android:debuggable的值,则默认android:debuggable="false",所以发布的应用大部分都是不可调试的,如果要调试,则需要解... 查看详情

java层反调试

安卓程序动态调试需要满足两个条件。1.在AndroidMainfest.xml文件中,在application标签下,Android:debuggable=true。2.系统默认调式,在build.prop(boot.img),ro.debugable=1。一:实例演示java层反调试以“百度加固”为例。1.将样本拖入jdax-gui中,... 查看详情

逆向分析反调试程序

1.先运行下正常2.打密码密码错误3.用OD调试发现报异常说明做了反调试(OD不要用插件不然他会反反调试看不到)4.(这里要用到win7了因为win10报异常不知道在哪里)win10效果win7效果可以看出异常地址在哪里5.知道异常地址在哪了... 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

...4、StolenBytes5、API重定向6、DebugBlocker结语前言继续学习《逆向工程核心原理》,本篇笔记是第七部分:反调试技术,包括一些静态反调试技术和动态反调试技术值得注意的是, 查看详情

android反编译反调试入门资料

0x01反编译出错1.插入无效指令是部分逆向工具崩溃原理:大部分逆向工具都是线性读取字节码并解析,如dex2jar,baksmali,apktool等,当遇到无效字节码时,就会引起反编译工具解析失败。例如:新版的dex2jar遇到这种情... 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子 查看详情

ios逆向笔记之反调试以及反反调试和反反反调试ptrace篇

参考技术A1.ptrace(processtrace进程跟踪)为了方便软件的开发和调试,UNIX早期版本就提供了一种对运行进程进行跟踪和控制的手段,那就是系统调用ptrace.通过ptrace可以实现对另一个进程实现调试和跟踪.同时,ptrace提供了一个非常有用的... 查看详情

frida反调试

...反调试。这里记录一下出现问题的情况和反调试的实现.Android8frida12.11.18windows10使用frida-U注入app结果如下这里有两个com.shark.tracerpidapp名称的进程我们直接进入adb查看进程可以看到确实有两个进程,frida分不清你要注入哪个进程所... 查看详情

crimsonland血腥大地逆向无敌通关分析报告配置文件加密dll隐藏md5检测补丁反调试函数反反调试

 一、工具及游戏介绍 使用工具:Ollydbg,PEID,BeyondCompare,CheatEngine实现功能:无敌,全部通关。 Crimsonland血腥大地 二、实现无敌: 使用CE查找全局变量。无敌成功。 三、通关:1、文件对比原始关卡: ... 查看详情

android反调试实践(代码片段)

(一)xposed检测1.每一个被hook的进程,都会将xposed的相关库文件和jar文件加载到相应的进程空间中,如图:这里看到进程空间中加载了1)app_process32_xposed2)libxposed_art.so3)XResourcesSuperClass.dex既然能... 查看详情

修改android手机内核,绕过反调试(代码片段)

本文博客链接:http://blog.csdn.net/qq1084283172/article/details/570864860x1.手机设备环境Modelnumber:Nexus5OSVersion:Android4.4.4KTU84PKernelVersion:3.4.0-gd59db4e0x2.Android内核提取查找Android设备的boot分区文件。高通芯片的设备可 查看详情

360加固的自动化处理脚本

Android应用很容易被反编译,为了保护源码,通常都会进行混淆、加固操作,以此来增加破解难度。国内提供加固服务的公司也不少,像梆梆、爱加密、360加固都是使用者比较多的服务。我们的应用从一开始就在使用360的免费加... 查看详情

源码编译绕过反调试

...13481一.环境搭建(1).环境介绍:手机:nexus5ubuntu版本:15.10android版本:4.4.4android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了)http://source. 查看详情

反调试手法之createprocess反调试(代码片段)

              反调试手法之CreateProcess反调试在学习Win32创建进程的时候.我们发现了有一个进程信息结构体.STARTUPINFO.这个结构体可以实现反调试.具体CreateProcess可以参考上一篇博客.:  https://www.cnblogs.com/iBi... 查看详情

过反调试

...二者本为一体破解技术就不要我多介绍了,下面我来介绍反调试技术也就是所谓的防破解技术反调试技术可以简单通俗的理解为:防止OD分析软件的技术,也就是反调试技术那么反调试技术又有几种呢?下面我介绍几种常用反调... 查看详情

android签名验证与反调试机制的对抗技术(代码片段)

...2.6时间差异检测2.7内置函数检测2.8调试断点检测总结前言Android的APK文件为了防止被篡改和重打包,经常会做签名校验来保证自身完整性,当程序被篡改后将提示用户或者直接退出运行。同时有些 查看详情

反调试-isdebuggerpresent

目前这个是我知道的最简单的反调试方法了 查看详情