首页
社区
课程
招聘
[原创][No.2]app登陆密码提取+hook调用加解密函数
2023-2-6 18:47 6947

[原创][No.2]app登陆密码提取+hook调用加解密函数

2023-2-6 18:47
6947

学习逆向第5天


背景:

刚接触Android漏洞挖掘,无意间看SharedPreferences存储用户密码,想着深入了解下,故写下这篇文章,其中还包括调用app自有的加解密函数,加解密。


正文:


定位SharedPreferences,解包apk找到加解密算法,hook加解密利用重载/调用两种方式加解密


1、定位SharedPreferences


SharedPreferences是什么?

Android系统提供了轻量级的数据存储方式——SharedPreferences存储。它屏蔽了对底层文件的操作,通过为程序开发人员提供简单的编程接口,实现以最简单的方式对数据进行永久保存。这种方式主要对少量的数据进行保存,比如对应用程序的配置信息,手机应用的主题,游戏的玩家积分等进行保存。例如,对微信进行通用设置后可以对相关配置信息进行保存。(简单说,就是存储用户密码,cookie、token等,方便用户不用每次打开app都要登陆一次)


1.1、接下来就是找 SharedPreferences

首先定位app包名

打开cmd

输入  adb shell dumpsys activity activities

如下找到包名  com.xxx.vipa


1.2、这里需要用到工具 MT管理器 https://mt2.cn/


安装到手机里,然后找到需要调试的app(美食Aapp

默认路径(/data/data/里面)


点进去,如下,找到 shared_prefs

再次点进去,里面有可能会有很多文件,但是我们要找带  preference ,sp 等关键字的文件,一定是.xml结尾


我们查看这个带有 preference 的文件

如下,发现留存在本地的 账户密码,但是密码是加密了的

这就是寻找app sharedpreferences的方法


2、解包apk找到加解密算法


2.1、这里加密了我们目前需要的是找到加密算法。使用jadx打开apk

因为涉及账户密码,我们先看下登陆数据包是那个url

通过url路径在jadx查询到如下


2.2、点击 188 行的 login 查看被谁调用

只有一个调用,如下,182行


往下看看到有一个 saveUserNamePassword()

我们双击点进去

找到了加密过程,我们点进 encrypt()函数



成功找到加解密函数


接下来需要hook一下,看看是不是真的是用来加解密 sharedpreferences的



3、hook加解密利用重载/调用两种方式加解密


3.1、现附上代码

import time
import frida, sys

date_str = time.strftime('%m-%d %H:%M:%S')


def on_message(message, data):
    if message['type'] == 'send':
        print(f"[{date_str}] {message['payload']}")
    else:
        print(f"[{date_str}] {message}")


def run_all():
    jscode1 = """
    Java.perform(function() {
        var targetClass='com.jnt.xxx.utils.DES';
        var methodName='encrypt';
        var gclass = Java.use(targetClass);
        gclass[methodName].implementation = function() {
            
            var i=this[methodName]("cccc");
            console.log('\treturn '+i);
            return i;
            };
        });
    """

    # attach目标App进程
    target_app = 30999
    process = frida.get_usb_device().attach(target_app)
    # 将JS代码注入进程,并附加监听方法,用来获取返回的日志信息
    script = process.create_script(jscode1)
    script.on('message', on_message)
    # 打印起始日志
    print(f'[{date_str}] Start Frida on {target_app}')
    # 加载注入的JS代码逻辑
    script.load()
    # 使用系统输入语句阻止函数运行完毕自动退出
    sys.stdin.read()


if __name__ == '__main__':
    run_all()


如上,这里使用的是加密函数

我们这里运行下脚本

需要app调用下函数才可以。我们点击如下


点击记住账户,他就会调用DES函数做加解密

输出如下



感谢大家看到这里!有什么问题可以评论,我都会一一答复的。

 


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞5
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  李豆豆0125   +1.00 2023/02/07 原创内容~
最新回复 (7)
雪    币: 263
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
军哥i 2023-2-6 19:31
2
1
这种直接用算法助手,jadx你都不需要打开
雪    币: 229
活跃值: (213252)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
shinratensei 1 2023-2-6 19:33
3
0
军哥i 这种直接用算法助手,jadx你都不需要打开
tql
雪    币: 217
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
李豆豆0125 2023-2-7 08:57
4
0
写得真详细,就是有点麻烦
雪    币: 1708
活跃值: (8633)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
你瞒我瞒 2023-2-7 09:22
5
0
不错的教程,思路可以,关注收藏,点赞
雪    币: 52
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2023-2-7 16:07
6
0
mark 支持一下
雪    币: 2023
活跃值: (681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
胖虎汇邦 2023-2-22 14:52
7
0
......你们遇到的都是这么简单的吗? 为什么我一搞就是梆梆加固、爱加密的壳
雪    币: 350
活跃值: (824)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阿苗090800 2023-2-23 16:22
8
0
胖虎汇邦 ......你们遇到的都是这么简单的吗? 为什么我一搞就是梆梆加固、爱加密的壳
哈哈哥哥你应该是大佬级别,我是刚入行的哈哈
游客
登录 | 注册 方可回帖
返回