มีปัญหาเกี่ยวกับการ อ่านค่า เขียนค่าแบบ (Multilevel Pointer) ครับ
พอดีได้ ลองทดสอบ หาค่า pointer แบบ Multilevel ของเกม PlantsVsZombie มา
พอ ผมหาได้แล้ว ก็เอามาเขียน สคริป ตามบทความ เขียนบอทเกมด้วย AutoIt : Bot 6 การอ่านเขียน Memory ในเกม
ในแบบที่ 3 และปัญหาก็คือ สคริป มันอ่านค่า Pointer ออก มาเป้น 0 ชะงั้น
ปล* ได้ โหลด NomadMemoryPSsix.au3 สำหรับ เวอร์ชัน 3.3.8.1 ไปแล้ว ทดสอบกับ Pointer ชั้นเดียวได้ไม่มีปัญหา
แต่ พอ ลอง แบบ Multi pointer แล้ว มีปัญหา เฉยเลย ช่วยหน่อยนะ ครับ ^_^
ตามรูปที่ เอามาประกอบ คำอธิบาย
#RequireAdmin
#include <NomadMemoryPSsix.au3>
Global $StaticOffset = "0x2A9EC0" ; ค่าออฟเซ็ตคงที่ ; popcapgame1.exe+2A9EC0
Global $Offset[3]
$Offset[0] = 0 ; ใส่ 0 เป็นค่าเริ่มต้นทุกครั้ง ห้ามเปลี่ยน
$Offset[1] = 0x768 ; ค่าออฟเซ็ตในตำแหน่งล่าง สุด
$Offset[2] = 0x5560 ; ค่าออฟเซ็ตในตำแหน่งบน สุด
$memopen = _MEMORYOPEN(ProcessExists("popcapgame1.exe")) ; เปลี่ยนชื่อไฟล์เกม
If $memopen = 0 Then
ConsoleWrite('ผิดพลาดไม่มีโปรแกรม =' & $memopen & @CRLF)
Exit
EndIf
$BaseAddr = _MemoryGetBaseAddress($memopen, 1) ; หา BaseAddresse
$FinalAddr = $BaseAddr + $StaticOffset
; 3 อ่านค่า address แบบ Multilevel Pointer
$value = _MemoryPointerRead($FinalAddr, $memopen, $Offset) ; อ่านค่าจากพ้อยเตอร์จะเก็บไว้ในตัวแปร $value[1]
ConsoleWrite('ค่าที่อ่านได้จากแอดเดรส ' & $value[0] & ' = ' & $value[1] & @CRLF)
_MEMORYCLOSE($memopen) ;ปิดการอ่านหน่วยความจำ นำไปวางไว้ท้ายสุดเมื่อไม่ต้องการอ่านหรือเขียนแล้ว เช่น ตอนปิดโปรแกรม
พอดีได้ ลองทดสอบ หาค่า pointer แบบ Multilevel ของเกม PlantsVsZombie มา
พอ ผมหาได้แล้ว ก็เอามาเขียน สคริป ตามบทความ เขียนบอทเกมด้วย AutoIt : Bot 6 การอ่านเขียน Memory ในเกม
ในแบบที่ 3 และปัญหาก็คือ สคริป มันอ่านค่า Pointer ออก มาเป้น 0 ชะงั้น
ปล* ได้ โหลด NomadMemoryPSsix.au3 สำหรับ เวอร์ชัน 3.3.8.1 ไปแล้ว ทดสอบกับ Pointer ชั้นเดียวได้ไม่มีปัญหา
แต่ พอ ลอง แบบ Multi pointer แล้ว มีปัญหา เฉยเลย ช่วยหน่อยนะ ครับ ^_^
ตามรูปที่ เอามาประกอบ คำอธิบาย
#RequireAdmin
#include <NomadMemoryPSsix.au3>
Global $StaticOffset = "0x2A9EC0" ; ค่าออฟเซ็ตคงที่ ; popcapgame1.exe+2A9EC0
Global $Offset[3]
$Offset[0] = 0 ; ใส่ 0 เป็นค่าเริ่มต้นทุกครั้ง ห้ามเปลี่ยน
$Offset[1] = 0x768 ; ค่าออฟเซ็ตในตำแหน่งล่าง สุด
$Offset[2] = 0x5560 ; ค่าออฟเซ็ตในตำแหน่งบน สุด
$memopen = _MEMORYOPEN(ProcessExists("popcapgame1.exe")) ; เปลี่ยนชื่อไฟล์เกม
If $memopen = 0 Then
ConsoleWrite('ผิดพลาดไม่มีโปรแกรม =' & $memopen & @CRLF)
Exit
EndIf
$BaseAddr = _MemoryGetBaseAddress($memopen, 1) ; หา BaseAddresse
$FinalAddr = $BaseAddr + $StaticOffset
; 3 อ่านค่า address แบบ Multilevel Pointer
$value = _MemoryPointerRead($FinalAddr, $memopen, $Offset) ; อ่านค่าจากพ้อยเตอร์จะเก็บไว้ในตัวแปร $value[1]
ConsoleWrite('ค่าที่อ่านได้จากแอดเดรส ' & $value[0] & ' = ' & $value[1] & @CRLF)
_MEMORYCLOSE($memopen) ;ปิดการอ่านหน่วยความจำ นำไปวางไว้ท้ายสุดเมื่อไม่ต้องการอ่านหรือเขียนแล้ว เช่น ตอนปิดโปรแกรม