@zsa233/frida-analykit-agent 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/android.d.ts +41 -0
- package/dist/api/android.js +1 -0
- package/dist/bridges.d.ts +4 -0
- package/dist/bridges.js +8 -0
- package/dist/cmodule/scan_adrp.d.ts +9 -0
- package/{src/cmodule/scan_adrp.ts → dist/cmodule/scan_adrp.js} +19 -30
- package/dist/config.d.ts +26 -0
- package/dist/config.js +27 -0
- package/dist/consts.d.ts +18 -0
- package/dist/consts.js +23 -0
- package/dist/elf/insn.d.ts +10 -0
- package/dist/elf/insn.js +43 -0
- package/dist/elf/module.d.ts +95 -0
- package/dist/elf/module.js +632 -0
- package/dist/elf/struct.d.ts +235 -0
- package/{src/elf/struct.ts → dist/elf/struct.js} +63 -149
- package/dist/elf/tools.d.ts +6 -0
- package/dist/elf/tools.js +25 -0
- package/dist/elf/verifier.d.ts +11 -0
- package/dist/elf/verifier.js +57 -0
- package/dist/elf/xref.d.ts +32 -0
- package/dist/elf/xref.js +271 -0
- package/dist/func.d.ts +7 -0
- package/dist/func.js +23 -0
- package/dist/helper.d.ts +130 -0
- package/dist/helper.js +527 -0
- package/{src/index.ts → dist/index.d.ts} +0 -1
- package/dist/index.js +9 -0
- package/dist/jni/env.d.ts +821 -0
- package/dist/jni/env.js +1054 -0
- package/{src/jni/struct.ts → dist/jni/struct.d.ts} +8 -54
- package/dist/jni/struct.js +173 -0
- package/dist/lib/libc.d.ts +68 -0
- package/dist/lib/libc.js +125 -0
- package/dist/lib/libssl.d.ts +23 -0
- package/dist/lib/libssl.js +60 -0
- package/dist/message.d.ts +18 -0
- package/dist/message.js +21 -0
- package/dist/net/ssl.d.ts +29 -0
- package/dist/net/ssl.js +249 -0
- package/dist/net/struct.d.ts +34 -0
- package/{src/net/struct.ts → dist/net/struct.js} +4 -18
- package/dist/net/tools.js +1 -0
- package/dist/process.d.ts +43 -0
- package/dist/process.js +77 -0
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.js +248 -0
- package/dist/utils/array_pointer.d.ts +21 -0
- package/dist/utils/array_pointer.js +81 -0
- package/dist/utils/queue.d.ts +19 -0
- package/dist/utils/queue.js +89 -0
- package/dist/utils/scan.d.ts +35 -0
- package/dist/utils/scan.js +72 -0
- package/dist/utils/std.d.ts +40 -0
- package/dist/utils/std.js +128 -0
- package/dist/utils/text_endec.d.ts +8 -0
- package/dist/utils/text_endec.js +29 -0
- package/dist/utils/utils.d.ts +28 -0
- package/dist/utils/utils.js +66 -0
- package/package.json +18 -5
- package/src/api/android.ts +0 -80
- package/src/bridges.ts +0 -18
- package/src/cmodule/scan_adrp.c +0 -81
- package/src/config.ts +0 -56
- package/src/consts.ts +0 -31
- package/src/elf/insn.ts +0 -61
- package/src/elf/module.ts +0 -751
- package/src/elf/tools.ts +0 -33
- package/src/elf/verifier.ts +0 -74
- package/src/elf/xref.ts +0 -360
- package/src/func.ts +0 -32
- package/src/helper.ts +0 -685
- package/src/jni/env.ts +0 -1439
- package/src/lib/libc.ts +0 -161
- package/src/lib/libssl.ts +0 -95
- package/src/message.ts +0 -26
- package/src/net/ssl.ts +0 -360
- package/src/process.ts +0 -137
- package/src/rpc.ts +0 -268
- package/src/runtime-globals.d.ts +0 -11
- package/src/utils/array_pointer.ts +0 -102
- package/src/utils/queue.ts +0 -102
- package/src/utils/scan.ts +0 -103
- package/src/utils/std.ts +0 -165
- package/src/utils/text_endec.ts +0 -35
- package/src/utils/utils.ts +0 -111
- /package/{src/net/tools.ts → dist/net/tools.d.ts} +0 -0
package/src/process.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { help } from "./helper.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
// frida-gum/index.d.ts
|
|
5
|
-
interface RangeDetails {
|
|
6
|
-
/**
|
|
7
|
-
* Base address.
|
|
8
|
-
*/
|
|
9
|
-
base: NativePointer;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Size in bytes.
|
|
13
|
-
*/
|
|
14
|
-
size: number;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Protection.
|
|
18
|
-
*/
|
|
19
|
-
protection: PageProtection;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* File mapping details, if available.
|
|
23
|
-
*/
|
|
24
|
-
file?: FileMapping | undefined;
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
export class ProcMapItem {
|
|
30
|
-
start_page: NativePointer
|
|
31
|
-
end_page: NativePointer
|
|
32
|
-
prots: string
|
|
33
|
-
offset: number
|
|
34
|
-
main_dev: string
|
|
35
|
-
slave_dev: string
|
|
36
|
-
inode: number
|
|
37
|
-
pathname: string
|
|
38
|
-
|
|
39
|
-
constructor(
|
|
40
|
-
start_page: string,
|
|
41
|
-
end_page: string,
|
|
42
|
-
prots: string,
|
|
43
|
-
offset: string,
|
|
44
|
-
main_dev: string,
|
|
45
|
-
slave_dev: string,
|
|
46
|
-
inode: string,
|
|
47
|
-
pathname: string,
|
|
48
|
-
) {
|
|
49
|
-
this.start_page = ptr(parseInt(start_page, 16))
|
|
50
|
-
this.end_page = ptr(parseInt(end_page, 16))
|
|
51
|
-
this.prots = prots
|
|
52
|
-
this.offset = parseInt(offset, 16)
|
|
53
|
-
this.main_dev = main_dev
|
|
54
|
-
this.slave_dev = slave_dev
|
|
55
|
-
this.inode = parseInt(inode)
|
|
56
|
-
this.pathname = pathname.trim()
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
toString(): string {
|
|
60
|
-
return `${this.start_page.toString(16)}-${this.end_page.toString(16)} ${this.prots} ${this.offset.toString(16)} ${this.main_dev}:${this.slave_dev} ${this.inode} ${this.pathname}`
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const REGEXP_PROC_MAPS_LINE = /^([a-fA-F0-9]+)-([a-fA-F0-9]+)\s+([rwx\-p]+)\s+(\w+)\s+(\w+):(\d+)\s+(\d+)\s+(.*)$/
|
|
65
|
-
|
|
66
|
-
export class ProcMap {
|
|
67
|
-
public text: string
|
|
68
|
-
public items: ProcMapItem[]
|
|
69
|
-
|
|
70
|
-
constructor(text: string) {
|
|
71
|
-
this.text = text
|
|
72
|
-
this.items = []
|
|
73
|
-
const lines = text.split('\n')
|
|
74
|
-
for (const line of lines) {
|
|
75
|
-
if (!line.trim()) continue
|
|
76
|
-
const result = ProcMap.parseLine(line)
|
|
77
|
-
if (!result || result.length !== 8) continue
|
|
78
|
-
const item = new ProcMapItem(
|
|
79
|
-
...result as [string, string, string, string, string, string, string, string]
|
|
80
|
-
)
|
|
81
|
-
this.items.push(item)
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
static parseLine(line: string): string[] | null {
|
|
86
|
-
const m = REGEXP_PROC_MAPS_LINE.exec(line)
|
|
87
|
-
if (!m) return null
|
|
88
|
-
return m.slice(1)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
find(start_addr: NativePointer, end_addr: NativePointer): ProcMapItem[] {
|
|
92
|
-
return this.items.filter(item => {
|
|
93
|
-
return !(item.start_page >= end_addr || item.end_page <= start_addr)
|
|
94
|
-
})
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
class Proc {
|
|
101
|
-
private static _mapCache: RangeDetails[] = []
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
static findMapCache(addr: NativePointer): RangeDetails | null {
|
|
105
|
-
const result = this._mapCache.find((v, i) => {
|
|
106
|
-
return addr >= v.base && addr < v.base.add(v.size)
|
|
107
|
-
})
|
|
108
|
-
if (result) {
|
|
109
|
-
return result || null
|
|
110
|
-
}
|
|
111
|
-
const range = Process.findRangeByAddress(addr)
|
|
112
|
-
if(!range) {
|
|
113
|
-
return null
|
|
114
|
-
}
|
|
115
|
-
let hitIndex = -1
|
|
116
|
-
const hit = this._mapCache.find((v, i) => {
|
|
117
|
-
const ok = v.base == range.base
|
|
118
|
-
if (ok) hitIndex = i
|
|
119
|
-
return ok
|
|
120
|
-
})
|
|
121
|
-
if (hitIndex !== -1) {
|
|
122
|
-
this._mapCache[hitIndex] = range
|
|
123
|
-
}else{
|
|
124
|
-
this._mapCache.push(range)
|
|
125
|
-
}
|
|
126
|
-
return range
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
static loadProcMap(pid: number | string = 'self'): ProcMap{
|
|
131
|
-
return new ProcMap(help.readProcMaps(pid))
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
export { Proc as proc }
|
package/src/rpc.ts
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { Java, ObjC, Swift } from "./bridges.js"
|
|
2
|
-
import { JNIEnv } from "./jni/env.js"
|
|
3
|
-
import { RPCMsgType } from "./message.js"
|
|
4
|
-
import { SSLTools } from "./net/ssl.js"
|
|
5
|
-
import { help } from "./helper.js"
|
|
6
|
-
import { Libssl } from "./lib/libssl.js"
|
|
7
|
-
import { proc } from "./process.js"
|
|
8
|
-
import { ElfTools } from "./elf/tools.js"
|
|
9
|
-
|
|
10
|
-
const _BASE_CONTEXT = {
|
|
11
|
-
Java,
|
|
12
|
-
Process,
|
|
13
|
-
Module,
|
|
14
|
-
Memory,
|
|
15
|
-
ObjC,
|
|
16
|
-
Swift,
|
|
17
|
-
File,
|
|
18
|
-
hexdump,
|
|
19
|
-
ApiResolver,
|
|
20
|
-
Arm64Relocator,
|
|
21
|
-
Arm64Writer,
|
|
22
|
-
Stalker,
|
|
23
|
-
Thread,
|
|
24
|
-
Interceptor,
|
|
25
|
-
ModuleMap,
|
|
26
|
-
Frida,
|
|
27
|
-
Script,
|
|
28
|
-
Backtracer,
|
|
29
|
-
UInt64,
|
|
30
|
-
Int64,
|
|
31
|
-
Worker,
|
|
32
|
-
|
|
33
|
-
help,
|
|
34
|
-
proc,
|
|
35
|
-
JNIEnv,
|
|
36
|
-
SSLTools,
|
|
37
|
-
ElfTools,
|
|
38
|
-
Libssl,
|
|
39
|
-
|
|
40
|
-
Object, Array, String, Number, Boolean, Symbol, BigInt, Function,
|
|
41
|
-
Math, Date, RegExp, Map, Set, WeakMap, WeakSet,
|
|
42
|
-
Error, TypeError, SyntaxError,
|
|
43
|
-
JSON, console,
|
|
44
|
-
isNaN, isFinite, parseInt, parseFloat,
|
|
45
|
-
setTimeout, clearTimeout, setInterval, clearInterval,
|
|
46
|
-
encodeURI, decodeURI, encodeURIComponent, decodeURIComponent,
|
|
47
|
-
Reflect, Proxy,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
ArrayBuffer,
|
|
51
|
-
Int8Array,
|
|
52
|
-
Int16Array,
|
|
53
|
-
Int32Array,
|
|
54
|
-
Uint8Array,
|
|
55
|
-
Uint16Array,
|
|
56
|
-
Uint32Array,
|
|
57
|
-
NativePointer,
|
|
58
|
-
NativeFunction,
|
|
59
|
-
NativeCallback,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const EVAL_SCOPES: { [key: string]: { [key: string]: any } } = {}
|
|
66
|
-
const SCOPE_GETTER_PREFIX = '__get__$$'
|
|
67
|
-
|
|
68
|
-
let ID_INCR = 0
|
|
69
|
-
|
|
70
|
-
function gen_id(): string {
|
|
71
|
-
ID_INCR++
|
|
72
|
-
return `${SCOPE_GETTER_PREFIX}${ID_INCR.toString(16)}`
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
function getValueByPath(path: string, bind: boolean = false, root: any = globalThis): any {
|
|
77
|
-
let obj: any = root
|
|
78
|
-
let parent = obj
|
|
79
|
-
for(let key of path.split('/')) {
|
|
80
|
-
parent = obj
|
|
81
|
-
obj = obj[key]
|
|
82
|
-
}
|
|
83
|
-
if (parent !== root && typeof (obj) === 'function') {
|
|
84
|
-
obj = bind ? obj.bind(parent) : obj
|
|
85
|
-
}
|
|
86
|
-
return obj
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function getObj(instIdOrObjChain: string, scopeId: string, bind: boolean = false): any {
|
|
90
|
-
let value: any
|
|
91
|
-
if (instIdOrObjChain.startsWith(SCOPE_GETTER_PREFIX)) {
|
|
92
|
-
const scope = EVAL_SCOPES[scopeId]
|
|
93
|
-
value = getValueByPath(instIdOrObjChain, bind, scope)
|
|
94
|
-
} else {
|
|
95
|
-
value = getValueByPath(instIdOrObjChain, bind)
|
|
96
|
-
}
|
|
97
|
-
return value
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
function enumerateObjProps(instIdOrObjChain: string | Array<string>, scopeId: string) {
|
|
102
|
-
const propsList: Array<{ [key: string]: string }> = []
|
|
103
|
-
const objList: Array<string> = []
|
|
104
|
-
if(typeof(instIdOrObjChain) === 'string') {
|
|
105
|
-
objList.push(instIdOrObjChain)
|
|
106
|
-
}else{
|
|
107
|
-
objList.push(...instIdOrObjChain)
|
|
108
|
-
}
|
|
109
|
-
for (let v of objList) {
|
|
110
|
-
const props: { [key: string]: string } = {}
|
|
111
|
-
let obj
|
|
112
|
-
try{
|
|
113
|
-
obj = getObj(v, scopeId)
|
|
114
|
-
}catch(e){}
|
|
115
|
-
try {
|
|
116
|
-
const numKeys: Array<number> = []
|
|
117
|
-
while (obj && obj !== Object.prototype) {
|
|
118
|
-
for (const key of Reflect.ownKeys(obj)) {
|
|
119
|
-
if (typeof (key) === 'symbol') {
|
|
120
|
-
continue
|
|
121
|
-
}
|
|
122
|
-
if(/^\d+$/.test(key)){
|
|
123
|
-
numKeys.push(parseInt(key))
|
|
124
|
-
continue
|
|
125
|
-
}
|
|
126
|
-
let type
|
|
127
|
-
const desc = Reflect.getOwnPropertyDescriptor(obj, key)
|
|
128
|
-
if (desc?.get) {
|
|
129
|
-
type = 'getter'
|
|
130
|
-
}else if (desc?.set) {
|
|
131
|
-
type = 'setter'
|
|
132
|
-
}else{
|
|
133
|
-
type = typeof(obj[key])
|
|
134
|
-
}
|
|
135
|
-
props[String(key)] = type
|
|
136
|
-
}
|
|
137
|
-
obj = Object.getPrototypeOf(obj)
|
|
138
|
-
}
|
|
139
|
-
if(numKeys.length > 0) {
|
|
140
|
-
if(numKeys.length <= 50) {
|
|
141
|
-
for(let n of numKeys) {
|
|
142
|
-
const key = n.toString()
|
|
143
|
-
const desc = Reflect.getOwnPropertyDescriptor(obj, key)
|
|
144
|
-
let type
|
|
145
|
-
if (desc?.get) {
|
|
146
|
-
type = 'getter'
|
|
147
|
-
} else if (desc?.set) {
|
|
148
|
-
type = 'setter'
|
|
149
|
-
} else {
|
|
150
|
-
type = typeof (obj[key])
|
|
151
|
-
}
|
|
152
|
-
props[String(key)] = type
|
|
153
|
-
}
|
|
154
|
-
}else{
|
|
155
|
-
const minN: number = Math.min(...numKeys)
|
|
156
|
-
const maxN: number = Math.max(...numKeys)
|
|
157
|
-
props[`[${minN}:${maxN+1}]`] = 'index'
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
} catch (e) {
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
propsList.push(props)
|
|
164
|
-
}
|
|
165
|
-
return {
|
|
166
|
-
type: RPCMsgType.ENUMERATE_OBJ_PROPS,
|
|
167
|
-
data: {
|
|
168
|
-
props: propsList,
|
|
169
|
-
},
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
function iterScopeGet(v: any, scopeId: string, bind: boolean = false): any {
|
|
175
|
-
switch(typeof(v)) {
|
|
176
|
-
case 'string':
|
|
177
|
-
if (v.startsWith(SCOPE_GETTER_PREFIX)) {
|
|
178
|
-
return getObj(v, scopeId, bind)
|
|
179
|
-
}
|
|
180
|
-
break
|
|
181
|
-
case 'object':
|
|
182
|
-
const nv: { [key: string]: any } = {}
|
|
183
|
-
for(const [kk, vv] of Object.entries(v)) {
|
|
184
|
-
nv[kk] = iterScopeGet(vv, scopeId, bind)
|
|
185
|
-
}
|
|
186
|
-
return nv
|
|
187
|
-
}
|
|
188
|
-
return v
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
function scopeCall(instIdOrObjChain: string, args: Array<any>, scopeId: string){
|
|
193
|
-
const obj = getObj(instIdOrObjChain, scopeId, true)
|
|
194
|
-
const nargs = args.map(v => {
|
|
195
|
-
return iterScopeGet(v, scopeId, false)
|
|
196
|
-
})
|
|
197
|
-
const result = obj(...nargs)
|
|
198
|
-
const id = gen_id()
|
|
199
|
-
scopeSave(result, id, scopeId)
|
|
200
|
-
return {
|
|
201
|
-
type: RPCMsgType.SCOPE_CALL,
|
|
202
|
-
data: {
|
|
203
|
-
id,
|
|
204
|
-
type: typeof (result),
|
|
205
|
-
result
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function scopeSave(obj: any, instId: string, scopeId: string) {
|
|
211
|
-
let scope = EVAL_SCOPES[scopeId]
|
|
212
|
-
if (scope === undefined) {
|
|
213
|
-
scope = {}
|
|
214
|
-
EVAL_SCOPES[scopeId] = scope
|
|
215
|
-
}
|
|
216
|
-
scope[instId] = obj
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function scopeGet(instIdOrObjChain: string, scopeId: string, bind: boolean = false): any {
|
|
220
|
-
const value = getObj(instIdOrObjChain, scopeId, bind)
|
|
221
|
-
return {
|
|
222
|
-
type: RPCMsgType.SCOPE_GET,
|
|
223
|
-
data: {
|
|
224
|
-
value,
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function scopeClear(scopeId: string) {
|
|
230
|
-
delete (EVAL_SCOPES[scopeId])
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
function scopeDel(instId: string, scopeId: string) {
|
|
234
|
-
const scope = EVAL_SCOPES[scopeId]
|
|
235
|
-
if(scope) {
|
|
236
|
-
delete(scope[instId])
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
function evalWithContext(code: string, context: any = {}){
|
|
241
|
-
const mergeContext = { ..._BASE_CONTEXT, ...context}
|
|
242
|
-
return Function(...Object.keys(mergeContext), code)(...Object.values(mergeContext))
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
function scopeEval(source: string, scopeId: string) {
|
|
246
|
-
const result = evalWithContext(source, EVAL_SCOPES[scopeId] || {})
|
|
247
|
-
const id = gen_id()
|
|
248
|
-
scopeSave(result, id, scopeId)
|
|
249
|
-
return {
|
|
250
|
-
type: RPCMsgType.SCOPE_EVAL,
|
|
251
|
-
data: {
|
|
252
|
-
id,
|
|
253
|
-
type: typeof (result),
|
|
254
|
-
result
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
rpc.exports = {
|
|
261
|
-
enumerateObjProps,
|
|
262
|
-
scopeCall,
|
|
263
|
-
scopeEval,
|
|
264
|
-
scopeClear,
|
|
265
|
-
scopeGet,
|
|
266
|
-
scopeSave,
|
|
267
|
-
scopeDel,
|
|
268
|
-
}
|
package/src/runtime-globals.d.ts
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export class ArrayPointer extends Number {
|
|
5
|
-
buff: ArrayBuffer | undefined
|
|
6
|
-
constructor(val: any, buff?: ArrayBuffer) {
|
|
7
|
-
super(val)
|
|
8
|
-
this.buff = buff
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
isNull(): boolean {
|
|
12
|
-
return !this.buff?.byteLength
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
add(val: number | ArrayPointer): ArrayPointer {
|
|
16
|
-
return new ArrayPointer(this.toNumber() + Number(val), this.buff)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
sub(val: number | ArrayPointer): ArrayPointer {
|
|
20
|
-
return new ArrayPointer(this.toNumber() - Number(val), this.buff)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
toNumber(): number {
|
|
24
|
-
return Number(this)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
getViewer(size: number): DataView {
|
|
28
|
-
const off = this.toNumber()
|
|
29
|
-
const view = new DataView(this.buff!.slice(off, off + size))
|
|
30
|
-
return view
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
readS8(): number {
|
|
34
|
-
const view = this.getViewer(1)
|
|
35
|
-
return view.getInt8(0)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
readU8(): number {
|
|
39
|
-
const view = this.getViewer(1)
|
|
40
|
-
return view.getUint8(0)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
readS16(): number {
|
|
44
|
-
const view = this.getViewer(2)
|
|
45
|
-
return view.getInt16(0, true)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
readU16(): number {
|
|
49
|
-
const view = this.getViewer(2)
|
|
50
|
-
return view.getUint16(0, true)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
readS32(): number {
|
|
54
|
-
const view = this.getViewer(4)
|
|
55
|
-
return view.getInt32(0, true)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
readU32(): number {
|
|
59
|
-
const view = this.getViewer(4)
|
|
60
|
-
return view.getUint32(0, true)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
readS64(): BigInt {
|
|
64
|
-
const view = this.getViewer(8)
|
|
65
|
-
return view.getBigInt64(0, true)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
readU64(): BigInt {
|
|
69
|
-
const view = this.getViewer(8)
|
|
70
|
-
return view.getBigUint64(0, true)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
readCString(): string {
|
|
74
|
-
if(this.isNull()) {
|
|
75
|
-
return ''
|
|
76
|
-
}
|
|
77
|
-
const off = this.toNumber()
|
|
78
|
-
let str = ''
|
|
79
|
-
const bview = new DataView(this.buff!)
|
|
80
|
-
for (let i = off; i < this.buff!.byteLength; i++) {
|
|
81
|
-
const b = bview.getUint8(i)
|
|
82
|
-
if (b === 0x00) {
|
|
83
|
-
break
|
|
84
|
-
}
|
|
85
|
-
str += String.fromCharCode(b)
|
|
86
|
-
}
|
|
87
|
-
return str
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
readByteArray(length: number): ArrayBuffer {
|
|
91
|
-
const off = this.toNumber()
|
|
92
|
-
return this.buff!.slice(off, off + length)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
readPointer(): NativePointer {
|
|
96
|
-
return ptr(Number(this.readU64())).readPointer()
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
toString(): string {
|
|
100
|
-
return this.readU64().toString(16)
|
|
101
|
-
}
|
|
102
|
-
}
|
package/src/utils/queue.ts
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export class FixedQueue<T> {
|
|
4
|
-
private _index = -1
|
|
5
|
-
private $depth = 0
|
|
6
|
-
private $list: (T | undefined)[]
|
|
7
|
-
private $length = 0
|
|
8
|
-
private $overflowCallback?: (elements: T[]) => void
|
|
9
|
-
|
|
10
|
-
constructor(length: number) {
|
|
11
|
-
this.$list = Array.from({ length: length }, () => undefined)
|
|
12
|
-
this.$length = 0
|
|
13
|
-
this.$depth = length
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
push(elm: T): T | undefined {
|
|
17
|
-
let popElm = undefined
|
|
18
|
-
this._index = (this._index + 1) % this.$depth
|
|
19
|
-
if (this.$length === this.$depth) {
|
|
20
|
-
popElm = this.$list[this._index]
|
|
21
|
-
} else {
|
|
22
|
-
this.$length++
|
|
23
|
-
}
|
|
24
|
-
this.$list[this._index] = elm
|
|
25
|
-
if(popElm !== undefined) {
|
|
26
|
-
this.$onOverflow(popElm)
|
|
27
|
-
}
|
|
28
|
-
return popElm
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
pop(): T | undefined {
|
|
32
|
-
if (this.$length === this.$depth) {
|
|
33
|
-
const head = this.$headIndex
|
|
34
|
-
const elm = this.$list[head]
|
|
35
|
-
this.$length--
|
|
36
|
-
this.$list[head] = undefined
|
|
37
|
-
return elm
|
|
38
|
-
} else if (this.$length > 0) {
|
|
39
|
-
let head = this.$headIndex
|
|
40
|
-
const elm = this.$list[head]
|
|
41
|
-
this.$length--
|
|
42
|
-
if (this.$length < 0) this.$length = 0
|
|
43
|
-
this.$list[head] = undefined
|
|
44
|
-
return elm
|
|
45
|
-
}
|
|
46
|
-
return undefined
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
clear() {
|
|
50
|
-
this.$length = 0
|
|
51
|
-
this._index = 0
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get $headIndex(): number {
|
|
55
|
-
let head = this._index + 1 - this.$length
|
|
56
|
-
if (head < 0) {
|
|
57
|
-
head += this.$depth
|
|
58
|
-
}
|
|
59
|
-
return head
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
get $tailIndex(): number {
|
|
63
|
-
return this._index
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
get list(): T[] {
|
|
67
|
-
if (this.$length <= 0) {
|
|
68
|
-
return []
|
|
69
|
-
}
|
|
70
|
-
const head = this.$headIndex
|
|
71
|
-
const tail = this.$tailIndex + 1
|
|
72
|
-
if (head >= tail) {
|
|
73
|
-
return [...this.$list.slice(head), ...this.$list.slice(0, tail)] as T[]
|
|
74
|
-
}
|
|
75
|
-
return this.$list.slice(head, tail) as T[]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
get length() {
|
|
79
|
-
return this.$length
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
index(offset: number): T | undefined {
|
|
83
|
-
const idx = (this._index + 1 + offset) % this.$depth
|
|
84
|
-
return this.$list[idx]
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
flush(): Array<T> {
|
|
88
|
-
const list = this.list
|
|
89
|
-
this.clear()
|
|
90
|
-
return list
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
registerOverflowCallback(callback: (elements: T[]) => void){
|
|
94
|
-
this.$overflowCallback = callback
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
$onOverflow(element: T) {
|
|
98
|
-
if(!this.$overflowCallback) return
|
|
99
|
-
this.$overflowCallback([element, ...this.flush()])
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
}
|
package/src/utils/scan.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { NativePointerObject } from "../helper.js"
|
|
4
|
-
import {
|
|
5
|
-
binaryPointer,
|
|
6
|
-
binaryReadPointer,
|
|
7
|
-
binaryReadU32,
|
|
8
|
-
} from "./utils.js"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export const GArray_structOf = {
|
|
12
|
-
B64: {
|
|
13
|
-
data: binaryReadPointer(0),
|
|
14
|
-
len: binaryReadU32(8),
|
|
15
|
-
},
|
|
16
|
-
// B32
|
|
17
|
-
B32: {}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class GArrayPtr extends NativePointerObject {
|
|
25
|
-
|
|
26
|
-
constructor(handle: NativePointer) {
|
|
27
|
-
super(handle)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
static cast(handle: NativePointer): GArrayPtr {
|
|
31
|
-
return new GArrayPtr(handle)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get data(): NativePointer {
|
|
35
|
-
const obj = this.$handle.readPointer()
|
|
36
|
-
if (obj.isNull()) return NULL
|
|
37
|
-
return GArray_structOf.B64.data(obj)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
get length(): number {
|
|
41
|
-
const obj = this.$handle.readPointer()
|
|
42
|
-
if (obj.isNull()) return 0
|
|
43
|
-
return GArray_structOf.B64.len(obj)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
[Symbol.iterator]() {
|
|
47
|
-
let nextPtr = this.data
|
|
48
|
-
const length = this.length
|
|
49
|
-
let inc = 0
|
|
50
|
-
return {
|
|
51
|
-
next() {
|
|
52
|
-
const result = {
|
|
53
|
-
value: nextPtr,
|
|
54
|
-
done: inc >= length,
|
|
55
|
-
}
|
|
56
|
-
nextPtr = nextPtr.add(Process.pointerSize)
|
|
57
|
-
inc++
|
|
58
|
-
return result
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
toArray(): NativePointer[] {
|
|
64
|
-
const list = []
|
|
65
|
-
for (let v of this) {
|
|
66
|
-
list.push(v)
|
|
67
|
-
}
|
|
68
|
-
return list
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
export const MemoryScanRes_structOf = {
|
|
76
|
-
B64: {
|
|
77
|
-
results: binaryPointer(0),
|
|
78
|
-
user_data: binaryPointer(8),
|
|
79
|
-
SIZE: 16,
|
|
80
|
-
},
|
|
81
|
-
// B32
|
|
82
|
-
B32: {}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
export class CMemoryScanRes extends NativePointerObject {
|
|
87
|
-
readonly data: GArrayPtr
|
|
88
|
-
readonly user_data: NativePointer
|
|
89
|
-
|
|
90
|
-
constructor(userData: NativePointer) {
|
|
91
|
-
const structOf = MemoryScanRes_structOf.B64
|
|
92
|
-
|
|
93
|
-
const handle = Memory.alloc(structOf.SIZE)
|
|
94
|
-
|
|
95
|
-
super(handle)
|
|
96
|
-
|
|
97
|
-
this.data = new GArrayPtr(structOf.results(handle))
|
|
98
|
-
structOf.user_data(handle).writePointer(userData)
|
|
99
|
-
this.user_data = userData
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|