设为首页收藏本站 今天是: 2022-08-08    美好的一天,从现在开始

复仇者黑客组织

 找回密码
 立即注册

QQ登录

只需一步,快速开始

    查看: 122|回复: 3

    某影视站加密js的还原及自动化获取真实视频地址

    [复制链接]

    该用户从未签到

    29

    主题

    29

    帖子

    125

    积分

    网站信息宣传员

    Rank: 7Rank: 7Rank: 7

    积分
    125
    发表于 3 天前 | 显示全部楼层 |阅读模式
    地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==
    一.分析执行流程

    1.干掉debugger反调试

      首先打开f12后 进入上面的地址,会出现如下的情况
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(1)
      这里我采用最简单的方案干掉他,点击这个忽略断点,就不会进入此debug,但是会有另一个问题 ,就是cpu使用率是变高,但是因为我们只分析执行流程,找到关键的js,所以这里就无所谓了
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(2)
    2.分析谁发起了index.m3u8的调用


    • 我这边因为分析过多次,发现每次再请求.m3u8之前,都会有一次webscoket的请求,那么断定websocket一定是非常重要的
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(3)
      其实在这里我们已经拿到了m3u8的视频地址,但是只拿到m3u8的地址不是咱们的目的。
    • 当我们进入这个main.js的这个js文件中发现,他是加密的如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(4)
      其实也可以侧面的反应出,我们的推断是没错的。  如果不是非常重要的东西,他基本不可能加密
    3.不正常的代码


    • 当我们再网页上格式化之后,会发现很多不太正常的代码,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(5)
      我们发现这个图的很多代码的格式他是不正确的
      例如803行的if语句,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(6)
        当我们把光标放到左变括号的时候,他右边的括号高亮的居然也是一个左括号,同时他的最后边没有任何括号。我们知道再程序开发中,括号都是成对出现的,不可能出现这种所谓的左括号 的右边还是左括号的情况,但是他这里得代码缺没有任何得报错,说明这个代码本身是没有任何问题得。那么产生这个问题的原因其实很简单,我们知道再ascii中有一个特殊的字符,这个字符的功能就是会将在他之前的各种字符串进行反转,然后加密就使用了这个字符来扰乱我们的分析。

    二.还原代码

    我们将main.js的代码复制下来,然后开始进行还原,我是复制了两份一份是没有格式化的代码,另一分是格式化过的代码。
    1.环境问题

      需要node环境安装babel
    2.大致分析一下js代码

      我们可以看到整个_0x3a74这个函数一共有1041个之多,说明这个函数就是解密字符串的重要函数
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(7)
    3.抽取解密函数

      我们将这个_0x3a71的函数包括他之前的所有代码全部复制出来保存到名叫decrypt.js的文件中。
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(8)
      然后再decrypt.js文件末尾增加两个导出,以供我们代码调用使用
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(9)
    4.第一次还原

    4.1 还原代码如下
    1. const parser = require("@babel/parser");
    2. const template = require("@babel/template").default;
    3. const traverse = require("@babel/traverse").default;
    4. const t = require("@babel/types");
    5. const generator = require("@babel/generator").default;
    6. const path = require("path");
    7. const fs = require("fs");
    8. const {decrypttStr,decryptStrFunName } = require("E:\\desktop\\2\\decrypt.js");
    9. let filepath = "e:/desktop/main.js";
    10. fs.readFile(filepath,{"encoding":"utf-8"},function(err,data) {
    11.         const ast = parser.parse(data);
    12.         step(ast);
    13.         let {code} = generator(ast);
    14.         fs.writeFile("e:/desktop/main1.js",code,err => {
    15.                 if(err) throw err;
    16.                 console.log("保存成功");
    17.         });
    18. });
    19. function step(ast) {
    20.         traverse(ast,{
    21.                 CallExpression: ObjToStr,
    22.         })
    23. }
    24. function ObjToStr(path) {
    25.    let node = path.node;
    26.    try{
    27.            if(node.callee.name == decryptStrFunName && node.arguments.length == 2)
    28.            {
    29.                    let val = decrypttStr(node.arguments[0].value,node.arguments[1].value);
    30.                    path.replaceWith(t.stringLiteral(val));
    31.            }
    32.    }catch(e) {
    33.            console.log(e);
    34.    }
    35. }
    复制代码
    4.2 开始运行

      当我们运行的时候发现他报了一个错误,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(10)
    • 那么我们开始调试,我们再decrypt.js的71行下断
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(11)
      我们发现这里他会进入一个叫setcookie的函数里
      这里我采用了一个简单的方案,就是我从网页分析这个执行流程,发现他应该走得下面得getcookie,而且我发现他得这个函数是个循环,如下图。那么我们已经知道他应该进入getCookie那么我们就不浪费时间了。
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(12)
      我们可以看到进入getCookie函数的条件是_0x163f4这个函数返回为true,那么我们就直接让他返回true,当我们再次运行的时候发现他已经可以进入getCookie了,此时这个暗桩被我门解决了
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(13)
      当我们再次运行的时候,发现程序又报错了
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(14)
      我们先再我门的还原代码处调用函数处下断,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(15)
      当我们单步跟踪到此处的时候,如下图,发现他会进入一个函数
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(16)
      当我们再进入这个函数的时候,就发现了有意思的东西出现了
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(17)
        他会按照图上标注的顺序再以此向下执行当执行到第4个函数的时候,迟迟没有执行到return
      • 分析代码可知,他做的事情是
          push一个数到数组,取数组的长度赋值给_0x492e66for循环的退出条件是_0x5da125大于_0x492e66_0x5da125又永远不会_0x492e66,就等于做了一个死循环,那永远也不会退出。
        所以这里的代码也是一个暗装,没有任何用处。
      我们直接将调用代码注释
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(18)
    4.3 真正的开始运行


    • 我们可以看到运行前后的代码比对
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(19)
      可以看出来左边的还原之后的效果还是不错的,已经比右边的清晰了不少了,那么我们接下来就要还原 'Tuhel': _0x7818f1["pSzXT"], 'YUAtI': _0x7818f1["cVvhi"]  这种代码了
    5. 第二次还原

    5.1 我们对MemberExpression类型进行遍历

    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(20)
    可以看到我们需要操作的这个地方正好就是MemberExpression的type
    5.2 代码

      一些重复的代码,我就不复制上来了,可以参照前面的,比如引入包啥的
    1. let filepath = "e:/desktop/2/main1.js";
    2. fs.readFile(filepath,{"encoding":"utf-8"},function(err,data) {
    3.         const ast = parser.parse(data);
    4.         step(ast);
    5.         let {code} = generator(ast);
    6.         fs.writeFile("e:/desktop/2/main2.js",code,err => {
    7.                 if(err) throw err;
    8.                 console.log("保存成功");
    9.         });
    10. });
    11. function step(ast) {
    12.         traverse(ast,{
    13.                  MemberExpression:HandleMemberExpression,
    14.         })
    15. }
    16.         function HandleMemberExpression(path) {
    17.                         if(path.get("object").isIdentifier() && t.isLiteral(path.node.property))
    18.         {
    19.                 let objname = path.node.object.name;
    20.                 let propertyValue = path.node.property.value;
    21.                 let bindPath = path.scope.getBinding(objname);
    22.                 if(bindPath === undefined) return;
    23.                 try{
    24.                         if(!t.isObjectExpression( bindPath.path.node.init))
    25.                         return;
    26.                 }
    27.                 catch(e)
    28.                 {
    29.                         console.log(e.message);
    30.                         return ;
    31.                 }
    32.                 let propertys = bindPath.path.node.init.properties;
    33.                 if(propertys.length === 0)
    34.                         return;
    35.                 try{
    36.                         for (let i = 0;i<propertys.length;i++)
    37.                         {
    38.                                 console.log(propertys[i].key.value);
    39.                                 if(propertys[i].key.value === propertyValue)
    40.                                 {
    41.                                         if(!t.isStringLiteral( propertys[i].value))
    42.                                                 return;
    43.                                         path.replaceWith(propertys[i].value);
    44.                                         break;
    45.                                 }
    46.                         }
    47.                 }catch (e){
    48.                         console.log(e.message);
    49.                         console.log(e.stack);
    50.                 }
    51.         }
    52. }
    复制代码
    5.3 第二次还原后的结果

    我们可以看到右边的结果比左边又更清晰了不少,而且很多函数调用的参数上已经是明文字符串了
    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(21)
    6. 第三次还原

      此次还原的主要是是针对 ”_0x7818f1["RniiM"](_0x509efb, _0x3a807c)“ 这类函数进行还原
    6.1 对CallExpression进行遍历

    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(22)
    6.2 代码
    1. let filepath = "e:/desktop/2/main1.js";
    2. fs.readFile(filepath,{"encoding":"utf-8"},function(err,data) {
    3.         const ast = parser.parse(data);
    4.         step(ast);
    5.         let {code} = generator(ast);
    6.         fs.writeFile("e:/desktop/2/main2.js",code,err => {
    7.                 if(err) throw err;
    8.                 console.log("保存成功");
    9.         });
    10. });
    11. function step(ast) {
    12.         traverse(ast,{
    13.                  CallExpression: HandleCallExpression,
    14.         })
    15. }
    16. function  HandleCallExpression(path) {
    17.     if(path.get("callee").isMemberExpression())
    18.     {
    19.         let objname = path.node.callee.object.name;
    20.         if(!t.isStringLiteral(path.node.callee.property))
    21.             return;
    22.         let propertyValue = path.node.callee.property.value;
    23.         let bindPath = path.scope.getBinding(objname);
    24.         if(bindPath === undefined) return;
    25.         if(!(t.isVariableDeclarator(bindPath.path.node) && t.isObjectExpression(bindPath.path.node.init)))
    26.             return;
    27.         let propertys = bindPath.path.node.init.properties;
    28.         if(propertys.length === 0)
    29.             return;
    30.         let args = path.node.arguments;
    31.         try {
    32.             for (let i = 0; i < propertys.length; i++){
    33.                 if(propertys[i].key.value === propertyValue)
    34.                 {
    35.                     if(!t.isFunctionExpression(propertys[i].value))
    36.                         return;
    37.                     console.log(propertys[i].key.value);
    38.                     let retStmt = propertys[i].value.body.body[0];
    39.                     if(t.isCallExpression(retStmt.argument) && t.isIdentifier(retStmt.argument.callee) )
    40.                     {
    41.                          path.replaceWith(t.CallExpression(args[0],args.slice(1)));                        
    42.                          break;
    43.                     }else if (t.isBinaryExpression(retStmt.argument) && args.length === 2)
    44.                     {
    45.                         path.replaceWith(t.BinaryExpression(retStmt.argument.operator,args[0],args[1]));
    46.                         break;
    47.                     }
    48.                 }
    49.             }
    50.         }catch (e)
    51.         {
    52.             console.log(e.message);
    53.             console.log(e.stack);
    54.         }
    55.     }
    56. }
    复制代码
    6.3运行后的先后对比图

      此时我们可以看到 右边的还原后的代码已经非常清晰了,而且_0x59045e变量也已经变灰,说明没有任何引用关系了,这个时候你可以选择手动删除它,或者使用ast分析引用自动删除
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(23)
    6.4 总结

      至此我们的代码还原就结束了,目前代码执行流程非常清晰,下面我们就是分析函数的执行逻辑了
    三.分析代码

    1. 分析websocket的数据

      可以发现不管是发出去的数据,还是接收的数据 都是看不懂的
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(24)
    2. 分析websocket相关函数

      我们从下图可知,websocket响应数据的时候需要设定一个回调函数onmessage
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(25)
    • 我们在还原完成的代码中搜索一下,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(26)
      我们可以看到,这里面有些重要的东西,比如decryptPackData,说明websocket接收到的数据,需要到这里解密
    • 搜索decryptPackData,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(27)
      我们发现,不仅解密函数在这里,加密函数也在这里
    3.解密接收数据

      我们在上面的解密中可以看到,没有啥特殊的操作,直接就是拿到数据扔进来解密我们需要注意的一点是decryptPackData中有一个hex.parse 这个是将字符串数据转成hex数组  例如”05B1“ ==> [0x05,0xb1]
    3.1 python解密代码
    1. from Crypto.Cipher import AES
    2. KEY= b"55ca5c48a943afdc"
    3. IV = b"d11424dcecfe16c0"
    4. def AesDecrypt(data,key,iv):
    5.     cipher = AES.new(key,AES.MODE_CBC,iv)
    6.     text_decrypted = cipher.decrypt(data)
    7.     unpad = lambda s: s[0:-s[-1]]
    8.     text_decrypted = unpad(text_decrypted)
    9.     return text_decrypted.decode("utf-8")
    10. def main():
    11.     data = "05B1BEB5AF7E36DA88C6F05F66DE36B538D89E87EF822C966F1EBDDE39A4821C3EB3252E8CBFB7CC0959277CDEAF66E1967EFA09CC0C3CDDDBFC10ACBE5A0916E69C889648B4B0E948A294686803F72AB0082C24C0C70A43FA41DCDEF7C9B8E5593A450203F7A9824D04AEAFF85BF0888D28EA33BE8138B6BDF58FE1D0FBA21851C1880AA5A735D9E3E4947088C3BCFEA59AD9FB577E34080A6088BB749FE217637F07C86044B1B52565AA4E21C9DFF88B3294513DCF6B829EDC699555105BD3C6102B462A999638BA77280A0765C6A2"
    12.     hexdata = bytes.fromhex(data)
    13.     result = AesDecrypt(hexdata,KEY,IV)
    14.     print(result)
    15. if __name__ == '__main__':
    16.     main()
    复制代码
    解密后的数据如下图
    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(28)
    可以看到此时我们已经拿到了m3u8的地址
    4 解密发送的数据

      我们在上面的加密上可以看到,他最终是给加密的数据转成字符串同时变成大写
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(29)
    • 从这里可以看到 他将字符串又转成了二进制的数组,正好跟我们前面看到的那个二进制数据一致
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(30)
      其实这里的解密操作就跟前面的接收数据的解密操作完全一致
    4.1 python解密代码
    1. from Crypto.Cipher import AES
    2. KEY=b"55ca5c48a943afdc"
    3. IV = b"d11424dcecfe16c0"
    4. def AesDecrypt(data,key,iv):
    5.     cipher = AES.new(key,AES.MODE_CBC,iv)
    6.     text_decrypted = cipher.decrypt(data)
    7.     unpad = lambda s: s[0:-s[-1]]
    8.     text_decrypted = unpad(text_decrypted)
    9.     return text_decrypted.decode("utf-8")
    10. def main():
    11.     data = "B41585343636DAF917D1FE95FDB299994966407EED69F70C9D63E68CE41CEEFBF158890F7FC3ABB31E71606B02C429599EB6552EA662086F99627682BA5B079297C072E4A63427CCAA26B4C3E94A04B2E5693F721F49F15FF12D269BB0D7343F20D8C7AE314B64AC5A9186D3B14A95D9F7675ED41C772A506AB6EF7F379ED21741CBBD55DBF408A940B751EB723CDE6AD795C18503A902FCE32A9D6880A15E196ECBAAE12B96BCB3C04383ED80791BD22CC0FD77744D00DEC1A9FB9B0DB09BCAE416069B399683199D61F9EF72EFF3022CB4320AF8C7BCAF9DC60796257449051F7713E2B1DDF078B35A28D32C5EF913"
    12.     hexdata = bytes.fromhex(data)
    13.     result = AesDecrypt(hexdata,KEY,IV)
    14.     print(result)
    15. if __name__ == '__main__':
    16.     main()
    复制代码
    解密后的数据如下图
    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(31)
    {"type":"getUrl","url":"HGbFux0Gub4gJ9LonhdVbo000orckSwQNMo000oiyo000oNH8PjeqHuSNsrkYvqFwpEd5YDZpUh352CUmhznDWlodcmfeA0mJz0qkbEAkychz2TBRLCGG1gO0O0O","sign":"7a4b804dc54d93acc5992f6f48221f9338cf896b00693a8c00a0e4d720ddb4fe"}
    到此处我们来分析一下参数
    4.2 分析发送websocket发送数据的参数


    • 搜索"getUrl" ,可以看到如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(32)
      此时我们知道type是固定的
    • 查找url的来源,这里采用一种简单的方法, 我们直接在网页f12这里 ctrl+shift+f 搜索HGbFux0Gub4gJ9LonhdVbo000orckSwQNMo000oiyo000oNH8PjeqHuSNsrkYvqFwpEd5YDZpUh352CUmhznDWlodcmfeA0mJz0qkbEAkychz2TBRLCGG1gO0O0O TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(33)
      此时我们搜到到他其实就是在请求地址的主页上就有
    • 查找sign的来源,如下图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(34)
      我们发现他其实就是用url的值进行了sha,你可以看到_0x1ad6f6正好就是url的值 同时也传进了createSign这个函数内
      验证sign
    1. from hashlib import sha256
    2. import hmac
    3. def HmacHash256(data):
    4.     rawdata = data.encode("utf-8")
    5.     key = b"55ca5c4d11424dcecfe16c08a943afdc"
    6.     return hmac.new(key, rawdata, digestmod=sha256).digest().hex()
    7. def main():
    8.     data = "HGbFux0Gub4gJ9LonhdVbo000orckSwQNMo000oiyo000oNH8PjeqHuSNsrkYvqFwpEd5YDZpUh352CUmhznDWlodcmfeA0mJz0qkbEAkychz2TBRLCGG1gO0O0O"
    9.     result = HmacHash256(data)
    10.     print(result)
    11. if __name__ == '__main__':
    12.     main()
    复制代码
    我们发现加密后的数据 正好跟前面解密开的数据完全一致
    TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(35)
    至此发送数据的所有流程已经分析完成
    四. 编写自动获取m3u8地址的代码

      代码打包在附件
      代码测试截图
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(36)
      下载测试
      TBC茶馆-复仇者黑客组织地址 : aHR0cHM6Ly93d3cuNWR5NS52aXAvdm9kcGxheS85MTA5Ny02LTEuaHRtbA==一.分析实行流程1.干掉debugger复仇者黑客组织(37)




    上一篇:新手无脑JMP搞定”福昕PDF转Word“会员问题
    下一篇:某音jsvmp下参数分析笔记

    该用户从未签到

    4

    主题

    951

    帖子

    942

    积分

    高级会员

    Rank: 4

    积分
    942
    发表于 3 天前 | 显示全部楼层
    收藏一下,好好研究
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1008

    帖子

    2

    积分

    新手上路

    Rank: 1

    积分
    2
    发表于 3 天前 | 显示全部楼层
    不错,写的很好
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    976

    帖子

    44

    积分

    新手上路

    Rank: 1

    积分
    44
    发表于 3 天前 | 显示全部楼层
    感谢大佬分享知识
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Loading...
    嗨!您好:
    欢迎来到 复仇者黑客组织。
    我的名字叫小光
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请立即注册
    关闭Powered by ©科大讯飞语音云
    快速回复 返回顶部 返回列表