环境及工具

手机    :  中兴 U887

系统版本:    Android 2.3.5

工具    :    IDA pro 6.6 、0101Editor

版权声明:未经许可,随便转载

目前so加壳有很多家,我己知的有 爱加密,梆梆,360, 娜迦等 各有所长。今天把学习360的脱壳笔记记录下来与小菜共同学习,没有其它目的,大神请绕道!

1.对加壳后的so进行反编译,代码不能正常显示,被加密了,如下图所示:

查看so的"INIT_ARRAY",指向了壳的入口, 如下图所示:

2.用IDA反编译加壳后的so文件,到0Xfd30去(壳的入口函数),如下图所示

3.通过上面分析知道了入口在"INIT_ARRAY",接下来动态调试,(如果不知道如何到该入口的可以参考 0n1y3nd's 大神写的文章

http://0nly3nd.sinaapp.com/?p=649)到达壳入口后如下图所示:

与静态分析时是一样的。

4.壳反调试检查是否有如下调试器 gdb strace ltrace android_server,如下图所:

5.接下来解密第二层的壳代码,算法为RC4,如下图所示:

6.知道密钥和算法及要解密的数据与大小,我们来写程序静态解密so中的数据,解密后生成so文件然后反编译该文件,以前不能正常显示的代码现在都能正常显示了(第二层壳),如下图所示:

7.第二层的壳代码解密完后,INIT_ARRAY处的壳代码功能算是走完了,接着在JNI_OnLoad处下好断点,F9运行,如下图所示:

8.断在JNI_OnLoad后继续分析,Unk_8050303C函数解密原始so RC4算法,如下图所示:

解密后的数据以".lfx"开头, 如下所示:

9.将解密后的数据全部dump出来保存为lfx.Dump,与原始的so比较,看发生了什么变化,如下图所示:

10.将上面dump出来的文件lfx.Dump与没加壳前的so文件比较,发现不同的地方很多,说明还没有完全解密,继续分析,如下图所示:

开头4字节不一样

中间N多字节不一样

11.继分析后发现会对该文件的代码节进解压缩,这时候dump出来就会是原始的代码了,如下图所示:

解密原始so并解压代码的流程如下:

 libjuan.so:8050303C             loc_8050303C                            ; CODE XREF: 

 libjuan.so:JNI_OnLoad+p
libjuan.so:8050303C F0 4F 2D E9 STMFD SP!, {R4-R11,LR}
libjuan.so: D0 B2 9F E5 LDR R11, =(unk_8050FEE0 - 0x80503054)
libjuan.so: D0 9F E5 LDR R3, =0xFFFFFF68
libjuan.so: D0 9F E5 LDR R5, =(unk_8050D940 - 0x80503060)
libjuan.so:8050304C 0B B0 8F E0 ADD R11, PC, R11 ; unk_8050FEE0
libjuan.so: 9B E7 LDR R3, [R11,R3]
libjuan.so: 5B DF 4D E2 SUB SP, SP, #0x16C
libjuan.so: 8F E0 ADD R5, PC, R5 ; unk_8050D940
libjuan.so:8050305C 0C 8D E5 STR R3, [SP,#0xC]
libjuan.so: E5 LDR R3, [R3]
libjuan.so: A0 E1 MOV R1, R5
libjuan.so: 0A A0 E3 MOV R2, #0xA
libjuan.so:8050306C 1C 8D E2 ADD R0, SP, #0x1C
libjuan.so: 8D E5 STR R3, [SP,#0x164]
libjuan.so: FE FF EB BL memcpy_0 ; 拷贝密钥0XA字节
libjuan.so: ; libjuan.so: 1C 8D E2 ADD R0, SP, #0x1C
libjuan.so:8050307C 0A A0 E3 MOV R1, #0xA
libjuan.so: 8D E2 ADD R2, SP, #0x60
libjuan.so: 7E 0B EB BL init_Key
libjuan.so: 9F E5 LDR R3, =0xFFFFFF94
libjuan.so:8050308C 1C A0 E3+MOV R1, #0x451C ; 要解密的大小 0000451C
libjuan.so: 9B E7 LDR R9, [R11,R3]
libjuan.so: 8D E2 ADD R2, SP, #0x60 ; R2初始化的的密钥
libjuan.so:8050309C A0 E3 MOV R6, #
libjuan.so:805030A0 A0 E1 MOV R0, R9 ; R0要解密的数据 地址 805104CC
libjuan.so:805030A4 0C EB BL rc4_crypt ; 解密原始的so文件
libjuan.so:805030A8 2C A0 E3 MOV R2, #0x100
libjuan.so:805030AC A0 E3 MOV R1, #
libjuan.so:805030B0 E2 ADD R2, R2, #
libjuan.so:805030B4 8D E2 ADD R0, SP, #0x60
libjuan.so:805030B8 FE FF EB BL memset_0
libjuan.so:805030BC A0 E3 MOV R0, #
libjuan.so:805030C0 EB BL AnitDbg_0
libjuan.so:805030C4 E5 LDR R4, [R9,#0x20]
libjuan.so:805030C8 B2 D9 E1 LDRH R3, [R9,#0x32]
libjuan.so:805030CC A0 E3 MOV R2, #0x28
libjuan.so:805030D0 E0 ADD R4, R9, R4
libjuan.so:805030D4 E0 MLA R3, R2, R3, R4
libjuan.so:805030D8 E5 LDR R3, [R3,#0x10]
libjuan.so:805030DC E0 ADD R3, R9, R3
libjuan.so:805030E0 8D E5 STR R3, [SP,#]
libjuan.so:805030E4 EB BL __gnu_armfini_11
libjuan.so:805030E8 0D A0 E3 MOV R2, #0xD
libjuan.so:805030EC 0C E2 ADD R1, R5, #0xC
libjuan.so:805030F0 8D E2 ADD R0, SP, #0x28
libjuan.so:805030F4 F1 FD FF EB BL memcpy_0
libjuan.so:805030F8 8D E2 ADD R0, SP, #0x28
libjuan.so:805030FC D3 EB BL GetBase64String
libjuan.so: 8D E2 ADD R1, SP, #0x38
libjuan.so: 8D E2 ADD R0, SP, #0x28
libjuan.so: 8D E5 STR R6, [SP,#0x38]
libjuan.so:8050310C 3C 8D E5 STR R6, [SP,#0x3C]
libjuan.so: 8D E5 STR R6, [SP,#0x40]
libjuan.so: 8D E5 STR R6, [SP,#0x44]
libjuan.so: 8D E5 STR R6, [SP,#0x48]
libjuan.so:8050311C 4C 8D E5 STR R6, [SP,#0x4C]
libjuan.so: 8D E5 STR R6, [SP,#0x50]
libjuan.so: 8D E5 STR R6, [SP,#0x54]
libjuan.so: 8D E5 STR R6, [SP,#0x58]
libjuan.so:8050312C 5C 8D E5 STR R6, [SP,#0x5C]
libjuan.so: 4D EB BL DecBase64String
libjuan.so: 1C E2 ADD R1, R5, #0x1C
libjuan.so: A0 E3 MOV R2, #
libjuan.so:8050313C 8D E2 ADD R0, SP, #0x14
libjuan.so: DE FD FF EB BL memcpy_0
libjuan.so: 8D E2 ADD R0, SP, #0x14
libjuan.so: A0 E3 MOV R1, #
libjuan.so:8050314C 8A FF FF EB BL DecString_0
libjuan.so: B0 D9 E1 LDRH R3, [R9,#0x30]
libjuan.so: E1 CMP R3, R6
libjuan.so: A0 MOVEQ R6, R3
libjuan.so:8050315C 0A BEQ loc_80503248
libjuan.so: C0 9F E5 LDR R7, =(dword_805149E8 - 0x80503170)
libjuan.so: A0 E1 MOV R8, R6
libjuan.so: 8F E0 ADD R7, PC, R7 ; dword_805149E8
libjuan.so:8050316C
libjuan.so:8050316C loc_8050316C ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so:8050316C C0 9D E5 LDR R12, [SP,#]
libjuan.so: E5 LDR R0, [R4]
libjuan.so: 8D E2 ADD R1, SP, #0x14
libjuan.so: 8C E0 ADD R0, R12, R0
libjuan.so:8050317C DE FD FF EB BL strcmp ; 与.text比较
libjuan.so: E2 SUBS R3, R0, #
libjuan.so: 3D 1A BNE loc_80503280
libjuan.so: E5 LDR R5, [R4,#0x10]
libjuan.so:8050318C C0 E5 LDR R12, [R4,#0x14]
libjuan.so: A0 E7 LDR R10, [R9,R5]
libjuan.so: C0 8D E5 STR R12, [SP,#]
libjuan.so: 8D E5 STR R3, [SP]
libjuan.so:8050319C 0A A0 E1 MOV R0, R10
libjuan.so:805031A0 C3 FD FF EB BL malloc
libjuan.so:805031A4 E2 SUBS R6, R0, #
libjuan.so:805031A8 E0 ADD R5, R9, R5
libjuan.so:805031AC 9D E5 LDR R3, [SP]
libjuan.so:805031B0 0A BEQ loc_805032FC
libjuan.so:805031B4 5A E3 CMP R10, #
libjuan.so:805031B8 DA BLE loc_80503210
libjuan.so:805031BC 9F E5 LDR R1, =0xFFFFFF70
libjuan.so:805031C0 A0 E3 MOV R2, #
libjuan.so:805031C4 E0 9B E7 LDR LR, [R11,R1]
libjuan.so:805031C8 9E E5 LDR R1, [LR]
libjuan.so:805031CC
libjuan.so:805031CC loc_805031CC ; CODE XREF: libjuan.so:__gnu_arm_flush+28Cj
libjuan.so:805031CC E3 TST R3, #
libjuan.so:805031D0 1A BNE loc_805031F4
libjuan.so:805031D4 FE E3 CMP R1, #0xFE
libjuan.so:805031D8 8A BHI loc_805031F4
libjuan.so:805031DC 4C 9F E5 LDR R0, =0xFFFFFF6C
libjuan.so:805031E0 C0 D5 E7 LDRB R12, [R5,R2]
libjuan.so:805031E4 E2 ADD R1, R1, #
libjuan.so:805031E8 9B E7 LDR R0, [R11,R0]
libjuan.so:805031EC E2 ADD R2, R2, #
libjuan.so:805031F0 C1 C0 E7 STRB R12, [R0,R3,ASR#]
libjuan.so:805031F4
libjuan.so:805031F4 loc_805031F4 ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so:805031F4 ; libjuan.so:__gnu_arm_flush+25Cj
libjuan.so:805031F4 D5 E7 LDRB R0, [R5,R2]
libjuan.so:805031F8 E2 ADD R2, R2, #
libjuan.so:805031FC C6 E7 STRB R0, [R6,R3]
libjuan.so: E2 ADD R3, R3, #
libjuan.so: 5A E1 CMP R10, R3
libjuan.so: EF FF FF 1A BNE loc_805031CC
libjuan.so:8050320C 8E E5 STR R1, [LR]
libjuan.so:
libjuan.so: loc_80503210 ; CODE XREF: libjuan.so:__gnu_arm_flush+23Cj
libjuan.so: C0 9D E5 LDR R12, [SP,#]
libjuan.so: A0 E1 MOV R0, R5
libjuan.so: 8D E2 ADD R1, SP, #0x10
libjuan.so:8050321C A0 E1 MOV R2, R6
libjuan.so: 0A A0 E1 MOV R3, R10
libjuan.so: C0 8D E5 STR R12, [SP,#0x10]
libjuan.so: C2 FD FF EB BL uncompress_0 ; 解压代码(.text)
libjuan.so:8050322C E3 CMP R0, # ; 这时候dump可以得到原始的so so了
libjuan.so: 0A BEQ loc_805032D4
libjuan.so: F8 9F E5 LDR R3, =0xFFFFFF60
libjuan.so: BF 2E A0 E3 MOV R2, #0xBF0
libjuan.so:8050323C A0 E3 MOV R6, #
libjuan.so: 9B E7 LDR R3, [R11,R3]
libjuan.so: E5 STR R2, [R3]
libjuan.so:
libjuan.so: loc_80503248 ; CODE XREF: libjuan.so:__gnu_arm_flush+1E0j
libjuan.so: ; libjuan.so:__gnu_arm_flush+j ...
libjuan.so: 0C C0 9D E5 LDR R12, [SP,#0xC]
libjuan.so:8050324C 9D E5 LDR R2, [SP,#0x164]
libjuan.so: A0 E1 MOV R0, R6
libjuan.so: 9C E5 LDR R3, [R12]
libjuan.so: E1 CMP R2, R3
libjuan.so:8050325C 2C 1A BNE loc_80503314
libjuan.so: 5B DF 8D E2 ADD SP, SP, #0x16C
libjuan.so: F0 8F BD E8 LDMFD SP!, {R4-R11,PC}
libjuan.so: ; ---------------------------------------------------------------------------
libjuan.so:
libjuan.so: loc_80503268 ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so: A0 E1 MOV R0, R5
libjuan.so:8050326C 0C E0 ADD R1, R5, R12
libjuan.so: FE FF EB BL sub_80502C1C
libjuan.so: A0 E1 MOV R0, R6
libjuan.so: FD FF EB BL unk_805028D8
libjuan.so:8050327C A0 E3 MOV R6, #
libjuan.so:
libjuan.so: loc_80503280 ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so: A0 E3 MOV R0, #
libjuan.so: A1 EB BL AnitDbg_0 ; 反调试,查看是否有
libjuan.so: ; gdb strace ltrace android_server程序
libjuan.so: C0 9D E5 LDR R12, [SP,#]
libjuan.so:8050328C E5 LDR R0, [R4]
libjuan.so: 8D E2 ADD R1, SP, #0x38
libjuan.so: 8C E0 ADD R0, R12, R0
libjuan.so: FD FF EB BL strstr
libjuan.so:8050329C E3 CMP R0, #
libjuan.so:805032A0 0A BEQ loc_805032BC
libjuan.so:805032A4 E5 LDR R3, [R7]
libjuan.so:805032A8 0C E2 ADD R0, R4, #0xC
libjuan.so:805032AC E8 LDMIA R0, {R0-R2}
libjuan.so:805032B0 E0 ADD R1, R1, R3
libjuan.so:805032B4 E0 ADD R3, R0, R3
libjuan.so:805032B8 0E E9 STMIB R7, {R1-R3}
libjuan.so:805032BC
libjuan.so:805032BC loc_805032BC ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so:805032BC B0 D9 E1 LDRH R3, [R9,#0x30]
libjuan.so:805032C0 E2 ADD R8, R8, #
libjuan.so:805032C4 E2 ADD R4, R4, #0x28
libjuan.so:805032C8 E1 CMP R3, R8
libjuan.so:805032CC A6 FF FF CA BGT loc_8050316C
libjuan.so:805032D0 DC FF FF EA B loc_80503248
libjuan.so:805032D4 ; ---------------------------------------------------------------------------
libjuan.so:805032D4
libjuan.so:805032D4 loc_805032D4 ; CODE XREF: libjuan.so:__gnu_arm_flush+2B4j
libjuan.so:805032D4 9D E5 LDR R3, [SP,#0x10]
libjuan.so:805032D8 C0 9D E5 LDR R12, [SP,#]
libjuan.so:805032DC 5C E1 CMP R12, R3
libjuan.so:805032E0 E0 FF FF 0A BEQ loc_80503268
libjuan.so:805032E4 9F E5 LDR R3, =0xFFFFFF60
libjuan.so:805032E8 BF 2E A0 E3 MOV R2, #0xBF0
libjuan.so:805032EC A0 E1 MOV R6, R0
libjuan.so:805032F0 9B E7 LDR R3, [R11,R3]
libjuan.so:805032F4 E5 STR R2, [R3]
libjuan.so:805032F8 D2 FF FF EA B loc_80503248
libjuan.so:805032FC ; ---------------------------------------------------------------------------
libjuan.so:805032FC
libjuan.so:805032FC loc_805032FC ; CODE XREF: libjuan.so:__gnu_arm_flush+j
libjuan.so:805032FC 9F E5 LDR R2, =0xFFFFFF60
libjuan.so: BE 3E A0 E3+MOV R3, #0xBEF
libjuan.so: 9B E7 LDR R2, [R11,R2]

12.解压缩后再次dump出来保存为lfx1.Dump与原始的so比较,发现只有前4字节不一样了,如下图所示:

13.将第二次dump出来的lfx1.Dump文件的头4字节.lfx改成.ELF就成了,脱壳完毕。

14.总结: INIT_ARRAY--->解密第二层壳(JNI_OnLoad)---->解密原始so文件--->解压缩原始so的代码节。

样本 http://yunpan.cn/cVCApjnJvJue6 (提取码:85fc)

360 so动态脱壳的更多相关文章

  1. 360加固保so动态脱壳

    环境及工具 手机    : 中兴 U887 系统版本:   Android 2.3.5 工具    :   IDA pro 6.6 .0101Editor 目前so加壳有很多家,我己知的有 爱加密,梆 ...

  2. Android应用APP脱壳笔记

    [TOC] 天下游 模拟定位技术点简析 通过代码分析初步猜测模拟定位用到的几处技术点: 获取了Root权限 通过反射获取 android.os.ServiceManager 对应的函数 getServ ...

  3. ART模式下基于dex2oat脱壳的原理分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78513483 一般情况下,Android Dex文件在加载到内存之前需要先对dex ...

  4. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

  5. 脱壳系列—— 揭开so section加密的美丽外衣

    i春秋作家:HAI_ 0×00 前言 对so的加密,https://bbs.pediy.com/thread-191649.htm大神的帖子里已经很详细的说明了.当然加密不是我们研究的重点,如何搞掉这 ...

  6. iOS逆向系列-脱壳

    概述 通过iOS逆向系列-逆向App中使用class-dump工具导出App的Mach-O文件所有头文件.Hopper工具分析App的Mach-O文件代码大概实现.但是这些前体是App的Mach-O没 ...

  7. Microsoft Dynamics CRM 分销行业解决方案

    Microsoft Dynamics CRM 分销行业解决方案 方案亮点 360度动态渠道信息管理 充分的客户细分 全面的业务代表考核指标 业务代表管理和能力建设 业务代表过程管理 业务代表费用管理 ...

  8. Autodesk 最新开发技术研讨会-北京-上海-武汉-成都-西安-PPT下载

    经过半月的奔波,转遍祖国大好河山.结论,还是喜欢成都,安逸~,好希望能在成都生活,竹林里品茶,不亦乐乎~ 如果你没能参加我们的研讨会,下面的PPT供参考: 面向世界.面向未来 – Autodesk 云 ...

  9. Autodesk 最新开发技术研讨会 -8月22日-Autodesk北京办公室

    为了增进与广大中国地区Autodesk产品的二次开发人员的了解与互动,帮助中国地区的Autodesk产品二次开发人员了解Autodesk最新的二次开发技术动向,并获得Autodesk公司专业开发支持顾 ...

随机推荐

  1. String与字符数组

    public class Example { static String str = new String("good"); static char[] ch = {'a','b' ...

  2. 1.6 xss挑战平台练习

    ------------------------- XSS挑战之旅 ------------------------- 最近在学习xss,找到了一个xss练习平台,在线地址:http://test.x ...

  3. 7.30实习培训日志-SQL优化

    总结 今天早上考试,下午主要是老师引导我们学习SQL优化,晚上主要是同学的技术分享,杨松柏同学主要给我们分享了java的io的一些东西,c10k问题,bio(同步阻塞IO),NIO(同步非阻塞IO), ...

  4. java线程基础知识----java daemon线程

    java线程是一个运用很广泛的重点知识,我们很有必要了解java的daemon线程. 1.首先我们必须清楚的认识到java的线程分为两类: 用户线程和daemon线程 A. 用户线程: 用户线程可以简 ...

  5. fatal: Authentication failed (二)

    一.前言 前面一段时间写了一篇解决 git 上传代码出现的权限验证问题,还是没有很好的解决.现在还了方式,具体步骤如下: 二.操作流程 我们在上传代码到服务器,我们都需要安装 Git 版本控制.在安装 ...

  6. 从零开始安装 Ambari (2) -- 准备本地 repository

    安装 Ambari,最后是为了用它部署 hadoop 集群.安装时默认使用的是 hortonworks 远程的资源,用它部署集群时,需要下载 Hadoop.Hive.HBase 的安装包,速度很慢.我 ...

  7. linux下oracle一些常用命令

    dbca 配置数据库netca 配置tnslsnrctl status tns状态lsnrctl stop TNS停止lsnrctl start TNS启动

  8. web综合案例03

    web综合案例03 web综合案例03 web综合案例03 web综合案例03 ... 待复习

  9. JS模块

    本文主要内容翻译自<Exploring ES6-upgrade to the next version of javascript> 模块系统 定义模块接口,通过接口 隐藏模块的内部实现, ...

  10. js和css文件位置对页面性能的影响

    翻译了一篇Performance上的关于页面性能的文章<DecIPhering the critical rendering path>,原文在这里.需要进一步整理和了解有关js.css等 ...