Web 逆向
注意:
这篇文章只是一个导论,让你知道大概有哪些东西需要了解,不要深究。
基础
混淆
混淆简单理解就是将可阅读的代码转换成不易阅读的代码。
举个栗子:
// 原函数(下面的栗子都与这个函数相等)
function() {
debugger
}
// 第一个栗子
(function() { return false; })['constructor']('debugger')['call']();
注意:上面的栗子不能算是严格的混淆,只是另类写法,但是对于大部分人来说也算是混淆了。毕竟第一次看能反映过来的人确实不多。
混淆网站,可以亲自去举例看看,一定要去看看因为我后面的举例都太简单了,很容易让大家以为混淆是没用的,只要我有耐心…
webpack, Vite等构建工具
严格意义上来说,这不是混淆。但是它确实有类似混淆的作用。你比如vue3写的项目,你在浏览器查看的时候是不会看到你写的代码的,这是因为Vite工具调用vue3的编译器将你的vue3 code编译成浏览器可以“理解”的js, html, css等。 编译过程会将你的变量简化处理比如:password = '123' -> a = 123简单的变量名替换,这个过程会导致你在看“Vue 编译后的代码的时候难以理解”,相当于起到了混淆的作用。当然还有一系列操作,这里就不展开了,大家有个了解,想完全了解的可以去看看Vue3的源码,以及了解一下编译器相干的知识。
eval混淆类
本质:将字符串转换为可执行代码,会在浏览器触发VM窗口执行,一般很少单独出现因为太容易被识别了,这种一般会和下面一类混淆一起出现,共同作用就很难分辨了
eval()介绍:将符串当作javascript语句来执行。
eval('console.log("Hello Word")') // output: Hello Word, 但是大概率不能正常输出因为现在浏览器的内置安全协议不建议你在控制台直接运行eval
const c = "Y29uc29sZS5sb2coJ0hlbGxvJyk=" // 是通过btoa("console.log('Hello')")获得的
eval(atob(c))
Function举例
// 展示这个例子还有个原因,注意Function的其它写法,没有{}包裹的body体,但是也可以执行
// 例如常见的:function('debugger') 等价于 function() {debugger}
const dynamicLog = new Function('message', 'console.log("VM says: " + message)');
dynamicLog('Hello'); // This creates a VM window
setTimeout 和 setInterva
setTimeout("console.log('Delayed VM execution')", 1000);
创建动态<script> 标签
const script = document.createElement('script');
script.textContent = "console.log('Script Injection VM')";
document.head.appendChild(script);
WebAssembly (WASM) 当你加载.wasm二进制文件的时候,浏览器也会在VM显示代码方便你去调试,因为原来文件是二进制代码。
其它混淆
aa, jj, Jsfuck, OLLVM, soJSON 混淆
常见的编码和加密
常见编码方法
编码是一个可逆的过程,用于将数据转换为特定格式以实现兼容性或传输。它不需要密钥。
Base64
Web 流量中最常见的编码方式。它将二进制数据转换为由 64 个可打印字符(A-Z, a-z, 0-9, +, /)组成的字符串。很容易识别,因为字符串末尾通常使用 = 作为填充符。
Hex(十六进制)
使用 base-16 符号(0-9 和 A-F)表示数据。通常用于显示加密字符串的原始字节或内存地址。
URL 编码(百分号编码)
将 URL 中的“不安全”字符替换为 % 后跟其两位十六进制等效值(例如,空格变为 %20)。
Unicode/UTF-8
将不同语言的字符编码为二进制格式的标准,以便在不同系统上正确显示。
常见加密与哈希方法
加密使用数学算法和“密钥”来隐藏数据的原始含义。本节还包括“哈希(Hashing)”,技术上这是一种单向转换。
哈希(单向)
对称加密(单钥)
在这些方法中,加密和解密使用相同的密钥。
非对称加密(公钥/私钥)
消息认证
总结
这是一个很简单的导读,甚至可以说就是一个九牛一根毛,但是我觉得这些内容很重要,无论是混淆还是加密其实都是逆向围绕的两个大方向,后面的补环境 + 如何定位加密解密位置了等,都是围绕这两个方向展开,如果代码不混淆你能看懂那么一切都是简单的,但是相信我大部分代码你是看不懂的,逻辑你是很难理清的,所以我们需要一些手段去实现,这就是后面的内容了。






