frida复现某app算法

VSole2023-01-11 10:44:51

获取数据

某app的登录界面抓包,发现参数都加密了

查验一下壳,未加壳,可以进行反编译

使用jadx进行反编译,尝试搜索一下参数名”Encrypt”,发现两个JsonRequest类的方法存在

运用frida及其下面的代码在java层进行hook,发现只调用了addRequestMap方法

Java.perform(function (){
    console.log("hook demo")
    var jsonRequest = Java.use("com.online.http.JsonRequest");
    jsonRequest.addRequestMap .overload('java.util.Map', 'int').implementation = function (addMap,a){
        console.log("jsonRequest.addRequestMap is called");
        this.addRequestMap(addMap,a);
    }
    jsonRequest.paraMap.implementation = function (addMap){
        console.log("jsonRequest.paraMap is called");
        this.paraMap(addMap);
    }
});

跟进addRequestMap方法,了解其使用des加密,hook该方法可获取明文及加密结果

hook代码

Java.perform(function () {
    var requestUtil = Java.use("com.online.http.RequestUtil");
    requestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (code,desKey,desIV){
        console.log("requestUtil.encodeDesMap is called")
        console.log("code:",code,"desKey:",desKey,"desIv:",desIV)
        var encodeDesMap = this.encodeDesMap(code,desKey,desIV);
        console.log("cncodeDesMap:",encodeDesMap);
        return encodeDesMap;
    }
});

保存一下获得的数据

code: {"equtype":"ANDROID","loginImei":"Android353627076818049","sign":"659E9DABB1D2F8B5DB14B40E99E87FAB","timeStamp":"1671622897913","userPwd":"123456","username":"13000000000"} desKey: 65102933 desIv: 32028092
cncodeDesMap: NIszaqFPos1vd0pFqKlB42Np5itPxaNH//FDsRnlBfgL4lcVxjXii8evWfX6JfTMfsYOA4+U92V8
mjn/SBdwCqLUJu44fM3zNeGVKZD6MFQWLguggVL6k55XB7aoJ+ZRBAgKzq5Q69AeVzzkrW7ljbx9
O24XBjMdNIKIWHkE5JL5MnS1ph86fs18lEqa3ilNtvTZFOVz8DX72SSPgVVHRnOavHemZ5807s9P
wmTqWlw=

明文中存在desKey和desIv,跟进代码,可以看到这两值是固定的

数据中还有sign值不知道怎么来的

code数据都为paraMap方法中得来

跟进该方法,md5加密前对数据进行了处理,hook该Utils.md5的方法的传参即可了解加密得到sign值的明文

hook代码

Java.perform(function () {
    var requestUtil = Java.use("com.online.http.RequestUtil");
    requestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (code,desKey,desIV){
        console.log("requestUtil.encodeDesMap is called")
        console.log("code:",code,"desKey:",desKey,"desIv:",desIV)
        var encodeDesMap = this.encodeDesMap(code,desKey,desIV);
        console.log("cncodeDesMap:",encodeDesMap);
        return encodeDesMap;
    }
});

保存一下获得的数据

string: equtype=ANDROID&loginImei=Android353627076818049&timeStamp=1671624199001&userPwd=123456&username=13000000000&key=sdlkjsdljf0j2fsjk
sign: d13d25dc2dc064491b748d5c97430398

有一个key值

跟进发现为固定值

以上就获取了所有需要的信息,可以尝试进行加密算法复现了

sign明文:
string:equtype=ANDROID&loginImei=Android353627076818049&timeStamp=1671624199001&userPwd=123456&username=13000000000&key=sdlkjsdljf0j2fsjk
sign: d13d25dc2dc064491b748d5c97430398
加密算法:md5
des明文:
code: {"equtype":"ANDROID","loginImei":"Android353627076818049","sign":"659E9DABB1D2F8B5DB14B40E99E87FAB","timeStamp":"1671622897913","userPwd":"123456","username":"13000000000"} desKey: 65102933 desIv: 32028092
加密算法:des

还需要了解des算法的工作模式和填充方式

跟进encodeDesMap方法

跟进DesSecurity类的实例化,了解到工作模式为CBC,填充方式为PKCS5Padding

至此,所有需要的信息都收集完毕了

算法复现

借助CryptJS获取sign的值

function getSign(user, pass, time) {
    var plaintext = "equtype=ANDROID&loginImei=Android353627076818049&timeStamp=" + time + "&userPwd=" + pass + "&username=" + user + "&key=sdlkjsdljf0j2fsjk";
    return CryptoJS.MD5(CryptoJS.enc.Utf8.parse(plaintext)).toString();
}
console.log(getSign("13000000000","123456","1671624199001"))

重新加密,由于填充方式为PKCS5Padding,每次填充的值不一样,每次加密整体结果不同,但未填充部分加密结果一样

function encrypt(user, pass, time) {
    var sign = getSign(user,pass,time);
    var plaintext = '{"equtype":"ANDROID","loginImei":"Android353627076818049","sign":"' + sign + '","timeStamp":"' + time + '","userPwd":"' + pass + '","username":"' + user + '"}';
    var key = CryptoJS.enc.Hex.parse(CryptoJS.MD5("65102933").toString());
    var iv = CryptoJS.enc.Utf8.parse("32028092");
    var result = CryptoJS.DES.encrypt(plaintext, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }).toString();
    return result;
}
console.log(encrypt("13000000000","123456","1671622897913"))

sign韩剧
本作品采用《CC 协议》,转载必须注明作者和本文链接
Ida的trace功能,这种方法本身是非常好的一种方法,因为大部分的情况下这种方法更有效也更简单,但目前这种方式已知存在一些问题导致这种方式的使用受限。①慢,ida trace的方式会很慢,所以一般都是在缩小范围后再使用这种trace的方式来操作。
买车报价APP sign分析
2023-01-12 11:14:54
数字企业壳懂得都懂不可能全部脱下来的只能用哪些类就脱哪些了,略微麻烦点。想着通过url的地址去找对应的发请求的位置是不是可以,于是通过搜索url路径找到了一个类。这是具体的加密方法,没啥难度了。
首先使用jadx对apk进行逆向。?搜索关键字 QDSign,可以直接找到对应的类,可以看到参数经过加密得到。??进一步跟踪,发现了c类中有如下三个so方法,还有3个loadlibrary,分别进行了hook,发现c-lib动态注册了sign,sos动态注册了s,没有发现crypto有动态注册。
timestamp: d}并在第1886行,找到了有关n的声明此时发现password被md5加密后,与pwdkey的值,进行字符串拼接后,在进行一次md5加密。直接搜索pwdkey,并在第27589行,找到了该值,发现该值是不变的。
准备◆iOS 12.5.5◆frida 14.0.0◆ipa 5rG96L2m5LmL5a62 11.33.5抓包1.抓包使用 charles,请自行安装并配置证书。使用假账密测试抓包 123456 / 123456,能够抓包成功。分析1、登录页面需要输入3个信息,分别是账号 / 密码 / 验证码,对应字段 logincode / userpwd / validcode。
尝试扫了一下,虽然发送了很多payload,但没有发现任何漏洞。最后通过自己努力和改造,终于挖到了XSS漏洞。XSS是web安全中最为常见的漏洞,XSS全称是Cross Site Script。XSS攻击通常指黑客通过“HTML注入”篡改了网页,插入了恶意脚本,
为了抵御网络黑客的攻击,许多人选择了通过 1Password 等密码管理器来规划针对不同线上服务的复杂密码组合,以避免在数据泄露事件发生时被“一锅端”。不过从本周开始,1Password 又拓展了一项服务 —— 允许用户隐藏真实的电子邮件地址。
逆向某平台分析过程指导
远程办公时代的生产力工具
关键词漏洞安全研究人员发现,用于数百线上服务的知名开发框架Expo出现可劫持账号的重大漏洞。Expo框架主要
VSole
网络安全专家