Code:
;If Not @Compiled Then Exit $hwnd = WinGetHandle("Guild Wars") Global Const $dllpath = @ScriptDir & "\data\Hook.dll" Global Const $dllname = "Hook.dll" If Not FileExists($dllpath) Then MsgBox(0x10, "Error", $dllpath & " Not found!") Exit EndIf $hMod = GetModule($hwnd, $dllname) If $hMod = 0 Then $iDLL = InjectModule($hwnd, $dllpath) If Not @error Then TrayTip("", "Injection Successfull", 1) Else MsgBox(0x10, "Error in DLL Injection", "Couldn't inject dll to " & $hwnd & @CRLF & "Code: " & @error) EndIf Else TrayTip("", $dllname & " was already Injected: " & $hMod, 1) EndIf Func GetModule($hWnd, $ModuleName) Local Const $MODULEENTRY32Struct = DllStructCreate("dword dwsize;" & _ "dword th32ModuleID;" & _ "dword th32ProcessId;" & _ "dword GlblcntUsage;" & _ "dword ProccntUsage;" & _ "dword modBaseAddr;" & _ "dword modBaseSize;" & _ "dword hModule;" & _ "char szModule[256];" & _ "char szExePath[260];") Local $SnapShot = DllCall("Kernel32.dll", "hwnd", "CreateToolhelp32Snapshot", "dword", 0x08, "dword", WinGetProcess($hWnd)) DllStructSetData($MODULEENTRY32Struct, "dwsize", DllStructGetSize($MODULEENTRY32Struct)) Local $State = DllCall("Kernel32.dll", "int", "Module32First", "hwnd", $SnapShot[0], "ptr", DllStructGetPtr($MODULEENTRY32Struct)) Do $ReadModule = DllStructGetData($MODULEENTRY32Struct, "szModule") If $ReadModule == $ModuleName Then Return "0x" & (Hex(DllStructGetData($MODULEENTRY32Struct, 'modBaseAddr'))) $State = DllCall("Kernel32.dll", "int", "Module32Next", "hwnd", $SnapShot[0], "ptr", DllStructGetPtr($MODULEENTRY32Struct)) Sleep(1) Until Not $State[0] DllCall("Kernel32.dll", "int", "CloseHandle", "int", $SnapShot[0]) Return 0 EndFunc ;==>GetModule Func InjectModule($hwnd, $dllpath) If IsHWnd($hwnd) = 0 Then SetError(-1) Return False ElseIf StringLen($dllpath) <= 4 Or StringRight($dllpath, 4) <> ".dll" Then SetError(-2) Return False EndIf Local $pid, $pHandle, $pLibRemote, $modHandle, $LoadLibraryA, $hThread Local $kernel32 = DllOpen("kernel32.dll") If $kernel32 = -1 Then Exit EndIf $pid = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hwnd, "int*", 0) If IsArray($pid) Then $pid = $pid[2] Else SetError(-3) Return False EndIf $pHandle = DllCall($kernel32, "int", "OpenProcess", "int", 0x1F0FFF, "int", 0, "int", $pid) If IsArray($pHandle) And $pHandle[0] > 0 Then $pHandle = $pHandle[0] Else SetError(-4) Return False EndIf $pLibRemote = DllCall($kernel32, "int", "VirtualAllocEx", "int", $pHandle, "short", 0, "int", 0x1000, "int", 0x1000, "int", 4) If IsArray($pLibRemote) Then If $pLibRemote[0] > 0 Then ;ConsoleWrite("0x" & Hex($pLibRemote[0], 8) & @CR) $pLibRemote = $pLibRemote[0] Else SetError(-5) Return False EndIf Else SetError(-6) Return False EndIf For $i = 0 To StringLen($dllpath) $ret = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $pHandle, "int", $pLibRemote + $i, "int*", Asc(StringMid($dllpath, $i + 1, 1)), "int", 1, "int", 0) If IsArray($ret) Then If $ret[0] = 0 Then SetError(-7) Return False EndIf Else SetError(-8) Return False EndIf Next $modHandle = DllCall($kernel32, "long", "GetModuleHandle", "str", "kernel32.dll") If IsArray($modHandle) Then If $modHandle[0] > 0 Then $modHandle = $modHandle[0] Else SetError(-9) Return False EndIf Else SetError(-10) Return False EndIf $LoadLibraryA = DllCall($kernel32, "long", "GetProcAddress", "long", $modHandle, "str", "LoadLibraryA") If IsArray($LoadLibraryA) Then If $LoadLibraryA[0] > 0 Then $LoadLibraryA = $LoadLibraryA[0] Else SetError(-11) Return False EndIf Else SetError(-12) Return False EndIf $hThread = DllCall($kernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $LoadLibraryA, "long", $pLibRemote, "int", 0, "int", 0) If IsArray($hThread) Then ;ConsoleWrite($hThread[0] & @CR) If $hThread[0] > 0 Then $hThread = $hThread[0] Else SetError(-13) Return False EndIf Else SetError(-14) Return False EndIf DllCall($kernel32, "int", "VirtualFreeEx", "int", $pHandle, "int", $pLibRemote, "int", 0x1000, "int", 0x8000) DllCall($kernel32, "int", "CloseHandle", "int", $hThread) DllCall($kernel32, "int", "CloseHandle", "int", $pHandle) DllClose($kernel32) Return True EndFunc ;==>_InjectDll