/作者:Kali_MG1937

QQ:3496925334

CNBLOG博客号:ALDYS4
/

某天午睡,朦朦胧胧梦到给学校提供建站模板的公司有个注射点

梦醒后,我凭借着零散的记忆日进了对面的数据库,,,

0x00寻找突破点

打开学校的官网,找到技术支持,百度域名

打开首页,emm

就一个登录页面,没了

随便写点东西提交看看



天生手欠的我一不小心就多输了一个单引号

回车



WDNMD,除了数字和字母其他都不行?

这叫我怎么日你?

就在这时,首页的一个二维码吸引了我

正是该公司开发的安卓端的软件,我眼前一亮,仿佛找到了打开新世界的大门

开开心心地把软件下载过来,正想反编译找找看有什么可利用的接口



360加固?

fa?!



本以为上帝关上了我的门,还会留个窗给我,结果还是无情地把窗砰地一声给我锁上了

0x01 ZjDroid脱壳

经过一番搜索,找到了一款脱壳工具

我们已经知道不论是利用什么方法加固apk

若要让软件要正常运行,就必须让程序最终加载原dex文件,这样的话,如果我能dump出内存中已经加载的dex

就可以无视在加载dex前的一大堆解壳操作

ZjDroid就可以做到这一点,ZjDroid是一款基于Xposed开发的插件,它可以轻松地hook住所有的activity,并且将软件当前加载的dex写出

在github上fork其源码,进行分析

有进行过Xposed插件开发的大佬们都知道,想让Xposed加载你编写的插件的核心代码

就必须在assest/xposed_init文件内写入你想要加载的核心代码的所在包



进入ReverseXposedModule类



图中两处红线标记处为Dump出dex文件的关键代码

其中第二处红线标记处的对象为DexFileInfoCollecter类,直接翻译过来就是Dex文件信息收集,先对此处进行分析

程序在这里调用了这个对象的start方法

跟进DexFileInfoCollecterstart方法



通过观察代码可知,第一处红线标记处程序利用反射找到了系统DexFile类openDexFileNative方法

这个方法和本地系统加载dex文件有关

接着看第二处标记处,程序调用Xposed模块的hookMethod方法hook住了openDexFileNative方法

在hook完成之后,只要系统调用到了openDexFileNative方法,第三处红线处的代码就会执行

第三处红线处的代码用于获取加载的dex的信息,这里不深入分析

也就是说,只要用户打开某个app,系统调用dex文件的方法就会被执行,那么ZjDroid只需要hook住系统调用dex文件的方法,就可以在软件加载原dex后做任何事情了!

hook加载dex方法的代码已经执行完毕

我们回到最开始插件入口的第一处红线处

程序调用了ReverseXposedModule类中的initModuleContext方法

跟进其调用的initModuleContext方法



查看第一处标记,程序同样的找到了Application类的onCreate方法,这是每个继承Activity的活动在启动时默认最先执行的方法

这里ZjDroid同样对系统的Application类的onCreate方法进行了hook,换句话说,只要用户点开任何一个软件,都能被程序hook住

同样的,程序也是利用hookMethod进行的hook操作,hook后的操作在ApplicationOnCreateHook类中,跟进代码



可以看到程序给每个被hook的app注册了一个广播,跟进代码



分析代码可知,当被hook的app接收到含有com.zjdroid.invoke字符的广播时就会进入判断

程序将提取出广播中键为"target"和"cmd"的值

通过图中第二处红线下方的代码可知target就是app的pid号

在获取cmd的值后,cmd的值将被传入CommandHandlerParser类中

跟进代码



观察代码可知cmd的值就是一个json格式的字符串

程序将根据json中的值对应地执行操作

我们需要dump出dex文件,假设我发送的广播进入了ACTION_DUMP_DEXFILE分支

程序将向DumpDexFileCommandHandler类传入指定值,跟进代码



其中红线标记处就是dump dex文件的核心代码了

跟进



查看其中红线处,data成员调用的方法就是dump出内存中dex文件的代码,接着程序将data写出到指定目录

遗憾的是,红线出的代码为native层的代码,而native层的代码作者并没有开源

编译,运行

踩坑注意:这个工具的so文件似乎在5.0以上的安卓系统不起作用,所以我特意刷了一个4.4的安卓再去安装ZjDroid

在手机的Xposed中启用此插件,然后打开需要脱壳的app

adb shell dumpsys activity top查看最顶层活动的PID号

接着发送广播dump出dex



dex被成功dump

0x02寻找接口



查看软件的入口

打开指定类

未加壳的dex成功被加载了!

我现在看到的是原dex的代码,而不是壳dex的代码!



可以看到onCreate方法为native层方法,但是接着往下看

getInfo方法中有一个利用post请求调用的登录接口

请求一下看看什么情况



WTF?返回的实体中告诉我无权调用此接口?!

难怪把onCreate方法放在native层里!一定是在onCreate方法中需要进行什么操作才能正常调用此接口

可native层的代码实在是无能为力

继续在代码中搜索可能存在的接口



其中一处接口让我眼前一亮



我抱着试试看的心态请求了此接口



WTF?!WTF?!居然可以请求!还没有过滤特殊符号?!

丢到sqlmap里



MSSQL数据库!

成功日进对方数据库!

完事,提交,收工!

【逆向&渗透实战】Dump内存中的Dex_我是如何脱壳某公司加固过的Apk并利用其API渗透对方数据库的更多相关文章

  1. 【逆向&编程实战】Metasploit中的安卓载荷凭什么吊打SpyNote成为安卓端最强远控

    文章作者:MG1937 QQ:3496925334 CNBLOG:ALDYS4 未经许可,禁止转载 前言 说起SpyNote大家自然不陌生,这款恶意远控软件被利用在各种攻击场景中 甚至是最近也捕获到了 ...

  2. 使用sa-jdi.jar dump 内存中的class

    前言 在分析一个 jar 包时发现他把关键类采用了运行时使用 classloader 的方式加载了.懒得分析算法了,可以使用 jdk 自带的工具 dump 出需要的class. 正文 从运行的java ...

  3. IDA在内存中dump出android的Dex文件

    转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...

  4. IDA远程调试 在内存中dump Dex文件

    1. 首先使用调试JNI_OnLoad函数的方法,先将apk以调试状态挂起,使用IDA附加上去. 2. 然后在libdvm.so中的dvmDexFileOpenPartial函数上下一个断点 3. 然 ...

  5. Linux中使用gdb dump内存

    在应急响应中,我们往往会有dump出某一块内存下来进行分析的必要.今天要讲的是利用gdb命令dump出sshd进程的内存. 按照 Linux 系统的设计哲学,内核只提供dump内存的机制,用户想要du ...

  6. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

  7. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  8. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

  9. PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式

    目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...

随机推荐

  1. Intel汇编语言程序设计学习-第六章 条件处理-中

    6.3  条件跳转 6.3.1  条件结构 在IA-32指令集中没有高级的逻辑结构,但无论多么复杂的结构,都可以使用比较和跳转指令组合来实现.执行条件语句包括两个步骤:首先,使用CMP,AND,SUB ...

  2. node-OS&Domain&Net&Path

    OS--------------------------------------------- Node.js os 模块提供了一些基本的系统操作函数. var os = require(" ...

  3. 关于终端设备的设备唯一性的那些事之IMEI(转)

    最近和别人聊起来数据上报,一起讨论到imei和MAC地址,然后发现一个问题:知道这两个东西都不唯一,但是不知道为什么---- 回来上各种小网站巴拉巴拉找了一下,终于大概了解了前世今生,这里简单汇总一下 ...

  4. 在 GitHub 学习,成长为自己想要的样子|HelloGitHub 访谈

    万事开头难,我们经过长期的策划和筹备,终于推出了 HelloGitHub 采访系列「开源项目作者的访谈」.这是一个采访个人开源项目作者的栏目,内容侧重于开源项目作者与开源的故事. 我们深知想要做好一个 ...

  5. Day003 +和字符串使用的问题

    先看一段代码 int a=10; int b=20; System.out.println(""+a+b); System.out.println(a+b+"" ...

  6. 视频格式mkv、mp4、avi、flv、mov、wmv、webm特点和区别

    mkv是一种多媒体封装格式,这个封装格式可把多种不同编码的影像及 16 条或以上不同格式的音频和语言不同的字幕封装到一个 Matroska Media 档内. 它也是其中一种开放原始码的多媒体封装格式 ...

  7. 成功的多项目管理都有哪些"制胜之道"?

    实施多项目管理,一个重要原因就是提高项目的效率和管理水平.除了满足时间.成本.业绩和客户需求之外,项目管理办公室(PMO)经理的预期产出还包括有效利用组织资源.下面是影响多项目管理成功的几个关键因素, ...

  8. 解密华为云FusionInsight MRS新特性:一架构三湖

    摘要:华为云安全网关产品总监郭冕在"华为云TechWave云原生2.0专题日"上发表<华为云FusionInsight MRS,一个架构实现三种数据湖>的主题演讲,分享 ...

  9. mysql无列名注入

    0x00 原理   mysql无列名注入是报错注入的一个变种,前提是已知表名,但是不知道列名,或者只知道部分列名,可通过报错注入拼接查询自身表,当自表被拼接时,由于存在重复属性列,会将列信息报错返回, ...

  10. Centos7 安装 htop

    此安装方法是目前位置我了解到的最简介.最快速的安装方法.本人亲验:   系统版本: CentOS Linux release 7.3.1611 (Core)   安装步骤: yum -y instal ...