|
Немогу сделать инжект - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
04.06.2013, 13:34
|
#1
|
|
|
|
Разведчик
|
Регистрация: 11.06.2010
Сообщений: 3
Популярность: 1189
Сказал(а) спасибо: 0
Поблагодарили 5 раз(а) в 1 сообщении
|
Немогу сделать инжект
Пробовал пример на дельфи, адреса все заменил на актуальные, да и вообще пробовал инжектить свою функцию, ничего не работает.
Дельфи
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Edit1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
PParams = ^TParams;
TParams = packed record
WID: DWord;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer;
aParamsSize: DWord);
var
hThread: THandle;
lpNumberOfBytes: DWord;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Выделяем место в памяти процесса, и записываем туда нашу функцию
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);
// ---- подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end
end;
procedure TargetCall(aPParams:PParams);Stdcall; //StdCall - обязательно, указывает что аргументы попадают в стек в обратном (стандартном) порядке
var //
P1: DWord; //
begin //
P1:=aPParams^.WID; //
asm
MOV EDI, P1 // Вносим WID моба в регистр EDI
MOV EBX, $005889B0 // Вносим в свободный регистр адрес функции
MOV EAX,DWORD PTR DS:[$526FD4] //
PUSH EDI // ; /Arg1
MOV ECX,DWORD PTR DS:[EAX+$20] // ; |
ADD ECX,$0EC // ; |
CALL EBX // ; \elementc.00606A70
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aParams: TParams;
PID, hProcess: DWord;
begin
GetWindowThreadProcessId( FindWindow('ElementClient Window', nil), @PID);
hProcess:= OpenProcess(PROCESS_ALL_ACCESS, False, PID);
aParams.WID:= StrToInt('$' + Edit1.Text); // WID персонажа\моба\NPC
InjectFunc(hProcess, @TargetCall, @aParams, SizeOf(aParams ) ); // инжектим функцию
CloseHandle( hProcess); // закрываем хендл процесса
end;
procedure TForm1.Edit1Click(Sender: TObject);
begin
Edit1.SelectAll;
end;
end.
Так как мой основной язык это autoit, я решил детально изучить рабочую функцию инжекта в СС. Переписал её, но ничего не инжектится, в памяти инжекты видны, я подозреваю что как-то не так работает CreateRemoteThread.
Autoit
Код:
$PID = ProcessExists("elementclient.exe")
$open = DllCall("Kernel32.dll", "int", "OpenProcess", "int", 0x1F0FFF, "int", 1, "int", $PID)
$code = "56 6A 02 E8 C8 C4 14 00 8B F0 83 C4 04 85 F6 74 1E 66 C7 06 55 00 A1 D4 6F 92 00 6A 02 56 8B 48 20 E8 4A 0F FE FF 56 E8 B4 C4 14 00 83 C4 04 5E C3"
$codestr = DllStructCreate("byte[" & StringLen($code) / 2 & "]")
For $i = 1 To DllStructGetSize($codestr)
DllStructSetData($codestr, 1, Dec(StringMid($code, ($i - 1) * 2 + 1, 2)), $i)
Next
$call = DllCall("Kernel32.dll", "ptr", "VirtualAllocEx", "HANDLE", $open[0], "ptr", 0, "ULONG_PTR", DllStructGetSize($codestr), "DWORD", 0x00001000, "DWORD", 0x40)
$error = DllCall("Kernel32.dll", "DWORD", "GetLastError")
MsgBox(0, '', $call[0] & @CRLF & $error[0])
$call1 = DllCall("Kernel32.dll", "bool", "WriteProcessMemory", "HANDLE", $open[0], "ptr", $call[0], "int", DllStructGetPtr($codestr), "int", DllStructGetSize($codestr), "int", 0)
$error = DllCall("Kernel32.dll", "DWORD", "GetLastError")
MsgBox(0, '', $call1[0] & @CRLF & $error[0])
$call1 = DllCall("Kernel32.dll", "int", "CreateRemoteThread", "HANDLE", $open[0], "int", 0, "ULONG_PTR", DllStructGetSize($codestr), "int", $call[0], "ptr", DllStructGetPtr($codestr), "DWORD", 0, "DWORD_PTR", 0)
$error = DllCall("Kernel32.dll", "DWORD", "GetLastError")
MsgBox(0, '', $call1[0] & @CRLF & $error[0])
Здесь инжектится функция смены брони на стиль и обратно.
Я еще думал что когда игра не вылетала после инжекта, то это пакет был опкод был неверный.
Вообщем, как сделать чтобы работало?)
|
|
|
05.06.2013, 00:36
|
#2
|
|
|
|
Разведчик
|
Регистрация: 23.06.2012
Сообщений: 43
Популярность: 427
Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Немогу сделать инжект
|
|
|
05.06.2013, 15:05
|
#3
|
|
|
|
Рыцарь
|
Регистрация: 19.11.2008
Сообщений: 385
Популярность: 13343
Сказал(а) спасибо: 124
Поблагодарили 217 раз(а) в 109 сообщениях
|
Re: Немогу сделать инжект
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 00:41.
|
|