#RequireAdmin
#Region _Memory
Const $TOKEN_ADJUST_PRIVILEGES = 32
Const $TOKEN_QUERY = 8
Func _MEMORYOPEN($IV_PID, $IV_DESIREDACCESS = 2035711, $IV_INHERITHANDLE = 1)
If Not ProcessExists($IV_PID) Then
SetError(1)
Return 0
EndIf
Local $AH_HANDLE[2] = [DllOpen("kernel32.dll")]
If @error Then
SetError(2)
Return 0
EndIf
Local $AV_OPENPROCESS = DllCall($AH_HANDLE[0], "int", "OpenProcess", "int", $IV_DESIREDACCESS, "int", $IV_INHERITHANDLE, "int", $IV_PID)
If @error Then
DllClose($AH_HANDLE[0])
SetError(3)
Return 0
EndIf
$AH_HANDLE[1] = $AV_OPENPROCESS[0]
Return $AH_HANDLE
EndFunc
Func _MEMORYREAD($IV_ADDRESS, $AH_HANDLE, $SV_TYPE = "dword")
If Not IsArray($AH_HANDLE) Then
SetError(1)
Return 0
EndIf
Local $V_BUFFER = DllStructCreate($SV_TYPE)
If @error Then
SetError(@error + 1)
Return 0
EndIf
DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
If Not @error Then
Local $V_VALUE = DllStructGetData($V_BUFFER, 1)
Return $V_VALUE
Else
SetError(6)
Return 0
EndIf
EndFunc
Func _MEMORYWRITE($IV_ADDRESS, $AH_HANDLE, $V_DATA, $SV_TYPE = "dword")
If Not IsArray($AH_HANDLE) Then
SetError(1)
Return 0
EndIf
Local $V_BUFFER = DllStructCreate($SV_TYPE)
If @error Then
SetError(@error + 1)
Return 0
Else
DllStructSetData($V_BUFFER, 1, $V_DATA)
If @error Then
SetError(6)
Return 0
EndIf
EndIf
DllCall($AH_HANDLE[0], "int", "WriteProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
If Not @error Then
Return 1
Else
SetError(7)
Return 0
EndIf
EndFunc
Func _MEMORYCLOSE($AH_HANDLE)
If Not IsArray($AH_HANDLE) Then
SetError(1)
Return 0
EndIf
DllCall($AH_HANDLE[0], "int", "CloseHandle", "int", $AH_HANDLE[1])
If Not @error Then
DllClose($AH_HANDLE[0])
Return 1
Else
DllClose($AH_HANDLE[0])
SetError(2)
Return 0
EndIf
EndFunc
Func SETPRIVILEGE($PRIVILEGE, $BENABLE)
Const $MY_TOKEN_ADJUST_PRIVILEGES = 32
Const $MY_TOKEN_QUERY = 8
Const $MY_SE_PRIVILEGE_ENABLED = 2
Local $HTOKEN, $SP_AUXRET, $SP_RET, $HCURRPROCESS, $NTOKENS, $NTOKENINDEX, $PRIV
$NTOKENS = 1
$LUID = DllStructCreate("dword;int")
If IsArray($PRIVILEGE) Then $NTOKENS = UBound($PRIVILEGE)
$TOKEN_PRIVILEGES = DllStructCreate("dword;dword[" & (3 * $NTOKENS) & "]")
$NEWTOKEN_PRIVILEGES = DllStructCreate("dword;dword[" & (3 * $NTOKENS) & "]")
$HCURRPROCESS = DllCall("kernel32.dll", "hwnd", "GetCurrentProcess")
$SP_AUXRET = DllCall("advapi32.dll", "int", "OpenProcessToken", "hwnd", $HCURRPROCESS[0], "int", BitOR($MY_TOKEN_ADJUST_PRIVILEGES, $MY_TOKEN_QUERY), "int*", 0)
If $SP_AUXRET[0] Then
$HTOKEN = $SP_AUXRET[3]
DllStructSetData($TOKEN_PRIVILEGES, 1, 1)
$NTOKENINDEX = 1
While $NTOKENINDEX <= $NTOKENS
If IsArray($PRIVILEGE) Then
$PRIV = $PRIVILEGE[$NTOKENINDEX - 1]
Else
$PRIV = $PRIVILEGE
EndIf
$RET = DllCall("advapi32.dll", "int", "LookupPrivilegeValue", "str", "", "str", $PRIV, "ptr", DllStructGetPtr($LUID))
If $RET[0] Then
If $BENABLE Then
DllStructSetData($TOKEN_PRIVILEGES, 2, $MY_SE_PRIVILEGE_ENABLED, (3 * $NTOKENINDEX))
Else
DllStructSetData($TOKEN_PRIVILEGES, 2, 0, (3 * $NTOKENINDEX))
EndIf
DllStructSetData($TOKEN_PRIVILEGES, 2, DllStructGetData($LUID, 1), (3 * ($NTOKENINDEX - 1)) + 1)
DllStructSetData($TOKEN_PRIVILEGES, 2, DllStructGetData($LUID, 2), (3 * ($NTOKENINDEX - 1)) + 2)
DllStructSetData($LUID, 1, 0)
DllStructSetData($LUID, 2, 0)
EndIf
$NTOKENINDEX += 1
WEnd
$RET = DllCall("advapi32.dll", "int", "AdjustTokenPrivileges", "hwnd", $HTOKEN, "int", 0, "ptr", DllStructGetPtr($TOKEN_PRIVILEGES), "int", DllStructGetSize($NEWTOKEN_PRIVILEGES), "ptr", DllStructGetPtr($NEWTOKEN_PRIVILEGES), "int*", 0)
$F = DllCall("kernel32.dll", "int", "GetLastError")
EndIf
$NEWTOKEN_PRIVILEGES = 0
$TOKEN_PRIVILEGES = 0
$LUID = 0
If $SP_AUXRET[0] = 0 Then Return 0
$SP_AUXRET = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $HTOKEN)
If Not $RET[0] And Not $SP_AUXRET[0] Then Return 0
Return $RET[0]
EndFunc
#EndRegion _Memory
SETPRIVILEGE("SeDebugPrivilege", 1)
HotKeySet("{F6}", "_Start")
HotKeySet("{F7}", "_Pause")
HotKeySet("{F8}", "_Ende")
HotKeySet("{F9}", "_DE")
HotKeySet("{F10}", "_PServer")
Global $A, $OPEN, $POINTER, $READPOINTER, $ADRESSE, $READPOINTER2, $ADRESSE72, $ADRESSE82, $ADRESSE92, $ADRESSE102
$A = WinGetProcess("METIN2")
$OPEN = _MEMORYOPEN(ProcessExists($A))
$POINTER = 6236604
$READPOINTER = _MEMORYREAD($POINTER, $OPEN, "dword")
$ADRESSE = "0x" & Hex($READPOINTER + 8)
$READPOINTER2 = _MEMORYREAD($ADRESSE, $OPEN, "dword")
$ADRESSE72 = "0x" & Hex($READPOINTER2 + 1412)
$ADRESSE82 = "0x" & Hex($READPOINTER2 + 1416)
$ADRESSE92 = "0x" & Hex($READPOINTER2 + 1600)
$ADRESSE102 = "0x" & Hex($READPOINTER2 + 1604)
While 1
Sleep(100)
WEnd
Func _START()
While 1
If $A = -1 Then
While $A = -1
$MSGBOX = MsgBox(1, "TeleportTool by Frezee", "Es ist kein Metin2 Fenster aktiv!" & @CR & "Drücke OK, sobald ein Metin2 Fenster aktiv ist.")
If $MSGBOX = 2 Then
Exit
EndIf
If $MSGBOX = 1 And Not $A = -1 Then
HAUPT()
EndIf
WEnd
Else
HAUPT()
EndIf
WEnd
EndFunc
Func _PAUSE()
While 1
Sleep(100)
WEnd
EndFunc
Func HAUPT()
While $A <> -1
$A = WinGetProcess("METIN2")
$OPEN = _MEMORYOPEN(ProcessExists($A))
$READ7 = _MEMORYREAD($ADRESSE72, $OPEN, "float")
$READ8 = _MEMORYREAD($ADRESSE82, $OPEN, "float")
$READ9 = _MEMORYREAD($ADRESSE92, $OPEN, "float")
$READ10 = _MEMORYREAD($ADRESSE102, $OPEN, "float")
If $READ7 <> $READ9 And $READ9 <> "0" Then
_MEMORYWRITE($ADRESSE72, $OPEN, $READ9, "float")
EndIf
If $READ8 <> $READ10 And $READ10 <> "0" Then
_MEMORYWRITE($ADRESSE82, $OPEN, -1 * $READ10, "float")
EndIf
WEnd
EndFunc
Func _ENDE()
Exit
EndFunc
Func _DE()
$POINTER = 6236604
$READPOINTER = _MEMORYREAD($POINTER, $OPEN, "dword")
$ADRESSE = "0x" & Hex($READPOINTER + 8)
$READPOINTER2 = _MEMORYREAD($ADRESSE, $OPEN, "dword")
$ADRESSE72 = "0x" & Hex($READPOINTER2 + 1412)
$ADRESSE82 = "0x" & Hex($READPOINTER2 + 1416)
$ADRESSE92 = "0x" & Hex($READPOINTER2 + 1600)
$ADRESSE102 = "0x" & Hex($READPOINTER2 + 1604)
MsgBox(0, "", "Server: Metin2 DE")
EndFunc
Func _PSERVER()
$POINTER = 6223612
$READPOINTER = _MEMORYREAD($POINTER, $OPEN, "dword")
$ADRESSE = "0x" & Hex($READPOINTER + 8)
$READPOINTER2 = _MEMORYREAD($ADRESSE, $OPEN, "dword")
$ADRESSE72 = "0x" & Hex($READPOINTER2 + 1408)
$ADRESSE82 = "0x" & Hex($READPOINTER2 + 1412)
$ADRESSE92 = "0x" & Hex($READPOINTER2 + 1596)
$ADRESSE102 = "0x" & Hex($READPOINTER2 + 1600)
MsgBox(0, "", "Server: DE PServer .exe")
EndFunc