申请会员ID:hygzs【申请通过】
申请ID:hygzs个人邮箱:1341806518@qq.com
原创技术文章:
csdn地址:Android Xposed hook从了解到学废.004_幻叶-叶子的博客-CSDN博客
Android Xposed hook从了解到学废.004
通过xposed hook逆向直播app的sign加密
1.准备工具
下述括号内是我所有的版本或软件
1.Android Studio (3.5)
2.模拟器或者Android手机 (雷电)
3.Fiddler (4) 下载
4.jeb (2.2.7.20160815)下载
4.MT管理器.apk(注意是新版)下载
5.游拍.apk(3.5.1.56) 这里不提供地址
jeb收费,破 j 版安装也过于麻烦,所以第4个工具2选一,这里我都演示了
环境搭建请看第一篇:Android Xposed hook从了解到学废.001
2.找寻需要HOOK的类和方法
目标:进入直播间出现的弹幕和说话的sign
数据:
POST http://mapi.4399youpai.com/app/android/v3.5/chat-msg.html HTTP/1.1
MUDID: xiaomigofDrSauMT9BcT8MD5b0e
APIVERSION: 3.5.1.56.481
CHANNEL: xiaomi
MAUTH: a4b37556327aad56c379dd7645be14d5
DEVID: 865166028278623
User-Agent: 4399YouPai/3.5.1.56(android;vivo x9;5.1.1;1080x1920;WIFI;481;xiaomi;xxhdpi)
APKNAME: com.m4399.youpai
MAUTHCODE: 795e2e49
Content-Type: application/x-www-form-urlencoded
Content-Length: 256
Host: mapi.4399youpai.com
Connection: Keep-Alive
Accept-Encoding: gzip
is_new_version=1&sign=99257bef9ad502accda48ce50b0a3d96&msg=%E6%9D%A5%E4%BA%86&apk_version=3.5.1.56.481&nickname=2984236588&apkName=com.m4399.youpai&is_face=0&push_id=17214772&uniqueId=865166028278623&system=1&room_id=1918&channel=public%3Ayptv_172147728e28
https://img-blog.csdnimg.cn/20200223162808502.png?
通过Fiddler 4抓取到发送的数据为:is_new_version=1&sign=99257bef9ad502accda48ce50b0a3d96&msg=%E6%9D%A5%E4%BA%86&apk_version=3.5.1.56.481&nickname=2984236588&apkName=com.m4399.youpai&is_face=0&push_id=17214772&uniqueId=865166028278623&system=1&room_id=1918&channel=public%3Ayptv_172147728e28
查询类和方法的第一种方式 使用jeb
我们打开jeb拖入apk
https://img-blog.csdnimg.cn/20200223163212940.png?
这里我们抓到的提交地址是chat-msg.html,所以我们直接Ctrl+F搜索,不过不知道啥原因我的jeb有点不太配合我,没搜到(MT管理器可以,稍后再说)于是乎我直接搜索了他的提交参数"apk_version
这里有个"表明他是个常量而不是代码或者函数
https://img-blog.csdnimg.cn/20200223164628385.png?
发现周围用橙色突出的常量都是提交的参数名,所以确定了,这个位置就是提交弹幕的函数
使用快捷键Q键转换成java代码查看
https://img-blog.csdnimg.cn/20200223164952218.png?
private void a(String arg4, int arg5, String arg6) {
HashMap v0 = new HashMap();
((Map)v0).put("msg_id", arg6);
((Map)v0).put("nickname", this.r.getNickName());
((Map)v0).put("msg", arg4);
((Map)v0).put("system", arg5 + "");
((Map)v0).put("apkName", ((Fragment)this).getActivity().getPackageName());
((Map)v0).put("apk_version", c.b(((Fragment)this).getActivity()));
((Map)v0).put("channel", this.r.getPushChannel());
((Map)v0).put("push_id", this.q + "");
((Map)v0).put("room_id", this.s);
arg6 = LiveManager.getInstance().getIdentifiesId();
if(TextUtils.isEmpty(((CharSequence)arg6))) {
arg6 = e.c(((Fragment)this).getActivity());
}
((Map)v0).put("uniqueId", arg6);
v6 = new StringBuilder();
v6.append(arg4);
v6.append(this.r.getNickName());
v6.append(arg5);
v6.append("#4399yp*msg#");
((Map)v0).put("sign", i.a(v6.toString()));
if(arg5 == 0) {
((b)this).loadData(LiveManager.getInstance().getApiService().sendChatMsg(((Map)v0)), this.m);
}
}
v6 = new StringBuilder();
v6.append(arg4);
v6.append(this.r.getNickName());
v6.append(arg5);
v6.append("#4399yp*msg#");
((Map)v0).put("sign", i.a(v6.toString()));
创建名为v6的StringBuilder对象
然后加入
arg4
this.r.getNickName()
arg5
#4399yp*msg#
转为string类型传递给i.a()我们看一下
arg4
this.r.getNickName()
arg5
都是什么
https://img-blog.csdnimg.cn/20200223170008658.png?
结合发出去的数据可以看出来
arg4是msg 也就是"来了"
this.r.getNickName()是nickname 也就是2984236588
arg5是system 也就是1双击i.a跳转过去看看https://img-blog.csdnimg.cn/20200223170611486.png?digest和update是md5的特征
我们数一下sign:99257bef9ad502accda48ce50b0a3d96
一共32位这里又写了md5
基本可以确定是md5加密
那么我们hook他拿出他的原文看看https://img-blog.csdnimg.cn/20200223170921910.png?翻到最上面这个时候我们得到了需要hook的方法和类了查询类和方法的第一种方式 使用MT管理器jeb的可以划走,这里说的是mt管理器单击APK选择查看
https://img-blog.csdnimg.cn/20200223171442362.png?发现他有3个Dex
随便点一个
我们选择dex++编辑,然后全选,使用搜索功能https://img-blog.csdnimg.cn/20200223172408422.png?搜索chat-msg.htmlhttps://img-blog.csdnimg.cn/20200223172452248.png?搜索到一个,我们点击进去
https://img-blog.csdnimg.cn/20200223173037440.png?MT管理器使用转java代码需要收费,估计看文章的没几个有会员,哈哈
(PS:哎16年买的永久会员真香哈哈哈哈哈)这里看到方法是sendChatMsg,我们出去搜索看看哪里调用了https://img-blog.csdnimg.cn/20200223173728628.png?
这里一共有3个地方使用过sendChatMsg
我们倒着一个一个看吧
https://img-blog.csdnimg.cn/20200223185036263.png?post过去的值都存在,所以这个可能是我们所要找的
开启会员特权给你们看一眼https://img-blog.csdnimg.cn/20200223185402282.png?应该都看懂了吧,我们回去看看代码 const-string p1, "#4399yp*msg#"
invoke-virtual {p3, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
.line 30
invoke-static {p1}, Lcom/youpai/framework/util/i;->a(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
const-string p3, "sign"这里代码是Smali代码,反正我是看不懂
不过能理解一丢丢,然后代码看过java的也应该能理解一点了invoke-static {p1}, Lcom/youpai/framework/util/i;->a(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1Lcom/youpai/framework/util/i;->a(Ljava/lang/String;)
传入String类型值给Lcom/youpai/framework/util/i;->a处理
那么我们过去看看https://img-blog.csdnimg.cn/20200223185929500.png?https://img-blog.csdnimg.cn/20200223185941740.png?哈!在第二个dex里https://img-blog.csdnimg.cn/20200223190006783.png?我们就已经确定了目标开始hook3.开始编写Hook代码这里目标包名是:com.m4399.youpai
目标类是:com.youpai.framework.util.i
目标方法:a编写代码package com.hygzs.hook;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class hook implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam loadPackageParam) throws Throwable {
if (!loadPackageParam.packageName.equals("com.m4399.youpai"))
return;
XposedBridge.log("已经找到目标软件");
XposedHelpers.findAndHookMethod("com.youpai.framework.util.i", loadPackageParam.classLoader,
//上面看第2篇
"a",
//目标为isCorrectInformation
String.class,
//传递的1个值是string类型,所以这里直接1个String.class
new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
//afterHookedMethod是在调用原方法后执行
XposedBridge.log("原文 = " + (String) param.args);
//打印到xposed日志内
super.afterHookedMethod(param);
//调用
}
}
);
}
}这里代码和之前的没什么区别,就是改了判断的包名,类名还有方法名
我们写好后运行,然后重启模拟器或者模拟器或者vxp框架整体过程可以看前面的文章我就不赘述了现在开启fd然后抓包
抓到了新的数据https://img-blog.csdnimg.cn/20200223191351251.png?sign:99257bef9ad502accda48ce50b0a3d96
看一下日志https://img-blog.csdnimg.cn/20200223191420693.png?日志:来了29842365881#4399ypmsg#
我们通过工具查询md5https://img-blog.csdnimg.cn/20200223191618399.png?一模一样到此Sign算法和原文就得到了来了+nickname+system+#4399ypmsg#这里要说一下此app的通过chat-msg.html发送数据一共有2个地方,一个是弹幕,一个就是这种刚刚进入直播间的提示system是不一样的额外知识点因为我们需要不断的去看日志就很麻烦,所以这里提供xposed使用toast的方法直接贴代码详细可以看这篇文章Android逆向工程:大显神通的Xposed,如何在Xposed中弹出Toast提示package com.hygzs.hook;
import android.content.Context;
import android.view.ContextThemeWrapper;
import android.widget.Toast;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
public class hook implements IXposedHookLoadPackage {
private Context context;
public void handleLoadPackage(LoadPackageParam loadPackageParam) throws Throwable {
XposedHelpers.findAndHookMethod(ContextThemeWrapper.class, "attachBaseContext",Context.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
context=(Context) param.args;
}
});
if (!loadPackageParam.packageName.equals("com.m4399.youpai"))
return;
XposedBridge.log("已经找到目标软件");
XposedHelpers.findAndHookMethod("com.youpai.framework.util.i", loadPackageParam.classLoader,
//上面看第2篇
"a",
//目标为isCorrectInformation
String.class,
//传递的1个值是string类型,所以这里直接1个String.class
new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
//afterHookedMethod是在调用原方法后执行
XposedBridge.log("原文 = " + (String) param.args);
Toast.makeText(context,"加密原文:"+(String) param.args,Toast.LENGTH_SHORT).show();
//打印到xposed日志内
super.afterHookedMethod(param);
//调用
}
}
);
}
}https://img-blog.csdnimg.cn/2020022319313061.png?
请在本文博客发一个文章信息确认本贴是你自己申请的,然后回复地址给我审核。 Hmily 发表于 2021-12-6 10:29
请在本文博客发一个文章信息确认本贴是你自己申请的,然后回复地址给我审核。
地址
emm,是这样?,不太理解如何操作
https://blog.csdn.net/qq_15781179/article/details/121745353
点我 I D:hygzs
邮箱:1341806518@qq.com
申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。 感谢Hmily大佬审核通过,本人前来报到! Hmily 发表于 2021-12-6 17:09
I D:hygzs
邮箱:
感谢Hmily大佬审核通过,本人前来报到!
页:
[1]