var testObj = Object.create(null, { a: { value: 100 } })
Object.defineProperty(testObj, 'a', { writable: true })
testObj.a = 200
console.log(testObj.a)
倒着查找的
- hack require 重定向
const old_require = require;
require = function (path) {
console.log(path)
return old_require(path)
}
let xxtea = require('xxtea-node')
var func = xxtea.encrypt
xxtea.encrypt = function (a, b) {
debugger;
return func(a, b)
}
在使用 pako.gzip 对数据进行压缩时,生成的 zipData 是一个 Uint8Array 类型的数组,它包含了gzip格式的压缩数据。Gzip格式由一系列的字段组成,用来存储压缩信息和压缩后的数据。修改 zipData 数组中特定位置的值会直接影响gzip数据的内部结构。
对于 zipData[9] = 10; 这行代码,它修改的是gzip头部中的一个字节。gzip文件格式的头部通常包含以下几部分:
- ID1 和 ID2:这两个字节是固定的,分别是
0x1f和0x8b,用于标识这个文件是gzip格式。 - CM(压缩方法):紧随ID字节之后的是一个字节,表示使用的压缩方法。对于gzip来说,这个值通常是
0x08,表示使用deflate压缩算法。 - FLG(标志字节):指示是否使用了额外的选项,如CRC校验、额外字段、原始文件名等。
- MTIME(修改时间):接下来的四个字节代表文件的最后修改时间,Unix时间戳格式。
- XFL(额外标志):用于提供特定于压缩方法的额外信息。对于deflate,这个字段目前没有被广泛使用,通常设置为
0x00或0x02(最大压缩,但慢),0x04(快速)。 - OS(操作系统):表示创建gzip文件的操作系统。这是gzip头部的最后一个字段。
在上述结构中,zipData[9] 实际上是修改了 OS 字段。OS字段是一个字节大小,用于指示创建gzip文件的操作系统。根据gzip规范,这个字节的可能值包括:
- 0 - FAT 文件系统(MS-DOS、OS/2、NT/Win32)
- 1 - Amiga
- 2 - VMS(或OpenVMS)
- 3 - Unix
- 4 - VM/CMS
- 5 - Atari TOS
- 6 - HPFS 文件系统(OS/2、NT)
- 7 - Macintosh
- 8 - Z-System
- 9 - CP/M
- 10 - TOPS-20
- 11 - NTFS 文件系统(NT)
- 12 - QDOS
- 13 - Acorn RISCOS
- 255 - 未知
因此,zipData[9] = 10; 这行代码将OS字段设置为 10,意味着这个gzip文件标记为在TOPS-20系统上创建。然而,实际上这个值在大多数应用场景下并不重要,很少有软件会根据这个字段改变它们的行为。修改这个值不会影响gzip数据的解压缩,但如果你在处理需要特定OS值的特殊情况,就需要注意这一点。
可能是历史原因