本文档内容仅用于网络安全技术学习、安全研究、合规渗透测试等合法教学场景。文中所涉及的APP逆向、脱壳、调试分析等技术操作,均为个人技术研究记录,仅用于安全防御学习与技术交流。本人严格遵守《网络安全法》及相关法律法规,严禁将本文档内容用于非法逆向、破解、篡改、侵权等一切违规违法用途。若任何人利用本文档内容进行非合规操作,所产生的一切法律后果、风险与作者无关,均由操作者自行承担全部责任。请勿用于商业用途、非法牟利、恶意攻击等违规场景,一切技术仅供合规安全学习使用。 使用Jadx对目标APP进行初步反编译分析加载程序壳文件后,可明确判定该APP搭载***SO壳尝试直接通过Frida附加进程调试,程序立即闪退。程序内置完整的Frida检测机制,常规附加调试方式无法正常使用。本次分析针对程序核心的两个SO文件进行内存Dump操作const so = Process.findModuleByName("libexec.so");
if (so) {
const savePath = "/data/local/tmp/libexec.so";
const file = new File(savePath, "wb");
if (file) {
let currentAddr = so.base;
const endAddr = so.base.add(so.size);
const pageSize = 4096;
while (currentAddr.compare(endAddr) < 0) {
Memory.protect(currentAddr, pageSize, 'rwx');
let bytesToWrite = pageSize;
if (currentAddr.add(pageSize).compare(endAddr) > 0) {
bytesToWrite = endAddr.sub(currentAddr).toInt32();
const buffer = currentAddr.readByteArray(bytesToWrite);
file.write(buffer);
} catch (e) {
const emptyBuffer = new ArrayBuffer(bytesToWrite);
file.write(emptyBuffer);
currentAddr = currentAddr.add(bytesToWrite);
file.flush();
file.close();
}将Dump得到的libexecmain.so文件导入IDA工具开展静态分析通过检索ClassLoader关键字符串,精准定位程序Native函数注册核心代码段。
追踪注册函数入口,进入sub_5EB20函数进行逻辑分析。可判定该函数为程序初始化核心函数,同时集成全套反调试、反模拟器检测逻辑。逐层拆解分析该函数内的各类校验分支。函数内置qemud模拟器检测逻辑,该逻辑无关键防护作用,可直接忽略。程序核心致命防护为一处条件判断分支,触发后会直接终止APP进程。跟随汇编跳转链路逐层追溯,该校验逻辑会依次调用 sub_4860c、sub_49D00 函数完成核心安全检测其中,sub_4b6d8 为核心文件读取函数,主要负责读取系统关键文件数据。sub_68d94 为字符串匹配校验函数,用于匹配系统文件内的风控特征关键字。程序会遍历校验目标系统文件的特征信息,命中任意风控特征即判定为调试环境。检测异常时函数返回1,触发进程强制杀死逻辑。仅当函数返回0时,可成功绕过该层防护校验。
检测到其中一个都会跳转到返回1针对程序核心反调试检测逻辑,采用Hook篡改返回值的方式绕过防护。通过Frida挂钩 sub_49D00 函数执行内存地址。在函数执行阶段直接将寄存器x0赋值为0,强制检测函数返回合法数值。该操作可彻底绕过文件特征检测、Frida环境检测双重防护机制。 const targetSoName = "libexec.so";
function hook_target(base) {
Interceptor.attach(base.add(0x48618), {
onEnter: function () {
this.context.x0 = 0x0;
});
// 方案 B: Hook Linker 的 dlopen (更专业,能抢在 SO 入口执行前)
const android_dlopen_
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-291329.htm
[原创]某运营商APP加固脱壳与反 Frida 检测绕过分析
87 浏览
3 回复
中国移动
????
666.手撕ijm.