安卓逆向--豆瓣签名sign

声明

本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!!

抓包分析

今天我们要分析的app是某x瓣,版本号7.26.0。

准备工具:抓包工具fiddler,一台真机或者模拟器,jadx反编译工具。

第一步进行抓包分析。通过抓包发现_sig是加密的,而这个_sig应该经过base64编码。

其他参数udid应该是用户id为固定值,apikey,device_id和apple应该是当前设备参数信息可以直接固定。

反编译apk

找到加密参数_sig,接下来就是反编译apk。我们使用jadx对apk进行反编译。直接通过搜索"_sig"关键字,定位到加密代码处,如下图。

找到包含_sig的代码不是很多,我们可以一个一个的看,这里根据选择题定律选择最长的(学渣专用方法),点进去可以看到"_sig"参数是a4.first的方法返回的,具体是干嘛的不知道,不过不要紧,继续跟进发现a4是Pair<String, String>a4 = TopicApi.a(request);这个方法声明实例化的一个对象。

然后点进去看看TopicApi.a这个方法具体是怎么实现的。

可以看到TopicApi.a这个方法调用了d方法,我们继续跟进到d方法里,可以看到这个d方法就是加密的地方。

我们使用动静态结合分析。首先静态分析一下java代码,一会在用frida动态分析验证我们的猜想。

分析加密逻辑

首先看到d方法传入了三个参数str,str2和str3,然后定义了一个变量decode,具体是干嘛的还不知道,然后定义了一个str5,往后看可以知道这是一个AES加密的密钥key。接下来是对g进行一系列的添加。

  1. 把str2添加进g。

  1. 定义一个encodedPath,后面通过frida动态分析知道这个是请求url的path,同时还把url的path给url编码了。然后把AMPERSAND,跟进发现是一个"&"符号,最后把&符号添加进g。

  1. 把编码后的path添加进g。

  1. 把&符号添加进g。

  1. 把10位的时间戳currentTimeMillis添加进g。

最后把g.toString后赋值给sb。最后调用HMAC_SHA1对str5和sb进行加密,最最后对加密后的结果进行base64编码。

静态分析的差不多了,接下来用我们的frida动态调试一下,看看实际的效果是什么样子的。

frida动态分析

编写frida-hook脚本。


function main(){
    Java.perform(function(){
        
        Java.use("com.douban.frodo.fangorns.topic.TopicApi").d.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(arg1, arg2, arg3){
            console.log("arg1===>", arg1);
            console.log("arg2===>", arg2);
            console.log("arg3===>", arg3);
            var result = this.d(arg1, arg2, arg3);
            console.log("result===>", result);
            return result;
        }
        
        var hmacsha1 = Java.use("com.douban.live.internal.LiveHelper");
        hmacsha1.hmacSHA1.implementation = function(cs1, cs2){
            console.log("str1:", +cs1);
            console.log("str2:", +cs2);
            var result = this.hmacSHA1(cs1, cs2);
            console.log("result:", +result);
            return result;
        }
    })
}
setImmediate(main)


/*
function main(){
    // 目的:hook 类名:xxxxxxxx 下的 kkkk 方法
    Java.perform(function(){
        var utils = Java.use("待填写的类名");
        utils.待填写的方法名.implementation = function(key){
            待编写的逻辑
        }
    })

}
setImmediate(hook_java)
*/

开始hook。在cmd窗口输入frida -UF -l hook.js,就能开始hook。如图就是打印出hook的内容。

可以看的出来str1就是上面所说的str5密钥key,而str2就是进行了一系列添加操作的sb。总结一下就是GET+请求url的path+时间戳和str5作为hmac-sha1加密的参数,再然后经过base64编码,就得到最终的加密参数_sig。到这一步frida动态分析基本结束。接下来就是利用python实现加密和获取数据。

最近某x瓣sig加密改变了,加了盐,但流程没有发生变化,重新跟的过程中忘记截图了,就懒得在跟了我直接给出加密代码了。


def encrypt(url, ts):
    path = (urlparse(url).path).replace('/', '%2F')
    req_url = f"GET&{path}&dd1f5ec25efa2c5b975e1c471cee8511&{ts}"
    key = "bf7dddc7c9cfe6f7"
    hmac_code = hmac.new(key.encode(), req_url.encode(), sha1).digest()
    return base64.b64encode(hmac_code).decode()

总结:frida-hook函数方法,确定类名,确定方法名,然后传参个数,然后按如下格式填写即可hook;setImmediate用于执行给定的function,当从控制台进行hook时会调用相关的function

各位大佬觉得本文写的不错的话,可以一键四连哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值