本帖最后由 kratos__bubu 于 2021-8-17 17:18 编辑
frIDA学习记录frida绕过某设备限制
(主要是学习frida hook普通方法参数 和方法返回值以及hook 所有重载方法)
首先是编写代码环境搭建:
这里使用js js要方便很多 用py不知道为啥毛病多
使用vscode 并且装有node.js
npm install @types/frida-gum 安装这个库 这个库是为了你用js代码写 frida脚本会有提示 这是 用py没有的 还有个语言是ts(typescript)
这是我们要hook的地方 点击(领取60元门槛券)
post的参数就是下面这些
[CSS] 纯文本查看 复制代码 vvc_imei=************; ; vvc_point_channel=gamecenter; vvc_n=************; vvc_is_vivo=1; vvc_p=************; ; vvc_app_name=5.3.0.9; vvc_openid=************; ; vvc_an=************; ;
vvc_elapsedtime=************; ; vvc_av=25; vvc_status=1; vvc_app_version=53009;
vvc_s=2%************; ; vvc_q=************; ; vvc_model=************; ; vvc_cs=************; ; vvc_r=************; ;
vvc_u=************; ; vvc_k=************; ; vvc_pn=************; ; vvc_encode=************; ; vvc_has=0; vvc_cc=CN
以上这些是通过抓包获取到的一些参数,主要的有几个参数:
vvc_imei//手机串号
vvc_model //就是用户手机号
vvc_is_vivo=1 //是否为指定设备
vvc_u // 这是ufsid (这是最重要的)
经过我不断修改参数返回值 和参数 最主要的就是这四个 其他的是用户信息和安卓版本以及软件版本什么乱七八糟的
当我们点击29元开通的时候 他会出现账户异常 或者点不了 是因为设备限制
我在jadx gui搜索弹出的几个字符是没有的 所有我们就换个思路 hook post 的几个参数值 让他成为合法的参数
那好 码代码开始
if(Java.available) 这个判断是用来判断 是否进入jvm
//首先我们hook 第一个参数
[JavaScript] 纯文本查看 复制代码 if(Java.available)
{
[color=#333333][backcolor=#f5f5f5][font=Consolas,]
[color=#333333][color=#777777] if(Java.available)
{
Java.perform(function(){
console.log("start hook");
var vvc_is_vivo=Java.use("com.vivo.ic.SystemUtils")
vvc_is_vivo.isVivoPhone.implementation=function()
{
var isvivo= this.isVivoPhone();
console.log("修改之前的值"+isvivo);
isvivo=true;
console.log("修改之后的值"+isvivo)
return isvivo;
}
var vvc_model=Java.use("com.vivo.ic.SystemUtils")
vvc_model.getProductName.implementation=function()
{
var ProductName= this.getProductName();
console.log(typeof(ProductName));
console.log("修改之前的值"+ProductName);
ProductName="vivo x30";
console.log("修改之后的值"+ProductName);
return ProductName;
}
var vvc_imei=Java.use("com.vivo.game.core.utils.Device")
vvc_imei.getAppImei.implementation=function()
{
var getAppImei= this.getAppImei();
console.log("修改之前的值"+getAppImei);
getAppImei="862888038846551";
console.log("修改之后的值"+getAppImei);
return getAppImei;
}
var vvc_u=Java.use("com.vivo.game.core.utils.Device")
vvc_u.getUfsid.implementation=function()
{
var getUfsid= this.getUfsid();
console.log("修改之前的值"+getUfsid);
getUfsid="90014a4841473265050750d2ca635300";
console.log("修改之后的值"+getUfsid);
return getUfsid;
}[/color][/color][/font][/backcolor][/color]
}
为了节约字数:
vvc_u,
vvc_model,
vvc_imei,都是上面的写法而vvc_u需要改成90014a4841473265050750d2ca635300 这玩意我也不知道是啥 我用vivo手机抓的 ufsid
下面是hook重载
[JavaScript] 纯文本查看 复制代码 var hook = Java.use("com.vivo.game.core.network.loader.RequestParams");
//重载次数
var overloadCount = hook["b"].overloads.length;
console.log(overloadCount);//打印重载方法的个数
for (var i = 0; i < overloadCount; i++) {
//hook每一个重载
hook["b"].overloads[i].implementation = function() {
console.warn("\n*** entered " + "b");
Java.perform(function() {
var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());
console.log("\nBacktrace:\n" + bt);//这是打印方法调用堆栈
});
// 打印参数
if (arguments.length) console.log();
for (var j = 0; j < arguments.length; j++) {
console.log("参数:arg[" + j + "]: " + arguments[j]);
}
//打印返回值
var retval = this["b"].apply(this, arguments); // rare crash (Frida bug?)
console.log("\n 返回值:retval: " + retval);
console.warn("\n*** exiting " + "b");
return retval;
}
}
差不多就是这些,很多只是来源于看雪的大佬 这是他 github地址:https://github.com/r0ysue/AndroidSecurityStudy/tree/master/FRIDA/B02 (看完之后受益匪浅)
|