环境及工具

手机    :  中兴 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. OpenGL 使用GLFW创建全屏窗口

    OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...

  2. 如何设置 Windows 默认命令行窗口大小和缓冲区大小

    关键字: 命令行不能全屏 命令行最大化只有一半屏幕 命令行 字体 背景 颜色 解决方案:http://unmi.cc/save-windows-command-size/ 简要说明: win+r,输入 ...

  3. CODING 代码托管架构升级之路

    本文为 CODING 创始团队成员王振威在『CODING 技术小馆:上海站』的演讲实录. CODING 技术小馆,是由国内专业的一站式软件服务平台 CODING 主办的一系列技术沙龙.将邀请数位业内知 ...

  4. IPMITOOL常用操作指令V1.0

    一.开关机,重启 1. 查看开关机状态: ipmitool -H (BMC的管理IP地址) -I lanplus -U (BMC登录用户名) -P (BMC 登录用户名的密码) power statu ...

  5. CentOS6.5 Cloud-Init使用

    使用cloud-init实现虚拟机信息管理 http://blog.marvelworld.tk/?p=575 谈谈Openstack的CentOS镜像 http://www.chenshake.co ...

  6. 【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]

    思路:用一个栈来管理树的层次关系,索引代表节点的深度 方法一: TreeNode* recoverFromPreorder(string S) { /* 由题意知,最上层节点深度为0(数字前面0条横线 ...

  7. 为什么要使用func.call(this)

    1.为什么要使用func.call(this) 在正常模式下,js 函数里那些你没有声明就使用的变量,其实是访问的全局对象的属性.但是在严格模式下,不允许这种语法,所有变量都必须要显示声明,所以如果你 ...

  8. 在mac上使用sublime text3搭建opencv3开发环境

    安装sublime text3 打开mac终端,安装brew 安装opencv3,终端输入下面的coomand: brew install opencv@3 注意:@3表示安装的版本,如果不加@3,那 ...

  9. SSM整合文档

    SSM整合文档 v2 一. 文件说明 文件名 描述 spring-servlet.xml 配置SpringMvc框架相关 applicationContext.xml 配置Spring容器 sprin ...

  10. Could not find iPhone X simulator

    Could not find iPhone X simulator Error: Could not find iPhone X simulator at resolve (/Users/zhouen ...