Frida官方手冊 - JavaScript API(篇三)

freakish發表於2017-11-03

JavaScript API

WeakRef

  • WeakRef.bind(value, fn): 監控value物件,當被監控的物件即將被垃圾回收或者指令碼即將被解除安裝的時候,呼叫回撥函式fn,bind返回一個唯一ID,後續可以使用這個ID進行 WeakRef.unbind()呼叫來取消前面的監控。這個API還是很有用處的,比如你想要在JavaScript的某個物件銷燬的時候跟著銷燬一些本地資源,這種情況下,這個機制就比較有用了。
  • WeakRef.unbind(id): 停止上述的物件監控,並且會立即呼叫一次f n

x86Writer

  • new X86Writer(codeAddress[, {pc: ptr(‘0x1234’)}]): 建立一個x86機器碼生成器,並且在codeAddress指向的記憶體進行寫入,codeAddress是NativePointer型別,第二個引數是可選引數,用來指定程式的初始EIP。在iOS系統上,使用Memory.patchCode()的時候,指定初始EIP是必須的,因為記憶體寫入是先寫入到一個臨時的位置,然後再對映到指定位置的記憶體
  • reset(codeAddress[, { pc: ptr(‘0x1234’) }]): 取消codeAddress位置的上次的程式碼寫入
  • dispose(): 立即進行X86相關的記憶體修改清理
  • flush(): 程式碼中標籤引用的解析,操作快取立即應用到記憶體中去。在實際的應用中,當生成一段程式碼片段的時候,就應該呼叫一次這個函式。多個相關聯的函式片段在一起使用的時候,也應該呼叫一次,尤其是要在一起協同執行的幾個函式片段。
  • base: 輸出結果的第一個位元組碼的記憶體位置,NativePointer型別
  • code: 輸出結果的下一個位元組碼的記憶體位置,NativePointer型別
  • pc: 輸出結果的指令指標的記憶體位置,NativePointer型別
  • offset: 當前的偏移(JavaScript數值)
  • putLabel(id): 在當前位置插入一個標籤,標籤用字串id表示
  • putCallAddressWithArguments(fund, args): 準備好一個呼叫C函式的上下文環境,其中args表示被呼叫函式的引數陣列(JavaScript陣列),陣列裡面可以是字串形式指定的暫存器,可以是一個數值,也可以是一個指向立即數的NativePointer
  • putCallAddressWithAlignedArguments(func, args): 跟上面一個函式差不多,但是引數陣列是16位元組對齊的
  • putCallRegWithArguments(reg, args): 準備好一個呼叫C函式的上下文環境,其中args表示被呼叫函式的引數陣列(JavaScript陣列),陣列裡面可以是字串形式指定的暫存器,可以是一個數值,也可以是一個指向立即數的NativePointer
  • putCallRegWithAlignedArguments(reg, args): 引數陣列16位元組對齊
  • putCallRegOffsetPtrWithArguments(reg, offset, args): 準備好一個呼叫C函式的上下文環境,其中args表示被呼叫函式的引數陣列(JavaScript陣列),陣列裡面可以是字串形式指定的暫存器,可以是一個數值,也可以是一個指向立即數的NativePointer
  • putCallAddress(address): 寫入一個Call指令
  • putCallReg(reg): 寫入一個Call指令
  • putCallRegOffsetPtr(reg, offset): 寫入一個Call指令
  • putCallIndirect(addr): 寫入一個Call指令
  • putCallNearLabel(labelId): 在前面定義的Label處建立一個Call 指令
  • putLeave(): 建立一個 LEAVE 指令
  • putRet(): 建立一個 RET 指令
  • putRetImm(immValue): 建立一個RET指令
  • putJmpShortLabel(labelId): 建立一個JMP指令,跳轉到labelId標誌的位置
  • putJmpNearLabel(labelId): 建立一個JMP指令,跳轉到labelId標誌的位置
  • putJmpReg(reg): 建立一個JMP指令
  • putJmpRegPtr(reg): 建立一個JMP指令
  • putJmpRegOffsetPtr(reg, offset): 建立一個JMP指令
  • putJmpNearPtr(address): 建立一個JMP指令
  • putJccShort(labelId, target, hint): 建立一個JCC指令
  • putJccNear(labelId, target, hint): 在labelId處建立一個JCC指令
  • putAddRegImm(reg, immValue)
  • putAddRegReg
  • putAddRegNearPtr(dstReg, srcAddress)
  • putSubRegImm(reg, immValue)
  • putSubRegReg(dstReg, srcReg)
  • putSubRegNearPtr(dstReg, srcAddress)
  • putIncReg(reg)
  • putDecReg(reg)
  • putIncRegPtr(target, reg)
  • putDecRegPtr(target, reg)
  • putLockXaddRegPtrReg(dstReg, srcReg)
  • putLockIncImm32Ptr(target)
  • putLockDecImm32Ptr(target)
  • putAddRegReg(dstReg, srcReg)
  • putAddRegU32(reg, immValue)
  • putShlRegU8(reg, immValue)
  • putShrRegU8(reg, immValue)
  • putXorRegReg(dstReg, srcReg)
  • putMovRegReg(dstReg, srcReg)
  • putMovRegU32(dstReg, immValue)
  • putMovRegU64(dstReg, immValue)
  • putMovRegAddress(dstReg, immValue)
  • putMovRegPtrU32(dstReg, immValue)
  • putMovRegOffsetPtrU32(dstReg, dstOffset, immValue)
  • putMovRegPtrReg(dstReg, srcReg)
  • putMovRegOffsetPtrReg(dstReg, dstOffset, srcReg)
  • putMovRegRegPtr(dstReg, srcReg)
  • putMovRegRegOffsetPtr(dstReg, srcReg, srcOffset)
  • putMovRegBaseIndexScaleOffsetPtr(dstReg, baseReg, indexReg, scale, offset)
  • putMovRegNearPtr(dstReg, srcAddress)
  • putMovNearPtrReg(dstAddress, srcReg)
  • putMovFsU32PtrReg(fsOffset, srcReg)
  • putMovRegFsU32Ptr(dstReg, fsOffset)
  • putMovGsU32PtrReg(fsOffset, srcReg)
  • putMovqXmm0EspOffsetPtr(offset)
  • putMovqEaxOffsetPtrXmm0(offset)
  • putMovdquXmm0EspOffsetPtr(offset)
  • putMovdquEaxOffsetPtr(offset)
  • putLeaRegRegOffset(dstReg, srcReg, srcOffset)
  • putXchgRegRegPtr(leftReg, rightReg)
  • putPushU32(immValue)
  • putPushNearPtr(address)
  • putPushReg(reg)
  • putPopReg(reg)
  • putPushImmPtr(immPtr)
  • putPushax()
  • putPopax()
  • putPushfx()
  • putPopfx()
  • putTestRegReg(regA, regB)
  • putTestRegU32(reg, immValue)
  • putCmpRegI32(reg, immValue)
  • putCmpRegOffsetPtrReg(regA, offset, regB)
  • putCmpImmPtrImmU32(immPtr, immValue)
  • putCmpRegReg(regA, regB)
  • putClc()
  • putStc()
  • putCld()
  • putStd()
  • putCpuid()
  • putLfence()
  • putRdtsc()
  • putPause()
  • putNop()
  • putBreakpoint()
  • putPadding(n)
  • putNopPadding(n)
  • putU8(value)
  • putS8(value)
  • putBytes(data) 從ArrayBuffer中複製原始資料

X86Relocator

  • new X86Relocator(inputCode, output): 建立一個程式碼重定位器,用以進行程式碼從一個位置複製到另一個位置的時候進行程式碼重定位處理,源地址是 inputCode的NativePointer,output表示結果地址,可以用X86Writer物件來指向目的記憶體地址
  • reset(inputCode, output): 回收上述的X86Relocator物件
  • dispose(): 記憶體清理
  • input: 最後一次讀取的指令, 一開始是null,每次呼叫readOne()會自動改變這個屬性
  • eob: 表示當前是否抵達了塊結尾,比如是否遇到了下列任何一個指令:CALL, JMP, BL, RET
  • eoi: 表示input代表的屬性是否結束,比如可能當前遇到了下列的指令:JMP, B, RET,這些指令之後可能沒有有效的指令了
  • readOne(): 把一條指令讀入relocator的內部快取,返回目前已經讀入快取的總位元組數,可以持續呼叫readOne函式來快取指令,或者立即呼叫writeOne()或者skipOne(),也可以一直快取到指定的點,然後一次性呼叫writeAll()。如果已經到了eoi,則函式返回0, 此時eoi屬性也是true
  • peekNextWriteInsn(): peek一條指令出來,以備寫入或者略過
  • peekNextWriteSource(): 在指定地址peek一條指令出來,以備寫入或者略過
  • skipOne(): 忽略下一條即將寫入的指令
  • skipOneNoLabel(): 忽略下一條即將寫入的指令,如果遇到內部使用的Label則不忽略,這個函式是對skipOne的最佳化,可以讓重定位範圍覆蓋的更全面
  • writeOne(): 寫入下條快取指令
  • writeOneNoLabel()
  • writeAll(): 寫入所有快取的指令

x86列舉型別

  • 暫存器:xar, xcx, xdx, xbx, tsp, xbp, xsi, xdi, sax, ecx, edx, ebx, esp, ebx, esi, edi, rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d, xip, eip, rip
  • 跳轉指令:jo, jno, jb, jae, je, jne, jbe, ja, js, jns, jp, jnp, jl, jge, jle, jg, jcxz, jecxz, jrcxz
  • 分支提示:no-hint, likely, unlikely
  • 指標型別:byte, sword, qword

ArmWriter(參考X86Writer)

  • new ArmWriter(codeAddress[, {pc: ptr(‘0x1234’)}])
  • reset(codeAddress[, {pc: ptr(‘0x1234’)}])
  • dispose()
  • flush()
  • base
  • code
  • pc
  • offset
  • skip(nBytes)
  • putBImm(target)
  • putLdrRegAddress(reg, address)
  • putLdrRegU32(reg, val)
  • putAddRegRegImm(dstReg, srcReg, immVal)
  • putLdrRegRegImm(dstReg, srcReg, immVal)
  • putNop()
  • putBreakpoint()
  • putInstruction(insn)
  • putBytes(data)

ArmRelocator(參考X86Relocator)

ThumbRelocator(參考X86Relocator)

Arm enum types

  • 暫存器:r0~r15, sp, lr, sb, sl, fp, ip, pc
  • 條件碼:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al

Arm64Writer(參考X86Writer)

Arm64Relocator(參考X86Relocator)

AArch64 enum types

  • 暫存器:x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 w20 w21 w22 w23 w24 w25 w26 w27 w28 w29 w30 sp lr fp wsp wzr xzr nzcv ip0 ip1 s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 q26 q27 q28 q29 q30 q31
  • 條件碼:eq ne hs lo mi pl vs vc hi ls ge lt gt le al nv
  • 索引模式:post-adjust signed-offset pre-adjust

MipsWriter(參考X86Writer)

MipsRelocator(參考X86Relocator)

MIPS enum types

  • 暫存器:v0 v1 a0 a1 a2 a3 t0 t1 t2 t3 t4 t5 t6 t7 s0 s1 s2 s3 s4 s5 s6 s7 t8 t9 k0 k1 gp sp fp s8 ra hi lo zero at 0 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

全部完~~

相關文章