爱加密脱壳

关键字:libdvm DexFileOpenPartialPK fopen
样本:MtkEditer原版.apk

反编译 查壳 有爱加密壳
脱壳:

0x1:
adb shell
su
chmod 755 /data/local/tmp/as
/data/local/tmp/as

0x2:
adb forward tcp:23946 tcp:23946

0x3:
adb shell
am start -D -n com.zxjw.mtkediter/.ui.Detection

0x4:
开IDA附加
Module 里选择 libdvm.so
再选择 DexFileOpenPartialPK
在这下个断点
这个apk 还有检测 PTracerID 端口 反调试
在 fopen 处也下个断点

F9运行

0x5:
开启 monitor(DDMS)
0x6:
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

则到了fopen断点处
0x7:
Hex View窗口里 右键
SynChronize with R0
注意观察 R0值的文本显示

爱加密脱壳_第1张图片
出现这个 /proc/xxx/status 关键字后
说明已经打开了 检测的 关键文本了
返回到上级爱加密脱壳_第2张图片
再 F8 单步步过 调试 注意还是看 R0值的 文本显示

爱加密脱壳_第3张图片
这个 Name字段名 是status文件里的 第一个字段
说明在这里的时候 一步步的 提取出字段 那我们就在这下断点
直到 提取 PTracerID 字段

爱加密脱壳_第4张图片
这里 我直接在 Hex View 窗口里 把文本形式显示的 TracerPid 值 改成了0
按F2快捷键 进行修改 修改后 再按 F2快捷键 apply
这样再运行

如果有多次 检测的时候 我们就多次修改吧 直到 运行到 DexFileOpenPartialPK 断点处

爱加密脱壳_第5张图片
这个_Z21dvmDexFileOpenPartialPKviPP6DvmDex 函数的
第一个参数是 dex文件 基址
第二个参数是 dex文件 大小

在 Hex View窗口里 红色位置 可以很清楚的看到
第一个红色标记处 是 基址
第二个红色标记成是 大小 这个地方要注意下 内存中数值是 高低位互换的
A4 11 03 00 高低位转换下 真正的值则是 03 11 A4 即是 0x311A4

这时我们用 IDA 脚本 提取出来 dex(这个时候是脱壳后的 仅仅是对这个样本来说 这里是脱壳后的 不同的加壳 不一样的)
脚本命令
auto fp,addr_start,addr_now,size,addr_end;
addr_start = R0;
size = R1;
addr_end = addr_start+size;
fp=fopen(“C:\dump.dex”,“wb”);
for(addr_now = addr_start;addr_now fputc(Byte(addr_now),fp);

或者
auto fp,addr_start,addr_now,size,addr_end;
addr_start = 0x6141952C;
size = 0x311A4;
addr_end = addr_start+size;
fp=fopen(“C:\dump.dex”,“wb”);
for(addr_now = addr_start;addr_now fputc(Byte(addr_now),fp);

都是可以的
Run 提取完后 到 jeb里 检测下

ok 完成脱壳

你可能感兴趣的:(脱壳加固反调试)