安卓逆向代码反混淆 Simplify工具 JEB2反混淆神器

【技术分享】Android程序反混淆利器——Simplify工具

https://www.anquanke.com/post/id/85388

发布时间:2017-01-23 17:21:23

http://p4.qhimg.com/t018b6e8fa6459b2f2a.jpg

问题背景

Android程序代码混淆是Android开发者经常用来防止app被反编译之后迅速被分析的常见手法。在没有混淆的代码中,被反编译的Android程序极其容易被分析与逆向,分析利器JEB就是一个很好的工具。但是加了混淆之后,函数、变量的名称将被毫无意义的字母替代,这将大大提高分析的难度。有的甚至会增加一些冗余代码,比如下面的例子:

public void doBadStuff() {int x;int y;x = Integer.valueOf("5")y = Integer.valueOf("10")x = x * y;x += 5;x /= 3;hackYourPhoneLOL("backdoor");x = y;y = x + 10;y /= 2;
}

该函数的实际意图其实就是执行hackYourPhoneLOL("backdoor");,但是通过代码混淆,增加很多冗余的代码, 使得实际分析的时候工作量增加。对于代码混淆,其实一直并没有一个比较好的思路,也没有万能的工具来解混淆,最常见的方式就是用Android gradle proguard 去尝试那些用Android gradle proguard混淆过的代码,但是成功率极其低(比如对于用DexGuard混淆过的代码)。

 

public void doBadStuff() {hackYourPhoneLOL("backdoor");
}

今天要介绍的工具,就是一个通用的Android程序反混淆工具,虽然在执行效率上不是很高,但是思路清晰,代码风格好,值得深入学习与优化。下图是在使用该工具前后,反编译代码的对比图。

 

http://p9.qhimg.com/t01fe6eef0ff5b8d689.png

图1:代码解混淆之前

t0178a65a8b438eca4d.png

图2:代码解混淆之后

可以发现,在代码解混淆之后,关键函数名称、正则表达式等等字符串都能够解析出来了,这样的反编译结果将非常适合分析人员进一步分析恶意代码的功能。

这是github地址:https://github.com/CalebFenton/simplify

该工具的核心思路,就是自己模拟的Dalvik虚拟机执行的方式,将待反编译的代码执行一遍,获知其功能后,将反编译之后的代码简化成分析人员便于理解的形式。

 

安装方式

 由于该项目包含Android框架的子模块,因此用以下两种方式获取代码:

 

git clone --recursive https://github.com/CalebFenton/simplify.git
or
git submodule update --init --recursive

接着,使用gradlew编译jar文件,当然前提是系统里面安装过了gradlew

 

./gradlew fatjar

在成功执行之后,Simplify.jar 应该出现在simplify/build/libs/simplify.jar这里,接着你可以使用以下命令行测试Simplify.jar是否安装成功

 

java -jar simplify/build/libs/simplify.jar -it 'org/cf' simplify/obfuscated-example

注:安装可能出现的问题

由于该工具还在前期开发阶段,因此作者也提出该工具不是很稳定,因此可以尝试使用下面的方式反复尝试是否成功。

1. 首先,确定分析的smali文件包含不多的method或者classes的时候,可以使用-it命令。

2. 如果因此超过了最大的地址访问长度、函数调用分析深度、最大的方法遍历次数等,可以通过改变参数 –max-address-visits, –max-call-depth, –max-method-visits.来修正。

3. 如果实在不行,就是用-v参数来报告问题吧。

完整的使用命令在github中有,这里不再赘述。

 

例子分析

这里以github里面的一个引导性的例子为切入,来介绍该工具是如何工作的。在介绍该工具如何工作之前,首先简单介绍一下该项目里面包含的模块。

1. smalivm: 该模块是Dalvik虚拟机的模拟器模块,主要用来模块Dalvik虚拟机的执行。它能够根据输入的smali文件返回所有可能的执行路径以及对应的路径得到的寄存器的值。该模拟器能够在不知道一个函数参数的情况下进一步分析,它的方式就是将函数中存在分支的所有结果模拟执行一遍,在完全执行完毕之后,该工具会返回程序执行的每条路径的寄存器的结果,从而便于simplify模块进一步分析,简化混淆的代码。

2. simplify: 该模块是解混淆的主要模块,主要基于smalivm的分析结果,简化混淆的反编译代码,得到易于理解的反编译代码。

接下来看看例子,该例子是java代码的形式编写的。

1. 首先需要新建一个模拟器,其中,SMALI_PATH是自己配置的待分析的smali文件的路径,在这里就不贴出待分析的样例main.smali文件,太长了,github的地址。

 

        VirtualMachineFactory vmFactory = new VirtualMachineFactory();vm = vmFactory.build(SMALI_PATH);

2. 接下来,是使用该工具提供的hook函数的功能将某些函数hook掉,由于有些函数会影响模拟器的外部输出结果,比如System.out.println(),因此,需要将这些函数hook,以在保证函数正常运行的情况下,得到smalivm正常输出的结果。

 

MethodEmulator.addMethod("Ljava/io/PrintStream;->println(Ljava/lang/String;)V", java_io_PrintStream_println.class);

3. 接下来,是执行待分析smali文件的main函数。    

  vm.execute("Lorg/cf/demosmali/Main;->main([Ljava/lang/String;)V");

4. 最后,根据不同的函数参数输入类型,选择对应的函数分析方式分析Android程序的功能,此外,除了函数本身参数的类型,分析的方式额外的根据自己的需求选择有参数还是无参数分析,此处的选择可以不用局限于函数本身的参数类型。有参数的方式能够加快分析速度,但是往往很多情况下,我们并不知道参数应该设置成什么值,不恰当的值会导致   

 executePrintParameter(42);executeParameterLogicWithUnknownParameter();executeParameterLogicWithKnownParameter(10);

注意,由于在无参数分析的情况下,该工具会穷举所有可能的分支结构,因此需要将前面提到的三个参数的数值设置大一些,分析的时间也将响应的变长。

5. executePrintParameter和executeParameterLogicWithKnownParameter这两个函数应该好理解,就是将输入带入进去分析了。接下分析一下executeParameterLogicWithUnknownParameter这个函数。首先是建立目标函数的签名,该名称直接根据待分析的目标函数的签名而来:

 

String methodSignature = "Lorg/cf/demosmali/Main;->parameterLogic(I)I";

6. 使用smalivm执行在无参数情况设置下的函数,在这个样例中,smalivm应当输出两个结果,这代表了smalivm执行了两条路径。

 

ExecutionGraph graph = vm.execute(methodSignature);

7. 获取smalivm分析得到所有的分析路径,不同路径有不同的返回结果,因此能够输出所有的返回结果。getTerminatingRegisterConsensus这个函数可以很方便获得所有返回寄存器的地址,从而得到输出的结果。

HeapItem item = graph.getTerminatingRegisterConsensus(MethodState.ReturnRegister);System.out.println("With no context, returns an unknown integer: " + item);

 

http://jackzhang.info/2018/08/28/Android-%E5%8F%8D%E6%B7%B7%E6%B7%86%E7%A5%9E%E5%99%A8JEB2%E7%9A%84%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B/

JEB2工具的基本使用

首先下载jeb2.2.5破解版

下载link: 链接:http://pan.baidu.com/s/1bJdWse 密码:ncr3

Jeb支持Windows,Linux,Macos 系统我这里用的Windows系统所以点击jeb_wincon.bat,然后在JEB2中打开需要逆向的apk

 

双击Bytecode打开smali代码

 

点击Bytecode/Hierarchy窗口即可查看包名树状图 树状图排列: 包名->类名

 

双击包名下的类名即可查看smali代码

 

想把smali代码转换成java代码 很简单 只需右键Q即可

 

双击方法即可跳转到方法的定义 点击方法按x键可以查看方法的调用

 

 

双击Manifest即可查看AndroidManifest.xml

以上就是JEB2的基本用法,接下来重点来了

JEB2反混淆脚本

反混淆脚本思路

许多APK开发商为了在崩溃时保存源文件类名、行号等信息会在APK混淆时添加以下规则保留源文件信息.

(注意:若APK没有保留这些源信息时则无法反混淆)

-keepattributes SourceFile,LineNumberTable

这样我们在看Smali时就能在(JEB中称为)字段中看到原始类名信息.如下图所示:

 

JEB2.2.x是默认不显示这些调试信息的可以根据以下步骤在设置中打开:Edit -> Options -> Engines -> 修改ShowDebugDirectives的值为true

这样我们就可以在JEB2中根据每个类的原始信息进行批量重命名达到反混淆的效果。

脚本下载地址:

https://github.com/S3cuRiTy-Er1C/JebScripts

加载脚本之前先需要在 jeb225/scripts/目录下安装Jypthon环境,具体步骤如下:

Setting up Jython:

  • Download a stand-alone Jython package from http://www.jython.org/downloads.html We recommend either version 2.5 (fastest) or version 2.7 (latest)
  • Drop the downloaded ‘jython-standalone-???.jar’ file in the scripts/ sub-directory located in your JEB installation directory
  • Make sure that the client property ‘.ScriptsFolder’ refers to that directory (it is the case by default; use ‘Edit/Options, Advanced…’ to verify this)

我这边下载的是 jython-standalone-2.5.4-rc1

完成后打开JEB2 -> File -> Scripts -> Run Scripts -> 选择从上面下载的 JEB2DeobscureClass.py脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vmware虚拟机的安装和使用

安装虚拟机 一、安装虚拟机Vmware Workstation 下一步 下一步 如果C盘剩余空间大(大于50G),可安装在C盘 二、在虚拟机中安装Linux系统: 准备工作: Linux系统镜像文件(ISO文件) 1 、新建虚拟机…

【项目经验】如何用TexturePacker Physicseditor开发游戏

首先感谢Andreas的license。先广告一下Andreas。 -----------------------------------------------------------------------------------------http://www.codeandweb.com/texturepacker - The sprite sheet creator turns chaos into orderhttp://www.codeandweb.com/physic…

smbd的安装与使用

文件共享服务软件 samba 安装与配置 安装了samba服务的主机,可以将文件共享给其它用户,其它用户可以对文件进行读写操作。 安装 以Ubuntu Linux为例 1、 安装 2、 检查是否安装成功 启动 samba服务: 查看samba服务状态: 3、 添…

Laravel-admin 分类避免踩坑

一、模型层引入 use Encore\Admin\Traits\AdminBuilder; use Encore\Admin\Traits\ModelTree; 在方法中使用 use ModelTree,AdminBuilder; 最终代码为 <?phpnamespace App\Model;use Illuminate\Database\Eloquent\Model; use Encore\Admin\Traits\AdminBuilder; use Enco…

python使用python-barcode生成任意长度字符串的条形码(一维码)详细教程

使用python-barcode生成一维码 1.安装python包 pip install Pillow pip install python-barcode2.实例程序 # -*- coding: utf-8 -*-import barcode import random from barcode.writer import ImageWriter import os from PIL import Image#生成一维码的类型的种类 "&…

Objective-C学习笔记(一)–类

1、类的定义与实现1.1说明所有的类都是继承NSObject。类的接口与实现是分开的&#xff0c;一般类的定义是放在.h文件【包含类的名称、成员变量、方法、属性、继承关系 、遵从的协议】&#xff1b;实现部分是放在.m文件中【包含每个属性和方法的具体实现以及协议的方法实现】语法…

laravel支付宝sdk接入

自己学习使的 仅供参考 一、打开蚂蚁金服开放平台 找到研发服务->沙箱应用 设置沙箱应用保证可以使用 二、找到sdkdemo下载放到本地环境并改名为alipay配置里面的config 注释有详细的讲解仔细看 三、&#xff08;这里是我的习惯&#xff09;放到laravel的app下 四、去confi…

npm上传自己的项目

npm安装就不介绍了&#xff0c;自行度娘。本文介绍npm上传 先初始化&#xff1a;npm init 根据提示填完系统介绍信息&#xff08;package.json&#xff09;&#xff1b; 再登录npmjs&#xff1a; npm login 效果如图&#xff1a; 输入注册的用户名、密码、邮箱&#xff0c;…

融于心而表于行 之 程序的执行问题

2.4 程序的执行问题Linux的多用户说完了&#xff0c;还需要进行下一个话题&#xff0c;那就是多任务的问题。所谓多任务&#xff0c;就是同一时刻能够执行多个程序。这个问题其实对于大多数Windows用户它都不是个问题&#xff0c;因为我们经常会一边浏览网页&#xff0c;一边用…

WebStorm文件类型关联设置

无意中创造了一个没有扩展名的文件&#xff0c;我选择了错误的文件类型关联。是js类型的&#xff0c;我却选成了文本&#xff0c;Ws每次编辑类型就成了txt文本&#xff0c;这个问题让我很苦恼&#xff0c;以下是我的解决方案。 错选的弹出框如下&#xff1a; 解决方案如下&…

WebStorm按Tab建快速生成代码模块

WS中&#xff0c;比如调试每次都要写的console.log(xxx);每次都要敲一遍&#xff0c;还有if模块&#xff0c;for循环模块&#xff0c;难道没有快捷键&#xff0c;可以生成代码模块吗&#xff0c;答案是“有”。 操作步骤如下&#xff08;汉化版WS&#xff09;&#xff1a; 1、…

iterm2一键登陆服务器(门神权限不用每次都输密码进行验证)

1、新建文件 vim ~/.ssh/config 在打开的文件中输入以下内容 Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 #保持持久链接 每60s 发送一个请求检测2、 新建文件 并赋予可执行权限&#xff…

STM32 cubeMX 光敏电阻AD转化实验

文章代码使用 HAL 库。 文章目录 前言一、光敏电阻介绍二、光敏电阻原理图解析三、ADC采样介绍1. 工作原理&#xff1a;2. ADC精度&#xff1a; 四、STM32 cubeMX配置ADC采样五、代码编写总结 前言 实验开发板&#xff1a;STM32F051K8。所需软件&#xff1a;keil5 &#xff0c;…

tls握手浅析

首先上图&#xff1a; tcp三次握手完毕 tls&#xff1a; 1、client hello client random 支持的tls 支持的算法 2、server hello server random 选择的tls协议 选择的算法 证书 公钥 3、client 公&#x1f511;加密后的。 premaster secret server 私钥解密得到 premas…

第二题:坦克游戏1.0(方法:动态规划)

stO 在此给某位靠打01背包处理射程并AC的大神跪了 Orz 问题描述&#xff1a; henry公司最近推出了一款新的坦克游戏。在游戏中&#xff0c;你将操纵一辆坦克&#xff0c;在一个NM的区域中完成一项任务。在此的区域中&#xff0c; 将会有许多可攻击的目标&…

linux 使用systemctl 设置java进程开机启动,管理springboot开机进程

该过程默认已经安装jdk。java程序启动方式有多重&#xff0c;列出如下几种。 1、java -jar demo.jar 使用该命令程序在控制台输出启动&#xff0c;当按下CtrlC和关闭终端时&#xff0c;程序会终止。输出日志&#xff0c;在后面加上 > 文件名&#xff0c;如&#xff1a;java…

Opencv 深度学习识别性别和检测年龄

目录 1基于CNN的性别分类建模原理 1.1 人脸识别 1.2 性别预测 1.3 年龄预测 1.4 结果 2 代码 参考 本教程中&#xff0c;我们将讨论应用于面部的深层学习的有趣应用。我们将估计年龄&#xff0c;并从单个图像中找出该人的性别。模型由GilLevi和TalHassner训练&#xff0…

结构体和联合体

结构体&#xff1a; 8个为一个内存地址 依次向下 联合体&#xff1a; 共用一块内存地址 调试可以gcc -g -o输出编译。然后gdb执行 d打断点。n下一行。p输出。查看每一个所占的内存地址 宏定义和使用 #define 宏名称 “实现什么东西” 大小端 可以自行判断自己电脑 摘自…

Log4j的应用实例

建一张表&#xff0c;如下&#xff1a; create table log4j( logId int not null auto_increment,--流水号 createDate varchar(45) default null,--日志生成时间 thread varchar(45) default null,--当前线程 level varchar(45) default null,--当前日志的级别 …

AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-代码解析...

一、AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍&#xff0c;我们知道 AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件&…