Что нового

[Процессы] Инжект dll средствами autoit

LoveEl

Новичок
Сообщения
26
Репутация
0
Уважаемые друзья. Идея в том чтобы средствами autoit заинжектить dll (speedhack) от программы cheat engine, шарил по форуму и в курсе что проблема была поднята много раз, но ее так толком никто и не решил. Был один парень, вот его тема http://autoit-script.ru/index.php?topic=13158.0 он вроде бы решил проблему, но готового решения не выложил засранец )) Так вот, рывшись по забугорному форуму нашел вот такой вот код (слегка допилил) и он вроде как инжектит dll
Код:
_InjectDll(WinGetHandle("odpskfopdkpfkopdsf"),"speedhack.dll")
If @error Then MsgBox(16,"Error",@error)

Func _InjectDll($hWnd, $dllpath)
    ;make sure the user passed valid parameters
    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

    ;open dll that we'll be using
    Local $kernel32 = DllOpen("kernel32.dll")

    ;get the pid from the window provided
    $pid = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd, "int*", 0)
    If IsArray($pid) Then
        $pid = $pid[2]
    Else
        SetError(-3)
        Return False
    EndIf

    ;open the process for writing
    $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
            ;debug
            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_ptr", 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

(код довольно древний, может быть уже есть более легкие способы инжекта?! хз)

но проблема в том что dll еще нужно настроить под определенную скорость (в CE скорость, после инжекта настраивается в интерфейсе программы, и насколько я понимаю сама программа оперирует с dll) Мне же нужно как-то в dll выставить фиксированную скорость спида. Хочу воспользоваться идеей того паренька, задать заранее скорость и скомпилировать dll. нашел на офф сайте исходник dll спидхака, но нихрена не шарю где там подредактировать код чтобы заранее задать скорость спида.
вот офф gihub CE https://github.com/cheat-engine/cheat-engine/
люди добрые помогите разобраться где там лежит этот спидхак (там множество исходников с именем спидхак) и какой нужно подредактить чтобы заново скомпилировать dll. Жду вашей помощи.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
LoveEl
В предоставленной вами теме есть все ответы, а именно: InitializeSpeedhack.

По аналогии с вашим нахождением LoadLibraryA в целевом процессе поступаем также с speedhack.dll:InitializeSpeedhack (после инжекта естественно), далее еще один вызов CreateRemoteThread, но уже на InitializeSpeedhack (прототип подходит, функция принимает 1 параметр).

P.S. Подмечу, что у вас код некорректно ищет LoadLibraryA. Вместо топорной надежды на то, что модуль в другом процессе загружен по аналогичной текущему базе, нужно ее найти самому и высчитать указатель на функцию.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
LoveEl
Вы анализировали предоставленный вами код?

Вот пример правильного получения LoadLibraryA в другом процессе:
Код:
#Include <WinAPIEx.au3>

Local $hProcess, $tMod_Kernel32, $hKernel32, $pLoadLibraryA, $rvaLoadLibraryA
; ---
$hKernel32 = _WinAPI_GetModuleHandle('kernel32.dll') ; Указатель на kernel32.dll в текущем процессе
$pLoadLibraryA = _WinAPI_GetProcAddress($hKernel32, 'LoadLibraryA') ; Указатель на LoadLibraryA в текущем процессе
$rvaLoadLibraryA = $pLoadLibraryA - $hKernel32 ; Смещение (RVA) LoadLibraryA в kernel32.dll

$hProcess = _WinAPI_OpenProcess(0x1F0FFF, 0, ProcessExists('opera.exe'))
$tMod_Kernel32 = _GetModuleInfo($hProcess, 'kernel32.dll') ; Получаем информацию о kernel32.dll в целевом процессе

; Указатель на LoadLibraryA в целевом процессе
ConsoleWrite('LoadLibraryA ' & ($tMod_Kernel32.BaseOfDll + $rvaLoadLibraryA) & @CRLF)


Func _GetModuleInfo($hProc, $sName)
	Local $tMods, $aRes, $pMod
	; ---
	$tMods = DllStructCreate("ptr[1024]")
	$tMODULEINFO = DllStructCreate("ptr BaseOfDll; dword SizeOfImage; ptr EntryPoint;")

	$aRes = DllCall("psapi.dll", "int", "EnumProcessModules", _
		"ptr", $hProc, _
		"ptr", DllStructGetPtr($tMods), _
		"dword", DllStructGetSize($tMods), _
		"dword*", 0 _
		)
	If Not @Error And $aRes[4] Then
		For $Mod = 1 To ($aRes[4] / (@AutoItX64 ? 8 : 4)) Step 1
			$pMod = DllStructGetData($tMods, 1, $Mod)

			$aRes = DllCall("psapi.dll", "dword", "GetModuleBaseNameW", _
				"ptr", $hProc, _
				"ptr", $pMod, _
				"wstr", "", _
				"dword", 260 _ ; MAX_PATH
				)
			If Not @Error And $aRes[3] = $sName Then
				$aRes = DllCall("psapi.dll", "bool", "GetModuleInformation", _
					"ptr", $hProc, _
					"ptr", $pMod, _
					"struct*", $tMODULEINFO, _
					"dword", DllStructGetSize($tMODULEINFO) _
					)

				Return $tMODULEINFO
			EndIf
		Next
	EndIf
	;
	Return 0
EndFunc


Аналогично поступите с speedhack.dll:InitializeSpeedhack, а затем по аналогии с вашим кодом вызовите ее через CreateRemoteThread.
 

filautdinov

Знающий
Сообщения
96
Репутация
9
Порывшись у себя на компе нашел то что тебя интересует из указанной темы когда то сохранял, в вложении dll-ка и Inject.au3 скорсть не помню на сколь или уменьшает или увеличивает, сорец длл-ки наверно уже не найду.
Код:
#include <Inject.au3>
_InjectModule($sPid, @ScriptDir & "\test.dll")
 

Вложения

  • Inject.zip
    197.2 КБ · Просмотры: 32
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
filautdinov сказал(а):
Порывшись у себя на компе нашел то что тебя интересует из указанной темы когда то сохранял, в вложении dll-ка и Inject.au3 скорсть не помню на сколь или уменьшает или увеличивает, сорец длл-ки наверно уже не найду.
Код:
#include <Inject.au3>
_InjectModule($sPid, @ScriptDir & "\test.dll")
Спасибо вам, этот вариант как раз то что нужно. Вот только сама dll'ка в данном случае замедляет.. Нельзя ли декомпилировать её?! Или, если возможно, поищите сурс плиз.
firex
Вам также спасибо за помощь.
 

filautdinov

Знающий
Сообщения
96
Репутация
9
декомпилить не получится да и тут подобное запрещено обсуждать посмотрю сурцы они есть на офф сайте просто нужно вырезать нужный функционал


Добавлено:
Сообщение автоматически объединено:

Сорец в вложении
 

Вложения

  • speedhack.zip
    17 КБ · Просмотры: 25
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
filautdinov сказал(а):
декомпилить не получится да и тут подобное запрещено обсуждать посмотрю сурцы они есть на офф сайте просто нужно вырезать нужный функционал


Добавлено:
Сообщение автоматически объединено:

Сорец в вложении



да да, именно этот сурс я и имел ввиду в шапке темы, спасибо. Только вот, знать бы еще что там именно нужно подредактить..
 

Raziel

Новичок
Сообщения
1
Репутация
0
А есть более понятный ответ для чайников которые используют данную программу только для браузерныых игр ?Я вообще не слова не понял.
 
Верх