anonymous7
Знающий
- Сообщения
- 40
- Репутация
- 8
Доброго времени! Помогите пожалуйсто переделать данную функция на AutoIt
Взято из вот этой статьи http://zhyk.ru/forum/showthread.php?t=207760
Для начала нам потребуется инжектор (© BuBucekTop):
Код:
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;
Таким образом мы создаем свой поток в памяти выделенной клиенту (тоесть по сути вставить в клиент свой код)
И тип данных:
Код:
type
PParams = ^TParams;
TParams = packed record
WID: DWord;
end;
Теперь подготовим код, который и будет кодом нашего потока.
И который будет вызывать функцию клиента.
По сути повторям код клиента (добавив передачу параметров и прочую обвязку):
Код:
004619CD |. A1 0CB9A500 MOV EAX,DWORD PTR DS:[A5B90C]
004619D2 |. 57 PUSH EDI ; /Arg1
004619D3 |. 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20] ; |
004619D6 |. 81C1 EC000000 ADD ECX,0EC ; |
004619DC |. E8 8F501A00 CALL elementc.00606A70 ; \elementc.00606A70
на выбранном нами языке программирования (в моем случае - Delphi)
Код:
procedure TargetCall(aPParamsParams);Stdcall; //StdCall - обязательно, указывает что аргументы попадают в стек в обратном (стандартном) порядке
var //
P1: DWord; //
begin //
P1:=aPParams^.WID; //
asm
MOV EDI, P1 // Вносим WID моба в регистр EDI
MOV EBX, $00606A70 // Вносим в свободный регистр адрес функции
MOV EAX,DWORD PTR DS:[$A5B90C] //
PUSH EDI // ; /Arg1
MOV ECX,DWORD PTR DS:[EAX+$20] // ; |
ADD ECX,$0EC // ; |
CALL EBX // ; \elementc.00606A70
end;
end;
Кидаем на форму кнопку, в обработчике OnClick пишем
Код:
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 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;
Таким образом мы создаем свой поток в памяти выделенной клиенту (тоесть по сути вставить в клиент свой код)
И тип данных:
Код:
type
PParams = ^TParams;
TParams = packed record
WID: DWord;
end;
Теперь подготовим код, который и будет кодом нашего потока.
И который будет вызывать функцию клиента.
По сути повторям код клиента (добавив передачу параметров и прочую обвязку):
Код:
004619CD |. A1 0CB9A500 MOV EAX,DWORD PTR DS:[A5B90C]
004619D2 |. 57 PUSH EDI ; /Arg1
004619D3 |. 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20] ; |
004619D6 |. 81C1 EC000000 ADD ECX,0EC ; |
004619DC |. E8 8F501A00 CALL elementc.00606A70 ; \elementc.00606A70
на выбранном нами языке программирования (в моем случае - Delphi)
Код:
procedure TargetCall(aPParamsParams);Stdcall; //StdCall - обязательно, указывает что аргументы попадают в стек в обратном (стандартном) порядке
var //
P1: DWord; //
begin //
P1:=aPParams^.WID; //
asm
MOV EDI, P1 // Вносим WID моба в регистр EDI
MOV EBX, $00606A70 // Вносим в свободный регистр адрес функции
MOV EAX,DWORD PTR DS:[$A5B90C] //
PUSH EDI // ; /Arg1
MOV ECX,DWORD PTR DS:[EAX+$20] // ; |
ADD ECX,$0EC // ; |
CALL EBX // ; \elementc.00606A70
end;
end;
Кидаем на форму кнопку, в обработчике OnClick пишем
Код:
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;
Вот это главная проверка, если инжект прошел - значит все верно.
Если инжект не прошел - значит все плохо.
Пример программы - в аттаче.