# 背景 #
为避免Android应用程序被轻易逆向暴露程序逻辑,Android平台APP加固技术也不断发展。加固服务能一定程度提高Android应用程序被逆向的难度,但仍无法避免和防止应用程序自身的安全问题和漏洞。除此之外,恶意程序还能利用加固服务隐藏恶意行为逻辑。因此,通过研究Android应用程序通用自动脱壳方法,能客观评估加固的有效性,还能及时发现应用本身存在的安全问题,并为恶意应用程序的发现扫清障碍。
经过多年的发展和对抗,Android平台APP加固技术已经相当成熟,防护粒度从DEX整体加密开始,细化到方法级别和指令级别,不断增加逆向分析的难度和工作量来保护客户端代码。相应的,针对这些加固技术,也出现了很多通用的脱壳方法和工具。这些工具通过内存dump在运行时获取壳释放的APP原始代码,来实现DEX层通用脱壳。然而厂商也发展出了定制化的加固方法来对抗通用脱壳,DEX虚拟化(DEX-VMP)便是其中之一。DEX虚拟化加固使得常见的基于内存dump的通用脱壳工具不再适用,增加了自动化分析的难度。为帮助厂商进一步提升应用安全检测覆盖面,ApkPecker推出自动化DEX-VMP脱壳服务。
DEX-VMP实现原理
// DEX-VMP 加固前App代码
class Foo{
void onCreate(){
super.onCreate();
}
}
// DEX-VMP加固后App代码
class Foo {
void onCreate(){
vm.v(0);
}
}
//厂商解释器入口函数
class Vm {
void native v(int methodId);
}
DEX-VMP自动化脱壳难点
1.如何找到所有的自定义字节码?
2.如何将自定义字节码翻译成标准Dalvik?
while (1) {
uint8_t* pc = vm_ctx->pc;
uint8_t opcode_xor_key = vm_ctx->xor_key;
uint8_t opcode = opcode_decrypt(*pc ^ opcode_xor_key);
switch (opcode & 0xFF) {
case 0x00: // add-int vAA,vBB,vCC
uint32_t AA = read_uint8(pc+1) ^ 0x12;//decrypt operand
uint32_t BB = read_uint8(pc+2) ^ 0x34;
uint32_t CC = read_uint8(pc+3) ^ 0x56;
int32_t vBB = vm_ctx->registers[BB];
int32_t vCC = vm_ctx->registers[CC];
vm_ctx->registers[AA] = (uint32_t)(vBB + vCC);
pc += 4; break;
case 0x01: // const-string vAA,string@BBBB
uint32_t AA = read_uint8(pc+1) ^ 0xab
//decrypt string index
uint32_t BBBB = read_uint32(pc+2) ^ 0xcdef;
jstring jstr = create_string_from_internal_index(BBBB);
vm_ctx->registers[AA] = (uint32_t)jstr;
pc+=4;
break;
... // other handlers
}
ApkPecker的自动化DEX-VMP脱壳服务
DEX-VMP自动化脱壳方案
脱壳覆盖面与成功率
@最最重要!!
交流及体验
限时扫描二维码进入ApkPecker技术交流群,获取更多脱壳以及应用自动化检测技术资料,更有不定期福利放送。
击阅读原文或复制网址在浏览器中体验面向攻击面的Android应用自动化检测系统ApkPecker:https://apkpecker.qq.com/
ApkPecker技术交流群
点“阅读原文”体验ApkPecker