|
|
@@ -43,6 +43,8 @@ var jumpOps = map[arm64asm.Op]bool{
|
|
|
|
|
|
const NOP_ENC = 0xd503201f
|
|
|
|
|
|
+const RET_ENC = 0xd65f03c0
|
|
|
+
|
|
|
var nopBytes = []byte{0xd5, 0x03, 0x20, 0x1f}
|
|
|
|
|
|
const (
|
|
|
@@ -174,15 +176,54 @@ func (j *JvmInjector) findReleaseAddressInfoFromMem() error {
|
|
|
// 修改指令效验方式为首地址 w5向上偏移4段
|
|
|
// TODO Position Independent check
|
|
|
klog.Infof("[inject] start check...")
|
|
|
+ if os.Getenv("jvm_offset") != "" {
|
|
|
+ if off, err := strconv.Atoi(os.Getenv("jvm_offset")); err == nil {
|
|
|
+ SrcAddrOffset = uintptr(off)
|
|
|
+ if SrcAddrOffset == 0 {
|
|
|
+ return fmt.Errorf("[attach] jvm_offset have no hook point.")
|
|
|
+ } else {
|
|
|
+ klog.Infof("[attach] use jvm_offset off:%d", SrcAddrOffset)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
pc := uint64(0)
|
|
|
+
|
|
|
+ var findw5 bool
|
|
|
+ var findx3 bool
|
|
|
+
|
|
|
for pc < uint64(len(code)) {
|
|
|
//err = j.checkEnc(code, pc, 4, 0x2a0503f3) // mov w19, w5
|
|
|
|
|
|
inst, err := arm64asm.Decode(code[pc:])
|
|
|
|
|
|
- if err == nil && inst.Op == arm64asm.MOV && inst.Args[1] == arm64asm.W5 {
|
|
|
- var found bool
|
|
|
+ if err == nil && inst.Op == arm64asm.STR && inst.Args[0] == arm64asm.X3 && !findw5 {
|
|
|
+ findx3 = true
|
|
|
+ forwardOk := true
|
|
|
+ // Step 1: 向后检查
|
|
|
+ for i := 0; i <= ChangeEncLen; i++ {
|
|
|
+ offset := pc + uint64(i*4)
|
|
|
+ if offset+4 > uint64(len(code)) {
|
|
|
+ forwardOk = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ inst, err := arm64asm.Decode(code[offset : offset+4])
|
|
|
+ if err != nil || jumpOps[inst.Op] {
|
|
|
+ forwardOk = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if forwardOk {
|
|
|
+ SrcAddrOffset = uintptr(pc)
|
|
|
+ klog.Infof("[inject] x3 start check ok [after]... SrcAddrOffset:%d", SrcAddrOffset)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if err == nil && inst.Op == arm64asm.MOV && inst.Args[1] == arm64asm.W5 && !findx3 {
|
|
|
+ findw5 = true
|
|
|
|
|
|
// Step 1: 向前检查(不包含当前指令)
|
|
|
if pc >= uint64(ChangeEncLen*4) {
|
|
|
@@ -197,31 +238,30 @@ func (j *JvmInjector) findReleaseAddressInfoFromMem() error {
|
|
|
}
|
|
|
if backwardOk {
|
|
|
SrcAddrOffset = uintptr(pc - uint64(ChangeEncLen*4))
|
|
|
- found = true
|
|
|
- klog.Infof("[inject] start check ok [before]...")
|
|
|
+ klog.Infof("[inject] w5 start check ok [before]... SrcAddrOffset:%d", SrcAddrOffset)
|
|
|
+ return nil
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Step 2: 向前失败 → 尝试向后
|
|
|
- if !found {
|
|
|
- forwardOk := true
|
|
|
- for i := 1; i <= ChangeEncLen; i++ {
|
|
|
- offset := pc + uint64(i*4)
|
|
|
- if offset+4 > uint64(len(code)) {
|
|
|
- forwardOk = false
|
|
|
- break
|
|
|
- }
|
|
|
- inst, err := arm64asm.Decode(code[offset : offset+4])
|
|
|
- if err != nil || jumpOps[inst.Op] {
|
|
|
- forwardOk = false
|
|
|
- break
|
|
|
- }
|
|
|
+ forwardOk := true
|
|
|
+ for i := 0; i <= ChangeEncLen; i++ {
|
|
|
+ offset := pc + uint64(i*4)
|
|
|
+ if offset+4 > uint64(len(code)) {
|
|
|
+ forwardOk = false
|
|
|
+ break
|
|
|
}
|
|
|
- if forwardOk {
|
|
|
- klog.Infof("[inject] start check ok [after]...")
|
|
|
- SrcAddrOffset = uintptr(pc)
|
|
|
+ inst, err := arm64asm.Decode(code[offset : offset+4])
|
|
|
+ if err != nil || jumpOps[inst.Op] {
|
|
|
+ forwardOk = false
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
+ if forwardOk {
|
|
|
+ SrcAddrOffset = uintptr(pc)
|
|
|
+ klog.Infof("[inject] w5 start check ok [after]... SrcAddrOffset:%d", SrcAddrOffset)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -229,12 +269,6 @@ func (j *JvmInjector) findReleaseAddressInfoFromMem() error {
|
|
|
}
|
|
|
klog.Infof("[inject] SrcAddrOffset:", SrcAddrOffset)
|
|
|
|
|
|
- if os.Getenv("jvm_offset") != "" {
|
|
|
- if off, err := strconv.Atoi(os.Getenv("jvm_offset")); err == nil {
|
|
|
- SrcAddrOffset = uintptr(off)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
//aaa, _ := strconv.Atoi(os.Getenv("offset"))
|
|
|
//SrcAddrOffset = uintptr(aaa)
|
|
|
if SrcAddrOffset == 0 {
|