Android逆向与安全——360 dex加固与脱壳( 二 )


Android逆向与安全——360 dex加固与脱壳

文章插图
 
F9运行程序 , 当看到下图的状态 , 调用open函数打开文件/proc/self/status时 , 可以确实是加固外壳apk程序通过TracePid的反调试 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
过掉通过TracePid方式的反调试的方法是在strtol函数处下断点 , 在strstol函数的最后一行指令的地方 , 修改该函数的返回值R0的值为0即可 , 然后F9运行程序 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
360加固的外壳程序apk还会通过文件/proc.NET/tcp的本地套接字进行反调试 , 一旦检测到程序有23946端口的本地连接的套接字 , 他就会结束当前程序 , 其实过这个方式的反调试的方法很多 , 修改远程调试的端口号就可以过掉反调试 。
Android逆向与安全——360 dex加固与脱壳

文章插图
【Android逆向与安全——360 dex加固与脱壳】 

Android逆向与安全——360 dex加固与脱壳

文章插图
 
过掉通过/proc/net/tcp文件的本地套接字的反调试的方法是在open函数处下断点 , 然后F8单步调试发现strstr函数 , 加固的外壳apk程序就是通过strstr函数进行判断当前进程是否存在本地连接的套接字 , 一旦检测到 , 就结束当前进程 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
发现程序循环调用strstr函数进行判断 , 当strstr函数的返回值不为0为字符串“sl local_address rem_address”时 , 需要注意 , 说明当前进程已经检测到了本地连接的套接字 , 因此需要修改strstsr函数的返回值为0即可 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 

Android逆向与安全——360 dex加固与脱壳

文章插图
 
加固apk程序还会通过"/proc/pid/mdline"对android_server、gdb、strace、ltrace调试器进行反调试 , 但是只要向前文提到的修改android_server的名称即可过掉该反调试 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
过掉反调试的方法已经说明白了 , 下面只要F9运行 , 按照前面的方法过掉几次前面提到的反调试即可畅快的调试程序了 。当发现当前进程调用open函数打开文件/proc/pid/maps需要注意了 , 脱壳需要关注的地方开始了 。原被加固的dex文件开始解压和解密了 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
经过几次F9的调试发现了下面截图的状态 , 但是不要心急 , 只是离脱壳进了一步 , 此时内存dump出来的odex文件不是被加固的原dex文件的而是加固外壳qihu360的dex文件 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
继续F9运行程序 , 经过n次F9运行memcmp函数以后(其实这里可以做一个处理 , 暂时去掉mmap函数的断点 , 等到mmap函数断点处再次设置mmap函数的断点) , 再经过大约2次mmap函数运行以后 , 再一次调用memcmp函数即到了脱壳的地方 , 注意此时加固外壳apk程序呈现的堆栈和内存的状态 。由于360加固自己制作了dvmDexFileOpenPartial函数 , 但是该函数需要调用memcmp进行dex文件的魔法字符串”dex“的比较 , 因此此时是脱壳的最佳时机 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
OK , 现在的任务就是从内存中dump出原来完整的dex文件 , 既可以手动的dump出内存中的dex文件 , 也可以通过IDC的脚本或者dumpdex的插件将原dex文件dump出来 。
Android逆向与安全——360 dex加固与脱壳

文章插图
 
原apk程序的Dex文件拿到了 , 只需替换360加固的外壳程序的dex , 删除AndroidManifest.xml文件的application标签增加的两个元素 , 删除assets文件的路径下增加两个文件libjiagu.so和libjiagu_x86.so以及原来的签名 , 重新签名一下apk程序即可 。


推荐阅读