Răsfoiți Sursa

Feature #TASK_QT-18250 中央国债arm jvm 1.8.442 e2e

Carl 10 luni în urmă
părinte
comite
a0db8233ed
1 a modificat fișierele cu 60 adăugiri și 26 ștergeri
  1. 60 26
      ebpftracer/tracer/inject/inject_linux_arm64.go

+ 60 - 26
ebpftracer/tracer/inject/inject_linux_arm64.go

@@ -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 {