def
mprotect(
self
, mPtr
=
None
, size
=
4096
, prot
=
7
, log
=
False
):
if
mPtr
is
None
:
self
.patchASM(
"MOV R2,PC"
)
else
:
self
.loadToReg(
self
.addPtr(mPtr), reg
=
"R2"
)
self
.prepareStack(
3
)
self
.patchASM(
"MOV R1,R2,LSR#12"
)
self
.patchASM(
"MOV R0,R1,LSL#12"
)
self
.saveRegToStack(reg
=
"R0"
, index
=
0
)
self
.patchASM(
"MOV R1,#{}"
.
format
(size))
self
.saveRegToStack(reg
=
"R1"
, index
=
1
)
self
.patchASM(
"MOV R2,#{}"
.
format
(prot))
self
.saveRegToStack(reg
=
"R2"
, index
=
2
)
self
.jumpTo(
self
.getRelocation(
"mprotect"
), jmpType
=
"REL"
, reg
=
"R3"
, resetPC
=
False
)
self
.patchASM(
"MOV R3,R0"
)
if
log:
self
.android_log_print_reg(formart
=
"mprotect ret = %d args : %p %p %p"
)
self
.restoreStack(
3
)
def
loadBaseToReg(
self
, reg
=
"R4"
, log
=
False
):
self
.loadToReg(
self
.addPtr(
self
.currentPC
+
7
*
self
._pSize), reg
=
"R1"
, fix
=
1
)
self
.patchASM(
"LDR R2,[R1]"
)
self
.patchASM(
"SUB R0,PC,R2"
)
self
.patchASM(
"MOV {},R0"
.
format
(reg))
if
log:
self
.patchASM(
"MOV R3,R0"
)
self
.android_log_print_reg(formart
=
"soAddr -> %p"
)
def
relocationGot(
self
, reg
=
"R9"
):
self
.prepareStack(
2
)
self
.loadToReg(functionsMap.get(
"GOT_TABLE"
), reg
=
"R5"
, fix
=
1
)
self
.patchASM(
"MOV R7,#0"
)
self
.patchASM(
"MOV R10,#0"
)
self
.patchASM(
"ADD R8,R5,R7"
)
self
.patchASM(
"LDR R6,[R8]"
)
self
.patchASM(
"CMP R6,#0"
)
self
.jumpTo(
self
.currentPC
+
self
._pSize
*
24
, jmpType
=
"BEQ"
, resetPC
=
False
)
self
.patchASM(
"MOV R3,R8"
)
self
.patchASM(
"ADD R10,#1"
)
self
.saveRegToStack(reg
=
"R6"
, index
=
0
)
self
.patchASM(
"ADD R6,R6,{}"
.
format
(reg))
self
.saveRegToStack(reg
=
"R6"
, index
=
1
)
self
.android_log_print_reg(formart
=
"GOT relocation %p ---> %p ---> %p"
)
self
.patchASM(
"STR R6,[R8]"
)
self
.patchASM(
"ADD R7,R7,#4"
)
self
.jumpTo(
self
.currentPC
-
self
._pSize
*
26
, jmpType
=
"B"
, resetPC
=
False
)
self
.patchASM(
"MOV R3,R10"
)
self
.android_log_print_reg(formart
=
"Finished GOT relocation all:%d"
)
self
.restoreStack(
2
)