亚洲四大邪术 中华PS App sig签名分析

简介: 亚洲四大邪术 中华PS App sig签名分析

一、目标


李老板: 奋飞呀,你堕落了,也开始玩标题党了?


奋飞: 你懂个锤子,我给你科普下亚洲四大邪术:泰国变性术、韩国整容术、日本化妆术、中华PS术。


锤子: 这个我需要懂吗?

86.png这个就是我们今天的目标。


87.png

哦,错了,这三个老兄才是我们的目标。


二、步骤

Jadx搜索 "sig"


先大概分析一下, sig 一眼看上去像是md5的结果,sigTime 必须是时间戳了,sigVersion 就是对应的签名算法版本号了。


老规矩,先搜搜 "sig"


不对劲,才两个结果。


那就再试试 "sig

88.png


这次还不错, 应该就是这个 sigVersion


点吧点吧,找到了这个类 com.meixx.secret.SigEntity,大概率是 SigEntity.generatorSigWithFinal这个函数。


祭出Objection


objection -g com.mx.mxxx.mxxx explore
android hooking watch class 'com.meixx.secret.SigEntity'


逮住了  generatorSigWithFinal

(agent) Registering job 015665. Type: watch-class for: com.meixx.secret.SigEntity
com.mt.mxxx.mxxx on (Xiaomi: 7.0) [usb] # (agent) [015665] Called com.meixx.secret.SigEntity.generatorSig(java.lang.String, [Ljava.lang.String;, java.lang.String, java.lang.Object)
(agent) [015665] Called com.meixx.secret.SigEntity.nativeGeneratorSig(java.lang.String, [[B, java.lang.String, java.lang.Object)


打印下入参和出参

android hooking watch class_method 'com.meixx.secret.SigEntity.generatorSig'  --dump-args --dump-return


有点小郁闷,返回值是个Object,看不到咱们要的签名值

(agent) Registering job 818585. Type: watch-method for: com.meixx.secret.SigEntity.generatorSig
com.mt.mxxx.mxxx on (Xiaomi: 7.0) [usb] # (agent) [818585] Called com.meixx.secret.SigEntity.generatorSig(java.lang.String, [Ljava.lang.String;, java.lang.String, java.lang.Object)
(agent) [818585] Arguments com.meixx.secret.SigEntity.generatorSig(channel/pic_timeline.json, 10,413,6790967215779498899,1,135547.1050.21|2|1|2||30000.0|1620478589|1096109|96109$$$6790967215779498899||0||273||80||78||2802||7||1||-1||6790965225653556242||1620478589819||0||1||1||1||1||1||15||9||0||1815992541||0,135547,4,home_tab_formula_hot,xxx,中国,xxx,xxx,1620478621200,,GMT 8,0,2507792916,taobao,MI NOTE Pro,Xiaomi,1440*2560,zh_CN,02:00:00:00:00:00,1089867602,0,512,4.26.33,7.0,0,1,0,wifi,mxxx-9171-Xiaomi-MI NOTE Pro-android-7.0-2cac546a,3710,1,9.1.7.1,0,2.0.0,CN,1,24,0,867302021476314,1,14f8c555ff4500db,1, 6184556633574670337, com.meixx.remote.hotfix.app.RemoteHotfixApplication@94dd584)
(agent) [818585] Return Value: com.meixx.secret.SigEntity@5bbbe0

挂上心爱的Frida


我们先观察一下, generatorSigWithFinal 函数的返回是是一个 SigEntity 类,


89.png


这个类的图示的三个成员变量就是我们要打印的结果。

var SigEntityCls = Java.use('com.meixx.secret.SigEntity');
SigEntityCls.generatorSig.overload('java.lang.String', '[Ljava.lang.String;', 'java.lang.String', 'java.lang.Object').implementation = function(a1,a2,a3,a4){
      var rc = this.generatorSig(a1,a2,a3,a4);
       console.log("a1=" + a1);
       console.log("a2=" + a2);
    var uRc=Java.cast(rc, Java.use("com.meixx.secret.SigEntity"));
    console.log(uRc._sig.value);
    console.log("sigTime=" + uRc._sigTime.value);           
    console.log("sigVersion=" + uRc._sigVersion.value);           
    return rc;
}


蓝瘦,没有打印出来,报错了

TypeError: cannot read property 'value' of undefined
    at <anonymous> (/mtxx.js:60)
    at apply (native)
    at ne (frida/node_modules/frida-java-bridge/lib/class-factory.js:613)                                                          
    at <anonymous> (frida/node_modules/frida-java-bridge/lib/class-factory.js:592)


问了下谷哥


如果有一个成员变量和成员函数的名字相同,则在其前面加一个_,如_xx.value = yy


这几个成员变量没有同名的成员函数,所以不用在前面加一个 _


我去,去掉 _

var uRc = Java.cast(rc,SigEntityCls);
console.log("sig=" + uRc.sig.value);            
console.log("sigTime=" + uRc.sigTime.value);            
console.log("sigVersion=" + uRc.sigVersion.value);


跑一下90.png

太棒了,这就是我们要的结果。


三、总结


除了直接定位sig之外,和他相关的参数也是很有效的指路明灯。比如本例的 sigVersion


坑踩多了,自然就晋级了。老鸟和菜鸟的区别就是:老鸟犯的错误比较多,居然还没挂。


91.png


对于宇宙而言,人的生命并不比一只蚂蚁重要       ----海淀野生仁波切


TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。


关注微信公众号: 奋飞安全,最新技术干货实时推送



相关文章
|
4月前
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 异常分析
|
1月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
3月前
|
安全
【Azure App Service】App service无法使用的情况分析
App Service集成子网后,如果子网网段中的剩余IP地址非常少的情况下,会在App Service实例升级时( 先加入新实例,然后在移除老实例 )。新加入的实例不能被分配到正确的内网IP地址,无法成功的访问内网资源。 解决方法就是为App Service增加子网地址, 最少需要/26 子网网段地址。
|
4月前
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
|
4月前
|
开发框架 缓存 .NET
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
|
4月前
|
C# 开发工具
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
|
4月前
|
网络协议 NoSQL 网络安全
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
|
7月前
|
Linux
百度搜索:蓝易云【Linux系统ps命令:查看正在运行的进程】
通过这些简洁的ps命令用法,你可以方便地查看Linux系统中正在运行的进程信息。
91 1
|
7月前
|
安全 Linux 应用服务中间件
linux(三十一)系统信息命令ps查看系统进程
linux(三十一)系统信息命令ps查看系统进程
238 1
|
7月前
|
存储 监控 Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
136 0