Ver Fonte

Feature #TASK_QT-18250 写 movabs

rock.wu há 9 meses atrás
pai
commit
714233c84e
1 ficheiros alterados com 56 adições e 1 exclusões
  1. 56 1
      ebpftracer/tracer/inject/inject_linux_amd64.go

+ 56 - 1
ebpftracer/tracer/inject/inject_linux_amd64.go

@@ -748,6 +748,35 @@ func modifyIoFdTargetAddr(pid int, insertAddr, distAddr, getTTLFunctionAddr uint
 	if err != nil {
 		return err
 	}
+
+	//以上是先跳转到2GB内存的无用函数中
+	//以下来写真正的跳转函数
+
+	TTLOriginalData, err := readDataBytes(pid, getTTLFunctionAddr, 14)
+	if err != nil {
+		return err
+	}
+
+	TTLOriginalData[offset] = 0x48
+	TTLOriginalData[offset+1] = 0xb8
+	TTLOriginalData[offset+2] = byte(distAddr)
+	TTLOriginalData[offset+3] = byte(distAddr >> 8)
+	TTLOriginalData[offset+4] = byte(distAddr >> 16)
+	TTLOriginalData[offset+5] = byte(distAddr >> 24)
+	TTLOriginalData[offset+6] = byte(distAddr >> 32)
+	TTLOriginalData[offset+7] = byte(distAddr >> 40)
+	TTLOriginalData[offset+8] = byte(distAddr >> 48)
+	TTLOriginalData[offset+9] = byte(distAddr >> 56)
+	TTLOriginalData[offset+10] = 0x48
+	TTLOriginalData[offset+11] = 0x8b
+	TTLOriginalData[offset+12] = 0x10
+	TTLOriginalData[offset+13] = 0xc3
+
+	err = writeDataBytes(pid, getTTLFunctionAddr, TTLOriginalData)
+	if err != nil {
+		return err
+	}
+
 	return nil
 }
 
@@ -775,7 +804,7 @@ func modifyNetSetTargetAddr(pid int, sendDebugAddr, sendReleaseAddr, convert0Fun
 
 	// 读取原始数据 
 	// alignedAddr := insertAddr & ^(uintptr(unsafe.Sizeof(uintptr(0))) - 1)
-	originalData, err := readDataBytes(pid, sendDebugAddr, 7)
+	originalData, err := readDataBytes(pid, sendDebugAddr, 5)
 	if err != nil {
 		return err
 	}
@@ -795,6 +824,32 @@ func modifyNetSetTargetAddr(pid int, sendDebugAddr, sendReleaseAddr, convert0Fun
 	if err != nil {
 		return err
 	}
+
+
+	convert0OriginalData, err := readDataBytes(pid, convert0FunctionAddr, 13)
+	if err != nil {
+		return err
+	}
+
+	convert0OriginalData[offset] = 0x48
+	convert0OriginalData[offset+1] = 0xb8
+	convert0OriginalData[offset+2] = byte(sendReleaseAddr)
+	convert0OriginalData[offset+3] = byte(sendReleaseAddr >> 8)
+	convert0OriginalData[offset+4] = byte(sendReleaseAddr >> 16)
+	convert0OriginalData[offset+5] = byte(sendReleaseAddr >> 24)
+	convert0OriginalData[offset+6] = byte(sendReleaseAddr >> 32)
+	convert0OriginalData[offset+7] = byte(sendReleaseAddr >> 40)
+	convert0OriginalData[offset+8] = byte(sendReleaseAddr >> 48)
+	convert0OriginalData[offset+9] = byte(sendReleaseAddr >> 56)
+	convert0OriginalData[offset+10] = 0xff
+	convert0OriginalData[offset+11] = 0xd0
+	convert0OriginalData[offset+12] = 0xc3
+
+	err = writeDataBytes(pid, convert0FunctionAddr, convert0OriginalData)
+	if err != nil {
+		return err
+	}
+
 	return nil
 }