之前学习了一些JS逆向的知识点,但是都比较初级,基本上只能算是补补JS函数。这次以抖音为例,尝试一下补环境和开发者工具调试断点的新方法。
首先随机选择一个用户的主页,可以看到有若干作品,目标就是根据用户获取其所有的作品链接,然后下载。
请求的接口有很多,最终筛查出来目标接口:
搜索关键字video可以看到一些URL地址
然后访问一下,看看是不是真正的下载链接。
的确,就是这么回事。
这里就不再截图了,其实里面没有多少特殊的字段,也就Cookie有点特别。
这部分有三个字段是密文
至于哪个是决定性的还不知道,也可能是都是必须的,也可能只有某一个。
肯定先用简单的方式——搜索关键字,不行的话再考虑别的方式。但是这个网站上可以搜索一下X-Bogus,虽然能搜到,但是打过断点后发现并没有走那里。这里不再演示。其他的两个密文字段也一样。
所以最稳妥的方式就是从启动器里查找定位。
发现这里是一个ajax请求,但是可以看到有很多个请求都是从这里发出去的,所以不太好追踪目标接口。但是我们可以使用新的方式来只追踪这个接口:
在这里添加一条,输入目标URL即可,但是要记得先把之前的所有断点都取消。
可以看到自动停在了这里,显示的就是目标URL。
其实在这里的时候,在控制台上输入this,就可以看到XB值已经生成了,在最后面:
"/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=MS4wLjABAAAAqwlfqpCgGCpMAxMEQm_evPUupsTBamwkG5-s6LWqqOgBTv9tniP-7P6QrjK4-m1N&max_cursor=0&locate_query=false&show_live_replay_strategy=1&need_time_list=1&time_list_query=0&whale_cut_token=&cut_version=1&count=18&publish_video_strategy_type=2&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen
所以可以检查前一步调用。
到了这里可以可以确定就是这行生成的密文,但是会发现_0xc26b5e, _0x1f1790这俩值是一直变化的。简单聊一下这里的语法。
_0x2458f0['y']++) : _0xcc6308[++_0x2e1055] = _0x2458f0['apply'](_0xc26b5e, _0x1f1790);
apply 是 JavaScript 中的函数方法,用于调用函数,并且可以指定函数执行时的上下文(this 值),以及传递一个数组或类数组对象作为函数的参数。
这行代码中,_0x2458f0['apply'] 表示调用 _0x2458f0 对象的 apply 方法。这个方法的作用是调用一个函数,并且可以将一个数组或类数组对象的元素作为参数传递给这个函数。
具体来说:
这一行的目的是将 _0x2458f0 对象中的某个函数(可能是函数数组中的某个元素)以 _0xc26b5e 为上下文调用,同时传递 _0x1f1790 数组作为参数,然后将结果赋值给 _0xcc6308[++_0x2e1055]。
但是还是不好定位,我们有以下两种方式继续追踪,日志断点和条件断点,首先在_0x2458f0['apply'](_0xc26b5e, _0x1f1790)打断点:日志断点:console.log(_0x2458f0['apply'](_0xc26b5e, _0x1f1790))。输出有很多,但是可以过滤一下关键字,比如URL或者XB的前面的几个字母:
可以看到XB值的确出现了,URL也出现了。接下来可以使用条件断点,当输出XB值的时候断住,再去追踪函数,_0x2458f0['apply'](_0xc26b5e, _0x1f1790).length==28。因为XB值的长度是28位,可以根据这个来判断。
刷新,然后就被断住了,检查值
然后跟踪函数,可以看到XB值出现了:
定位结束。
实现方式有两种,第一种就是补函数,第二种就是补环境。
首先看第一种,先复制整个文件,然后直接运行。
ReferenceError: window is not defined
增加window = global
ReferenceError: Request is not defined
定位到代码:
var _0x2aa7e4 = Request && Request instanceof Object , _0x2b58b8 = Headers && Headers instanceof Object;
可以看到是两个布尔类型的值,在控制台运行后发现都是true,修改代码:
var _0x2aa7e4 =true , _0x2b58b8 = true;
ReferenceError: document is not defined
其实这里提示的是document['referrer'],在控制台或者请求头那里复制一个就行
document = { "referer":'https://www.douyin.com/user/MS4wLjABAAAAjemOgh7N4uocHHEMmnTrewBlqxuGnVMPr4kVZv6h12s', }
TypeError: document.addEventListener is not a function
和referer一样,补上即可:
document = { "referer":'https://www.douyin.com/user/MS4wLjABAAAAjemOgh7N4uocHHEMmnTrewBlqxuGnVMPr4kVZv6h12s', 'addEventListener': function addEventListener(){ } }
这时候就会发现不再报错了,那么就可以使用一个全局变量获取XB值了,找到之前加密的函数_0x5a8f25那里。
function _0x5a8f25(_0x48914f, _0xa771aa) { return ('undefined' == typeof window ? global : window)['_$webrt_1668687510']('484e4f4a403f52430017211b45bdadd5a9f8450800000000000007fa1b0002012f1d00921b000b191b000b02402217000a1c1b000b1926402217000c1c1b000b190200004017002646000306000e271f001b000200021d00920500121b001b000b031b000b19041d0092071b000b0401220117000b1c1b000b051e01301700131b00201d00741b000b06260a0000101c1b000b07260a0000101c1b001b000b081e01311d00931b001b000b091e00091d00941b0048021d00951b001b000b1d1d009d1b0048401d009e1b001b000b031b000b18041d00d51b001b000b0a221e0132241b000b031b000b0a221e0132241b000b200a000110040a0001101d00d71b001b000b0a221e0132241b000b031b000b0a221e0132241b000b1a0a000110040a0001101d00d91b000b0b1e00161e01330117002d1b000b0b1e001602000025001d11221e006e24131e00530201340200701a020200000a000210001d01331b001b000b0c1e00101d00da1b000b232217000e1c211b000b23430201353e1700151b001b000b23221e0133240a0000101d00da1b001b000b0d261b000b1c1b000b1b0a0002101d00db1b001b000b0e261b000b241b000b230a0002101d00dd1b001b000b0f261b000b250200200a0002101d00e11b001b000b0a221e0132241b000b031b000b26040a0001101d00e21b001b000b101a00221e00dc240a0000104903e82b1d00e31b001b000b11260a0000101d00e41b001b000b1f1d00e71b001b000b1c4901002b1d00e81b001b000b1c4901002c1d00ea1b001b000b1b1d00ee1b001b000b21480e191d00f31b001b000b21480f191d00f91b001b000b22480e191d00fa1b001b000b22480f191d00fc1b001b000b27480e191d00ff1b001b000b27480f191d01011b001b000b284818344900ff2f1d01021b001b000b284810344900ff2f1d01041b001b000b284808344900ff2f1d01361b001b000b2848003