安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)

安卓逆向——某力播逆向分析(脱壳)

 

一、环境

这一步真的头疼,环境很重要,各种测试,一下是我测试的环境,由于没有真机,就拿虚拟机做测试

1.  Xposed       2. FDex2         3. fiddler     4. 软件 

 

二、抓包

通过 fiddler 抓包分析参数

可以看到,俩次请求的参数, udid 是一样,可以不用变,timestamp 应该是个时间戳,signature 可以经过某种变化的,也是主要分析的

三、脱壳

1、查看加固  

首先对apk进行反编译

 
  1. # 首先对apk进行反编译

  2. apktool d com.iCitySuzhou.suzhou_8.2.apk

进入到反编译后的文件夹

 
  1. 进入到反编译后的文件夹

  2. cd com.iCitySuzhou.suzhou_8.2

查看lib文件夹下的so文件

 
  1. .

  2. ├── libBugly.so

  3. ├── libYLEncode.so

  4. ├── libjcore110.so

  5. ├── liblbs.so

  6. ├── liblocSDK6a.so

  7. ├── libshella-2.9.0.2.so

  8. ├── libshellx-2.9.0.2.so

  9. ├── mix.dex

  10. └── mixz.dex

如何确认是什么加固呢? 不同的加固厂商有不同的加固特征, 查看lib下的so文件libshella这个就是 乐加固 的特征,可以直接百度搜索一下, 不知道如何确认 就把每个文件都在百度搜索一下。

2、进行脱壳

通过上一步我们知道了该App为乐加固, 现在我们通过FDex2来进行脱壳, 打开我们已经安装好的FDex2

             

点击引力播

            

将这几个文件 使用adb pull 拉取到本地 

使用jadx把这几个文件打开看下, 看看哪个是我们所需要的脱壳后的文件,

经过验证com.iCitySuzhou.suzhou0015542488.dex

这个就是我们脱壳后所需要的文件。 脱壳成功

四、signature分析

1、定位signature

全局搜索signature

可以看到很多结果,这个就需要自己一个一个去看看,去找到正确的,

可以看到这里,应该可以看出是个赋值的操作吧,点进去

我这里用了反混淆,更好的分析代码,不然搜索一下出现很多不太好分析,找到 那个方法 鼠标右击 跳转申明 (跳到申明函数的地方)

(这里反混淆,只是吧方法或者变量变成 唯一的好查找而已,工具----》反混淆)

m12059a(udid, valueOf)  这里传了俩个参数,应该udid 应该获取的设备号,valueOf 是获取的时间戳

这里 signature 参数方法,在 跳转声明 到下面这个地方,这里应该是调用了什么 MD5 的加密方法

通过 上面应该函数的 参数,进行 MD5 加密  在经过 字节偏移 得到的值

这里 有俩种方法,1.  自己 重写 signature算法    2. 复制 原来的 java 代码

我用 第二种方法吧,

1.   复制 java代码,保持为 java 文件 

2.   编译Java成class javac MySig.java

2.   把class文件打包成jar包   jar  cvf  (新jar的名字)  (.class文件,多个则中间用空格隔开)  

         如: jar  cvf  test.jar test.class  test2.class

3.   python 来执行 jar 包 ,jpype 包,,用 pip install jpype1 安装

5.  撸代码

把 3个 signature ,timestamp,udid 参数配置好就可以模拟请求了。代码如下

 
  1. from jpype import *

  2. import time

  3. import requests

  4.  
  5. uuid = 'IMEI860000000065903-IMSI460001993232212'

  6. # udid = "IMEI867686021698806-IMSI460NNNNNNNNNNNN"

  7.  
  8. str_2 = str(int(time.time()))

  9. str_1 = "f1190aca-d08e-4041-8666-29931cd89dde"

  10.  
  11. str_sign = "%s&&%s&&%s"%(uuid,str_2,str_1)

  12.  
  13. def Getsignature(str_sign):

  14. jvm_path = getDefaultJVMPath()

  15.  
  16. jar_path = 'F:\\mysig.jar' # jar包路径

  17. startJVM(jvm_path, '-ea', '-Djava.class.path=%s' % jar_path) # 启动虚拟机

  18. JClass2 = JClass('mysig')

  19. instance = JClass2()

  20. sum = str(instance.get_sign(str_sign))

  21. print(type(sum),str(sum))

  22. print(type(str(sum)),str(sum))

  23.  
  24. # shutdownGuiEnvironment()

  25. # shutdownJVM()

  26. return sum

  27.  
  28. def GetDate(signature):

  29. Headers = {

  30. 'sys': 'Android',

  31. 'sysVersion': '6.0.1',

  32. 'appVersion': '8.2',

  33. 'appVersionCode': '54',

  34. 'udid': uuid,

  35. 'clientType': 'android',

  36. 'timestamp': str_2,

  37. 'signature': signature,

  38. 'Host': 'app.suzhou-news.cn',

  39. 'Connection': 'Keep-Alive',

  40. 'Accept-Encoding': 'gzip',

  41. 'User-Agent': 'okhttp/3.9.0',

  42. }

  43.  
  44. for i in range(1,100):

  45. Url = 'https://app.suzhou-news.cn/api/v1/appNews/getBannerNewsList7?page={}&bannerID=11 '.format(i)

  46. res = requests.get(Url,headers=Headers, verify=False)

  47. print('弟 %s 页'%(i),res.json())

 模拟请求了100页,下面是 运行的结果,

 

作者 源代码  下载

 

补充 :

环境要慢慢测试,模拟器很多问题,建议真机,最好 Android 6 ,以下是我测试过的环境

        

 

前言

之前介绍了普通常见的反编译模式 但对于使用了 360加固 棒棒 爱加密 等等的加固应用就没办法了、

你会发现反编译出来的dex 只有几个类 逻辑都是调用so   

真正的dex会被加载到内存中隐藏起来 加固应用都是多dex这种形式

要想拿到他真正的dex 需要进行脱壳处理  基本原理都是从内存中dump 我一般会先用工具来尝试 不行的话就得上 IDA(反汇编神器)超级强的一个工

具 杀手级别 贯穿移动端 PC端的逆向 但使用IDA 进行静态分析 动态调试脱壳就变的很麻烦了 而且并不是一两天能学会的

以后会介绍使用 我们今天先用工具尝试简单的脱壳

 

 

 

ZjDroid工具介绍

 

ZjDroid是基于Xposed Framewrok的动态逆向分析模块,逆向分析者可以通过ZjDroid完成以下工作: 1、DEX文件的内存dump 2、基于Dalvik关键指针的内存BackSmali,有效破解主流加固方案 3、敏感API的动态监控 4、指定内存区域数据dump 5、获取应用加载DEX信息。 6、获取指定DEX文件加载类信息。 7、dump Dalvik java堆信息。 8、在目标进程动态运行lua脚本。

 

ZjDroid github开源的一个项目 主要功能就是脱壳 基于内存dump 其他功能一般  作者很NB 总有些人可以把Xposed玩出花来

我下篇博客会介绍一个针对安卓端应用分析工具 很强大!

工具准备

已ROOT手机一台并装好xpsoed框架在装上ZjDroid模块  

 

JEB  apk专业逆向工具 但是和IDA一样要花钱 吾爱论坛提供破解版本

 

这里提一下jeb的优势 可以直接打开apk进行反编译 而已还原效果好

jd-gui看反编译出来的jar(源码)有些代码为注释状态 显示不出来  但JEB 肯定可以全部还原

 

爱盘地址            ZjDroid地址

 

实战案例

某个朋友托我逆向个应用 叫微丢丢 微信营销的 去官网下载APK 拖到JEB里简单的看了下

只有几个类 一看就是加固应用 并且使用的是360加固   这种结构的类 在有个Application 铁定的加固应用 

至于做了哪些操作 基本都是常见的套路 释放so文件 到应用沙盒目录下

 

注意 JEB 反编译出来的代码 初始状态都为smali  需要用快捷键Q或者鼠标右键Decompile下 

 

 

 

简单分析过后 下载apk到安装好ZjDroid的手机中   打开应用到主界面  

 

 

我们需要获取这个应用的pid值 这就需要用到一个命令了 PC端 WIN+X+R CMD 进入CMD窗口输入命令

命令: adb shell dumpsys activity top 

获取到当前程序的Activity信息 这个命令很实用 最好记一下

 

如果显示过多 可以写成 adb shell dumpsys activity top |more  按行输出

 

 

 

 

获取这个应用的包名 com.haiqu.oem 还要牢记这个pid 8445之后的操作都会用到他 

接着我们来使用pid查看这个应用在手机里面 dex 所在的位置

查询 dex 信息 所在位置


am broadcast -a com.zjdroid.invoke --ei target 8445 --es cmd '{action:dump_dexinfo}'

 

 

有些时候输入这条命令会报一条警告:

WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.
WARNING: linker: app_process has text relocations. This is wasting memory and is a security risk. Please fix.

 

警告:链接器:app_process有文本重定位。 这是浪费记忆,是一个安全隐患。 请修复  

无视就可以 警告而已

 

记住先adb shell 一下进到手机目录 在输入这条命令

 

输入这条命令 我们发现并没有什么实际的变化 需要使用ZjDroid 特有的查看LOG命令

 LOG 查询  后戳为你要查询应用的包名
adb logcat -s zjdroid-shell-com.haiqu.oem

 

记住在开个CMD窗口哦  

 

这就获取到了 apk所在的位置 filepath: /data/app/com.haiqu.oem-1.apk   记下来  下一步我们会用到这个

这里说明下 5792 是我重启了次手机 pid变成了5792

开始脱壳  命令:

 

am broadcast -a com.zjdroid.invoke --ei target 5792 --es cmd '{action:backsmali, "dexpath":"/data/app/com.haiqu.oem-1.apk"}'

 

输入完命令 回到LOG cmd窗口进行查看

 

 

 

上面的/data/data/com.haiqu.oem/files/dexfile.dex  就是脱出来的dex 拿到了dex基本就是拿到了源码 

 

我们使用RE文件管理器 进到这个目前下 直接使用QQ发送电脑不行 该文件不支持此操作 

 

需要把他挪到根目录下 在使用豌豆荚或者其他工具 直接发送到电脑上

 

在使用 安卓逆向助手把dex转成jar 或者用dexjar 都行 就可以使用jd-gui直接查看代码 工具很多 我之前有一篇博客介绍了安卓逆向助手的使用 不懂的可以去看下  JEB也可以直接打开dex格式文件 直接进行查看

 

 

总结

到这里这个工具最重要的功能介绍完毕 很简单 但也能对付一些普通加壳应用 

 

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

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

相关文章

nginx php mysql一些常用命令(windows linux)

Nginx(nginx) 通常安装路径 /usr/local/nginx检查Nginx是否运行 ps aux | grep nginx重启Nginx /usr/local/nginx/sbin/nginx -s reload停止Nginx /usr/local/nginx/sbin/nginx -s stop测试配置 /usr/local/nginx/sbin/nginx -tPHP(php) PHP安装路径 /usr/local/php查看PH…

nodejs图片转换字节保存

fs.readFile(上传图片路径, function(err, data) {if (err) {// 错误处理return;}var base64str new Buffer(data).toString(base64); // 图片转换为字节fs.writeFileSync(copy.jpg, base64str); // 字节流保存为图片});

Apache/Tomcat/JBOSS/Nginx(2)

三.性能测试:将分别测试3种软件在对动态页面和静态页面请求及并发时的响应时间l 静态页面搜狐首页LIGHTTPDn/-c(ab参数)cpu%MemRequestsperSecondTime taken for tests100000/1006460462.7521.6100000/2006760312.0732.4100000/5008360137.2472.8100000/1000出现错误…

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

【技术分享】Android程序反混淆利器——Simplify工具 https://www.anquanke.com/post/id/85388 发布时间:2017-01-23 17:21:23 问题背景 Android程序代码混淆是Android开发者经常用来防止app被反编译之后迅速被分析的常见手法。在没有混淆的代码中,被…

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…