tiktok反编译思路
dreamland理解VMP的基本原理
VMP将原始JavaScript代码转换为自定义字节码,然后通过虚拟机解释执行。反编译的第一步是理解这个过程:
代码被转换为字节码指令
字节码通常会被加密或混淆
虚拟机解释器执行这些指令
提取加密的字节码
1 2 3 4 5
| function() { return "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" }
|
解密字节码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // 1. Base64解码 const decoded = atob(Ab78());
// 2. 提取XOR密钥 var XORkey = 0; for (var i = 4; i < 8; ++i) XORkey += decoded.charCodeAt(i);
// 3. 使用XOR密钥解密 var decrypted = Uint8Array.from(decoded.slice(8), (char, i) => { return (char.charCodeAt(0) ^ (XORkey + XORkey % 10 * i) % 256) >>> 0; });
// 4. 解压缩 const decompressed = zlib.inflateRawSync(Buffer.from(decrypted));
|
解析指令集和字符串表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| function parseByteCode(data) { let index = 0; const strings = []; const stringCount = readLEB128(data, index); for (let i = 0; i < stringCount; i++) { strings.push(readString(data, index)); } const instructionSets = []; const instructionSetCount = readLEB128(data, index); for (let i = 0; i < instructionSetCount; i++) { const argsLength = readLEB128(data, index); const isStrictMode = Boolean(readLEB128(data, index)); const exceptionHandlers = []; const handlerCount = readLEB128(data, index); for (let j = 0; j < handlerCount; j++) { exceptionHandlers.push([ readLEB128(data, index), readLEB128(data, index), readLEB128(data, index), readLEB128(data, index) ]); } const instructions = []; const instructionCount = readLEB128(data, index); for (let j = 0; j < instructionCount; j++) { instructions.push(readLEB128(data, index)); } instructionSets.push([instructions, argsLength, isStrictMode, exceptionHandlers]); } return { strings, instructionSets }; }
|
构建指令映射表
1 2 3 4 5 6 7 8 9 10
| const opcodeMap = { 0: "返回(如果执行状态不为0)", 1: "定义对象属性", 2: "条件跳转", 3: "创建全局变量引用", 4: "比较小于等于", 5: "后置递减", 6: "压入常量", 7: "设置对象属性", };
|
实现反编译器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| function decompile(instructionSet, strings, vmIndex) { const [instructions, argsLength, strictMode, exceptionHandlers] = instructionSet; let code = [`function VM${vmIndex}(${Array(argsLength).fill(0).map((_, i) => `arg${i}`).join(', ')}) {`]; let maxPointer = 0; code.push(` var ${Array(16).fill(0).map((_, i) => `v${i}`).join(',')}; // 生成的变量`); code.push(` var executionStack = []; // 初始化执行栈`); let index = 0; let stack = []; let pointer = -1; while (index < instructions.length) { const opCode = instructions[index++]; const byteCodePos = index; switch (opCode) { case 0: code.push(` if (0 !== executionState) return;`); break; case 1: { const stringIndex = instructions[index++]; code.push(` Object.defineProperty(v${pointer-1}, "${strings[stringIndex]}", { value: v${pointer}, writable: true, configurable: true, enumerable: true });`); pointer--; break; } case 6: pointer++; const value = instructions[index++]; code.push(` v${pointer} = ${value};`); break; } } code.push("}"); return code.join('\n'); }
|
处理控制流和函数调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| case 2: { const jumpOffset = instructions[index++]; code.push(` // if (!v${pointer}) skip ${jumpOffset} to ${index + jumpOffset}`); break; }
case 41: { const argsLen = instructions[index++]; code.push(` v${pointer-argsLen-2} = v${pointer-argsLen-1}(${ Array(argsLen).fill(0).map((_, i) => `v${pointer-argsLen+i}`).join(',') });`); pointer = pointer - argsLen - 1; break; }
|
生成和保存反编译代码
1 2 3 4 5
| instructionSets.forEach((instructionSet, index) => { const code = decompile(instructionSet, strings, index); fs.writeFileSync(`functions/VM${index}.js`, code); });
|
分析关键函数
反编译后,需要分析关键函数,特别是签名生成相关的函数:
分析VM86等签名相关函数
理解MD5哈希、RC4加密等算法的实现
研究X-Bogus和_signature参数的生成逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function signURL(url, userAgent) { url = appendParam(url, 'msToken', msToken); const query = getQueryString(url); const hash1 = MD5(query); const xBogus = generateXBogus(); url = appendParam(url, 'X-Bogus', xBogus); const signature = generateSignature(url, userAgent); url = appendParam(url, '_signature', signature); return url; }
|
总结
反编译VMP是一个复杂的过程,需要深入理解JavaScript虚拟机原理、二进制解析和代码转换技术。