App渗透加解密逆向
2022-10-21 22:47:12 Author: only security(查看原文) 阅读量:23 收藏

最近又在学习app有关的知识,学习了xposed、frida还有objection,简单记录下。

0x01 背景

之前写过一篇笔记,关于app渗透的,当时的知识面实在太狭隘了,也了解的很少,导致花了蛮多的时间去弄。最近又在着重看了安卓的知识,这里有两个比较快捷的方法(xposed与Inspeckage组合以及frida与http Decrypt组合),简单介绍下

0x02 方法一  使用xposed与Inspeckage

去年的时候就想装xposed这个框架了,mumu模拟器装不上,真机的安卓版本太高,导致这个想法一直搁浅了,最近装了genymotion模拟器,装xposed也挺顺利的

打开inspeckage,找到需要逆向的应用,点击LAUNCH APP

这时候记得转发一下端口,否则访问不到web页面

adb forward tcp:8008 tcp:8008

记得打开这个

然后在crypto模块就可以看到key和iv

直接拖出来,再把抓到的密文放到工具里解密:

得到明文,整个过程下来半小时不到

0x03 方法二 使用frida与http Decrypt

这个应该是2019年的工具了,可惜今年才发现

直接手机端运行frida以后,电脑运行http decrypt

打开http://127.0.0.1:8088/

Home模块填入需要hook的app包名,点击confirm

Hooks模块填入需要hook的方法关键字,点击confirm

进入app,下面就会显示hook到的结果

往下翻,就可以看到加密的方法

还有解密的方法

后续按照作者对工具的讲解(见https://www.t00ls.net/articles-51070.html),使用该工具的toBurp模块,发现在burp中调用app的方法的时候,会卡住,究其原因,在于http decrypt调用app方法的时候请求会一直无响应,导致burp卡死。(可能也是本地环境的原因)

后面研究发现工具作者是通过frida-rpc来调用的,在toBurp模块将方法Generate export instance script即可在Custom模块看到相应的代码(作者还贴心地将context获取注释了)

既然本地工具会卡死,那么我们就自己通过frida-rpc进行调用就行了

0x001 frida-rpc调用

使用HTTP Decrypt获取加密函数如下:

com.xxxx.xxx.encrypt.EncryptManager.encrypt

解密函数如下:

com.xxxx.xxx.encrypt.EncryptManager.decrypt

直接调用app类的加解密就行 python脚本如下

# -*- coding: utf-8 -*-  
# @Time    : 2022/10/14 2:57 下午  
# @Author: f0ng  
import frida  
import json  
from flask import Flask, jsonify, request  

  
def on_message(message, data):  
    if message['type'] == 'send':  
        print("[*] {0}".format(message['payload']))  
    else:  
        print(message)  
  
js = open('test.js''r', encoding='utf8').read()  
session = frida.get_usb_device().attach('xxx.xxx.xxxxxx')  
script = session.create_script(js)  
script.on('message', on_message)  
script.load()  
  
app = Flask(__name__)  
  
@app.route('/decrypt', methods=['POST'])  # data解密  
def decrypt_class():  
    data = request.get_data()  
    json_data = json.loads(data.decode("utf-8"))  
    postdata = json_data.get("data")  
    res = script.exports.decrypt(postdata)  
    return res  
  
@app.route('/encrypt', methods=['POST'])  # data解密  
def encrypt_class():  
    data = request.get_data()  
    json_data = json.loads(data.decode("utf-8"))  
    postdata = json_data.get("data")  
    res = script.exports.encrypt(postdata)  
    return res  
  
  
if __name__ == '__main__':  
    app.run()

js文件如下:

'use strict';  
  
var rpc_result = null;  
  
function decrypt (arg0){  
    var result = null;  
    Java.perform(function ({  
        console.log("begin");  
  
        try{  
            Java.choose("com.xxxx.xxx.encrypt.EncryptManager",{  
                onMatchfunction (x{  
                console.log("find instance :" + x);  
                console.log("result of fun(string) encrypt:" + arg0);  
                result=x.decrypt(Java.use("java.lang.String").$new(arg0));  
            },  
                onCompletefunction ({  
                console.log("end");  
            }  
            });  
  
        }catch(e){send("xxxx, " + e + "-er00roo000r-")}  
    });  
    return result;  
}  
// Added Function  
function encrypt(arg0){  
    var result = "";  
    Java.perform(function ({  
        console.log("begin");  
  
        try{  
            Java.choose("com.xxxx.xxx.encrypt.EncryptManager",{  
                onMatchfunction (x{  
                console.log("find instance :" + x);  
                console.log("result of fun(string) encrypt:" + arg0);  
                result=x.encrypt(Java.use("java.lang.String").$new(arg0));  
            },  
                onCompletefunction ({  
                console.log("end");  
            }  
            });  
  
        }catch(e){send("xxxx, " + e + "-er00roo000r-")}  
    });  
    return result;  
}  
  
rpc.exports = {  
    decrypt: decrypt,  
    encrypt: encrypt,  
};

直接调用加密:

直接调用解密:

后续发现objection也可以进行主动调用实例的方法,这里也提一下

0x002 objection调用

首先使用objection去加载app

objection -g com.xxx.xxxxx explore

查找类

android hooking search classes com.sz

使用关键字匹配

android hooking list class_methods com.szxx.lib.encrypt.c

查看调用的方法

android hooking watch class_method com.szxx.lib.encrypt.c.a --dump-args --dump-backtrace --dump-return

操作app,得到运行的结果

解密函数如下

com.szxx.lib.encrypt.c.a

加密函数如下

com.szxx.lib.encrypt.c.d

获得类实例

android heap search instances com.szxx.lib.encrypt.c

进入实例,主动调用

# 进入该实例
android heap evaluate 13780587

# 实例用clazz表示,所以调用加密的代码如下:
clazz.d("{\"app_type\":\"local\",\"mod\":\"system\",\"code\":\"getNoticeAll\",\"app_status\":\"xxxxxxxxxxxxxxxxxxxxxx:1\",\"build_id\":\"a1000\",\"oauth_type\":\"android\",\"oauth_id\":\"f618ff3a11beb6520b268addfa9388b4\",\"version\":\"5.3.1\",\"apiV2\":\"v2\",\"token\":\"\"}""OTkZOVoPAAkIWAgICl1bDFgOXAkBSFwOAF8KDgBDX0oPDVhfAiQVNCE2AAkLKw==")

也可以得到最终结果,后续查阅资料发现objection也可以进行rpc调用,下篇文章会提到

0x04 总结

  1. 不同的工具有不一样的效果,尝试不同的工具可能会事半功倍
  2. 明白工具的原理,在使用工具失败的时候不妨去看看工具的源码,工具怎么修改才可以达到自己的目的
  3. 工具运行不起来,大部分是版本问题,常见的有安卓版本与工具版本对应关系(工具无法正常使用),细化一点的有objection版本和frida版本对应关系(objection无法启动app)
  4. 分清类和方法的区别,一般是先查找类,再查找方法,由于混淆后的a、b、c有一定迷惑性,不要被欺骗了

0x05 参考

https://github.com/rovo89/Xposed   [Xposed框架]

https://github.com/ac-pm/Inspeckage [Inspeckage工具]

https://github.com/frida/frida  [frida框架]

https://github.com/lyxhh/lxhToolHTTPDecrypt  [httpdecrypt工具]

https://mp.weixin.qq.com/s/W2sVlbjKvWbFaZU7EfZqPw [httpdecrypt使用实例]

https://www.t00ls.net/articles-51070.html [httpdecrypt使用方法]


文章来源: http://mp.weixin.qq.com/s?__biz=MzkzNzE4MTk4Nw==&mid=2247485260&idx=1&sn=6e5ca44726e7828bad86deed63ad9127&chksm=c2921100f5e59816a4411e2a6c62042f56d3eaf56bc0725d1f9708999bff1412cd5b7c76e552#rd
如有侵权请联系:admin#unsafe.sh