安卓逆向代码反混淆 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,一经查实,立即删除!

相关文章

nodejs字符与字节之间的转换

new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg */new Buffer("SGVsbG8gV29ybGQNCg").toString("ascii"); /* yields Hello World */

Vmware虚拟机的安装和使用

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

XCode快捷键

1. 文件CMD N: 新文件CMD SHIFT N: 新项目CMD O: 打开CMD S: 保存CMD SHIFT S: 另存为CMD W: 关闭窗口CMD SHIFT W: 关闭文件2. 编辑 CMD [: 左缩进CMD ]: 右缩进CMD CTRL LEFT: 折叠CMD CTRL RIGHT: 取消折叠CMD CTRL TOP: 折叠全部函数CMD CTRL BOTTOM:…

pyinstaller 打包python应用为exe后 打包出现failed to execute script

pyinstaller 打包python应用为exe后 打包出现failed to execute script 打包后出现如题问题,只需在打包语句中加入pkg_resources.py2_warn这个包 pyinstaller -F -w xxx.py --hidden-import pkg_resources.py2_warn

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

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

JSON.stringify转换Date不正确的解決方法

JSON.stringify转换Date不正确的原因:国际时区(UTC)和中国时区(GMT)的原因,东八区8等于国际时区。 解决方法,重新Es5的Date.prototype.toJSON方法,代码如下: function d…

smbd的安装与使用

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

PyQt5实现点击按钮获取文本框的值

目录 PyQt5笔记(01) – 创建空白窗体PyQt5笔记(02) – 按钮点击事件PyQt5笔记(03) – 消息框PyQt5笔记(04) – 文本框的使用PyQt5笔记(05) – 绝对位置 为了…

nodejs MVC

http://www.cnblogs.com/ppoo24/archive/2012/02/08/2343064.html

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…

设置让TortoiseGit记住账号和密码

方法一&#xff1a;在"C:\Documents and Settings\Administrator\.gitconfig" 文件 或 "项目/.git/config"文件 里增加两行&#xff1a; [credential] helper store 设置好&#xff0c;再次输入用户名和密码之后&#xff0c;以后就不需要输入了。 方法…

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文件中【包含每个属性和方法的具体实现以及协议的方法实现】语法…

SqlServer时间戳与普通格式的转换

/********************************************** 时间戳转换(秒) **********************************************/--普通时间转换为时间戳&#xff08;秒&#xff09;SELECT DATEDIFF(SS,1970-1-1 00:00:00,GETUTCDATE()) --毫秒时间戳转普通时间&#xff08;秒&#xff09…

laravel支付宝sdk接入

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

图片动画横条广告带上下滚动

查看效果&#xff1a;http://keleyi.com/keleyi/phtml/flash/ 以下是HTML文件代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns&q…

mysqli与pdo防sql注入源码

1.mysqli防注入 <?php//定义配置文件$config [//地址"host" > "127.0.0.1",//数据库名称"dbname" > "xxxx",//用户名"user" > "xxxx",//密码"pass" > "xxx"];//连接数据库…

npm上传自己的项目

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

PyQt5 打包问题解决 Unable to find “D:\anaconda3\lib\site-packages\PyQt5\Qt\translations\qtwebengine_locale

PyQt5 打包问题解决 Unable to find "D:\anaconda3\lib\site-packages\PyQt5\Qt\translations\qtwebengine_locale 今天用pyinstaller打包Pyqt5程序报了以下错误&#xff0c;通过在网上查询得到了解决方案 Unable to find "D:\anaconda3\lib\site-packages\PyQt5\Qt…

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

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