通过Xposed的hook机制探究加固的app的密码盐值实战

前言


此文章仅适用于兴趣研究,不可作为损坏他人或其他机构等利益之用,本文只是提出一个设想,并不保证具有普适性

开题


对于安全来说,app是毫无安全性可言的。

不管您是用了proGuard来混淆app,还是用了360加固宝,腾讯加固,等加固产品,最终都会被以各种方法破解。

例如使用IDA Pro,来进行dump,很容易就可以进行还原未加固的.dex文件,源代码就会暴露出来

因为app要运行,总会把加固的东西还原进内存,总是会有一些工具可以做到脱壳。

所以与其想办法在前端做加密,不如使用SSL和安全的服务器端

本讲主要介绍如何利用手写xposed模块,hook(钩)出我们想要的密码的盐值

注,此方法对于native method无解

需求

1.需求的出现

我学校有个查成绩的app,抓包发现使用的是RESTful风格的WebService,配合手机端的app


抓包发现登录数据包

原理是

使用用户名和加密的密码登录,返回一个由时间和用户信息共同决定的token,以后的各种请求都由此token来确定请求者身份,可以很容易把此WebService搬到网页上面来,而不用为了安装一个一年只用2次的app而到处求包

于是决定搞清楚p字段(密码)加密的原理

2.分析p字段

p字段的长相

c98f9b47a56d685001b94a9827feef36

他的特点有:32位,最大字母是f

由此可以初步判断,他可能是使用了较为常见的MD5消息摘要算法进行的加密

利用站长工具MD5在线加密,对‘password’这个密码进行了测试,发现

password的md5加密测试

与上文c98f9b47a56d685001b94a9827feef36是不一样的

3.对app进行反编译

由于第2步中的两次测试结果不一致,猜测app内部可能使用了(Salt)

(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

为了探寻加盐方式和加密逻辑,要对app进行反编译

这里使用apktool
apktool的下载地址:https://ibotpeaches.github.io/Apktool/

将app的apk安装包和apktool放在同一文件夹下

cd到该目录 或 按住shift键在该目录空白处右键,选择在此处打开cmd/powershell窗口

执行如下命令
java -jar .\apktool_【版本号】.jar d .\【apk名字】.apk

发现整个程序的入口被一个桩模块(stub)取代,再看到qihoo,就知道是用了360加固

360加固宝加密了!

在assets下发现360加固的内容so二进制文件

这下就很棘手了

4.面临抉择

app被加固,我有两条路可以走

  • 给app脱壳
  • 想其他办法

我也在网上搜了不少IDA pro的文章,看的也都似懂非懂,于是还是放弃了这个方法

正文

最后决定使用Xposed模块hook相应方法
hook的话我们需要知道md5加密的方法的方法名,但是由于代码是加固了的,我们无从得知

逆向思维

方法无非有这两大类,一种是我们不知道名字的,一种是系统的类的方法,名字肯定是固定的

既然密码有加盐,那么定然会用到+来做字符串拼接:pass+salt

而字符串拼接会被编译成StringBuilder的字节码,所以只要hook了StringBuildertoString方法,就会得到pass+salt的返回值

StringBuilder在现代化的IDE里面已经不被推荐使用了,因为编译器会把+连接的字符串编译成StringBuilder的append方法,为了保持代码的美观和可读性,IDE都会建议使用+号而不是sb


1.Xposed框架安装

xposed分两部分,一个是框架(framework),一个是模块(module)

框架可以直接安装,需要root的手机和兼容的系统
xposed官网下载地址 - XDA论坛
去百度上搜也可以,推荐使用酷安市场下载

安装完毕后像这样

详细的框架安装教程这里不提供,网上可以搜到更为详尽的教程

2.进行模块的开发

1)准备Android Studio

2)新建一个项目

不需要添加Activity,建一个空空的项目就好

您可以选择阅读官方开发教程说明:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
也可以继续看我的表演

3)添加如下依赖

我在这里使用kotlin语言来发开


//主要的依赖
provided 'de.robv.android.xposed:api:82'
//注解,可选
provided 'de.robv.android.xposed:api:82:sources'

4)在清单文件Application里面加入

<!-- 是否是xposed模块,xposed根据这个来判断是否是模块 -->
<meta-data
    android:name="xposedmodule"
    android:value="true" />
<!-- 模块描述,显示在xposed模块列表那里第二行 -->
<meta-data
    android:name="xposeddescription"
    android:value="测试Xposed模块" />
<!-- 最低xposed版本号(lib文件名可知) -->
<meta-data
    android:name="xposedminversion"
    android:value="30" />

5)编写一个普通的类

如Main

/**
 * Created by harbo on 2018/1/16.
 * Email: harbourzeng@gmail.com
 */
class Main : IXposedHookLoadPackage {
    override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam?) {
        if (lpparam!!.packageName != "【您要处理的app的包名】")
            return

        XposedHelpers.findAndHookMethod(StringBuilder::class.java,
                "toString",
                object : XC_MethodHook() {
                    override fun beforeHookedMethod(param: MethodHookParam?) {
                        Log.d("xposed抓到了", "before")
                    }

                    override fun afterHookedMethod(param: MethodHookParam?) {
                        Log.d("xposed抓到了", "after")
                        val result = param!!.resultOrThrowable
                        Log.d("xposed抓到了", result.toString())
                    }
                })

    }

}

6)代码解释


使用XposedHelpers类的静态方法findAndHookMethod
此方法有两个重载,一个适用于系统类,一个适用于要hook的app自定义的类。

我们使用3个参数的那个方法:

  • 第一个参数:明确hook对象的类
  • 第二个参数:要hook的方法名
  • 第三个参数:一个hook方法的匿名内部类实例

重写 afterHookedMethod,将paramresult打成日志即可

7)新建xposed_init文件


在项目上右键new -> Folder -> Assets Folder
新建文件xposed_init,打开它,在里面写上要执行的xposed动作类cn.tellyouwhat.mhook.Main即可

8)编译的时候选择不需要activity

选择Nothing,而不是Default Activity

9)激活模块,硬重启手机(虚拟机可以软重启)

在xposed installer中,点击模块选项,勾中您开发的模块,然后重启手机,就能启用该模块

打开您要hook的app,输入用户名和密码进行登录

10)在LogCat中查找

找到

就可能会发现加密字符串的盐值
password后面那几个字母就是盐

还可能出现很多情况,比如加密
md5(md5(pass)+salt)
md5(md5(pass+salt))
md5(pass+salt)
等等情况,需要小心调试,慢慢发现

11)验证

验证成功

此盐值c98f9b47a56d685001b94a9827feef36匹配

结束语


本次测试成功,纯属机缘巧合,如没有解决您遇到的问题,还请见谅。本文只是提供一个思路,靠谱的还得是内存DUMP。也奉劝各位app安全的从业人员,把重心转移到传输层面上,app无绝对的安全可言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268