360加固动态脱壳

①. 运行IDA服务端并端口转发

360加固动态脱壳_第1张图片

②. 以调试方式启动app

adb shell am start -D -n com.CMapp/com.e4a.runtime.android.StartActivity

360加固动态脱壳_第2张图片

③. 使用IDA远程附加

360加固动态脱壳_第3张图片

360加固动态脱壳_第4张图片

360加固动态脱壳_第5张图片

 ④. 在libc.so中找到mmap函数设置断点,为了方便,直接设置到函数末尾了

360加固动态脱壳_第6张图片

360加固动态脱壳_第7张图片

360加固动态脱壳_第8张图片

 ⑤. 打开ddms或者Eclipse (必要,为了使用jdb命令),获取应用程序的端口号, F9运行程序

360加固动态脱壳_第9张图片

在命令行中执行:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700    其中port=8700是从ddms中看到的。

此时程序会断下来

⑥. 多次F9后,会来到libjiagu.so模块中,到反调试的函数中将反调试去掉

360加固动态脱壳_第10张图片

360加固动态脱壳_第11张图片

360加固动态脱壳_第12张图片

360加固动态脱壳_第13张图片

 360加固动态脱壳_第14张图片

第一处反调试,将此处改为 mov r0,#0即可。

 

第二处反调试,将此处改为 mov r0,#0即可。

 ⑦. 将以上两处反调试去掉后,就可以只保留mmap函数的断点,一直F9了,查看堆栈直到出现

360加固动态脱壳_第15张图片

⑧. 内存观看r0寄存器所指向的地址,F8单步十几步之后,就可以看到解密好的dex文件,然后使用ida脚本 dump

360加固动态脱壳_第16张图片

复制代码

static main(void)
{
  auto fp, begin, end, dexbyte;
  fp = fopen("C:\\dump.dex", "wb");
  begin = 0x5E650000;
  end = 0x5E650000 + 0x0004BC38;  //偏移0x20处,取4字节为dex文件大小
  for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
      fputc(Byte(dexbyte), fp);
}

复制代码

⑨. 使用工具查看dump.dex文件或者重打包apk文件

360加固动态脱壳_第17张图片

 

样本是用易安卓写的。

样本链接: http://pan.baidu.com/s/1dEpUTXn

密码: rp6u

 

xxx加固 之 动态脱壳

http://www.52pojie.cn/thread-435746-1-1.html

 

 

0x1 对比

360加固动态脱壳_第18张图片

 

上传demo进行加固,解包后对比下原包和加固包,发现加固包在assets文件夹下多了libjiagu.so,libjiagu_x86,lib文件夹下多了libjiagu_art.so,同时修改了dex文件和AndroidManifest文件

 

360加固动态脱壳_第19张图片

 

打开manifest文件,看到xxx加固对Application标签做了修改,添加了壳入口,也就是我们反编译后看到的StubApplication.smali这个文件。

相比于之前版本的加固,自从1.x.x.x加固版本之后,多了几次反调试,使得动态难度稍微增大了一些,不过针对脱壳机脱壳,再多了反调试也是无用。或者通过修改系统源码,也能达到消除反调试的作用。

 

 

0x2 动态调试

(1)把app安装到手机,以调试模式打开app

(2)以shell模式root权限打开IDA的android_server监听

(3)tcp转发

(4)打开IDA,修改配置为在进程开始时下断

 

 

360加固动态脱壳_第20张图片

 

(5)搜索到进程后jdwp转发,pid值即为我们进程号,并在命令行下附加。

 

360加固动态脱壳_第21张图片

 

成功附加后,可以下段了,打开Debugger Option

 

360加固动态脱壳_第22张图片

 

我们选择在线程开始和库加载时下断,修改成功后,jdb附加,点击运行

 

360加固动态脱壳_第23张图片

 

程序会断在elf头处,按下G键,搜索mmap,在mmap函数的段首和断尾下段

 

360加固动态脱壳_第24张图片

 

F9运行,来到断尾时F8单步,

 

360加固动态脱壳_第25张图片

 

来到此处时,在 BLunk_5C999C2C下断,F9一下,F7跟进去

 

360加固动态脱壳_第26张图片

 

跟进去今后在BLX LR处进行下断,此处就是进行反调试的地方,原理依然是获取TracePid的值判断当前是不是处于调试状态,建议第一次调试的人在fgets和fopen处下断,再f7跟进此调用就可以看到TracePid的值了。

 

360加固动态脱壳_第27张图片

 

跟进去之后,我们直接把方法移到最下方,就可以看到kill符号了,这就是杀进程的地方,如果当前处于调试状态,则直接结束进程。

我们在此函数的所有cmpR0,#0处下断,F9一下后即断在断点处,观察寄存器窗口的R0值,实质就是当前的TracePid的16进制的值

 

360加固动态脱壳_第28张图片

 

不确定的可以使用cat /proc/pid/status进行对比一下,我们直接把R0置0,右键选择Zero Value即可清0,继续F9

 

360加固动态脱壳_第29张图片

 

我们看到程序又来到了mmap处,继续f9

 

360加固动态脱壳_第30张图片

 

当继续断在调用反调试功能的方法时,继续F7跟进,依然在所有的cmp R0,#0处下断,断下后把R0清0后继续F9运行

目前的规律是,调用BLXLR的第一次,第二次和第四次是进行反调试判断的,第三次并不影响,可以直接f9跳过去,三次反调试搞定后,就可以愉快的F9运行并观察堆栈窗口了

 

360加固动态脱壳_第31张图片

 

当看到出现如下所示时:

 

360加固动态脱壳_第32张图片

 

说明壳已经开始解密并释放dex文件了,我们直接F8单步十几步,最后F9一下就可以看到我们需要的dex头了

 

360加固动态脱壳_第33张图片

 

直接脚本dump出来即可,最后把libjiagu的所有文件删除,并修复下Application标,如果存在则修复,不存在删除即可



pdf下载:  360动态脱壳.zip (215.26 KB, 下载次数: 743) 
帖子所用demo:  apk.zip (2.19 MB, 下载次数: 1052)

 

 

 

 

 

 

你可能感兴趣的:(Android脱壳)