"Поиск инжектов" или "Наш код в чужом процессе" - Разработка ПО для Perfect World - Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World
29.07.2013, 10:29
#61
Разведчик
Регистрация: 26.07.2013
Сообщений: 4
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Dinmaite , Спасибо, смысл понял. Теперь бы разобраться как это засунуть в программу в виде указателя на Базовый адрес. Просто последний раз программировал на Паскале, когда Дельфи ещё не было в природе.
BritishColonist , Спасибо. Как константа идёт. Хотя конечно же хотелось бы на будущее запихивать эти значения в ini-файл.
Sorry, для "Спасибо" ещё не набил постов.
27.09.2013, 19:53
#62
Пехотинец
Регистрация: 13.12.2012
Сообщений: 58
Популярность: 197
Сказал(а) спасибо: 23
Поблагодарили 31 раз(а) в 10 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Народ, подскажите, пожалуйста, где я туплю, пытаясь повторить прмер автора статьи?
Дебаггер
Код:
004778F7 |. A1 6C8BC300 MOV EAX,DWORD PTR DS:[C38B6C]
004778FC |. 52 PUSH EDX
004778FD |. 57 PUSH EDI
004778FE |. 8B48 1C MOV ECX,DWORD PTR DS:[EAX+1C]
00477901 |. 8B41 1C MOV EAX,DWORD PTR DS:[ECX+1C]
00477904 |. 8B48 24 MOV ECX,DWORD PTR DS:[EAX+24]
00477907 |. E8 04342500 CALL elementc.006CAD10
Код
Код:
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, $006CAD10 // Âíîñèì â ñâîáîäíûé ðåãèñòð àäðåñ ôóíêöèè
MOV EDX, $00000000
MOV EAX,DWORD PTR DS:[$C38B6C] //
PUSH EDX
PUSH EDI // ; /Arg1
MOV ECX,DWORD PTR DS:[EAX+$1C]
MOV EAX,DWORD PTR DS:[ECX+$1C]
MOV ECX,DWORD PTR DS:[EAX+$24] // ; |
CALL EBX // ; \elementc.00606A70
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aParams: TParams;
PID, hProcess: DWord;
begin
GetWindowThreadProcessId( FindWindow('Perfect World', 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.
Заранее спасибо)
28.09.2013, 19:34
#63
Пехотинец
Регистрация: 03.02.2013
Сообщений: 60
Популярность: 10
Сказал(а) спасибо: 12
Поблагодарили 25 раз(а) в 12 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Unheilig)) , у меня вот так работает:
Цитата:
procedure TForm1.Button1Click(Sender: TObject);
var
aParams: TParams;
PID, hProcess: DWord;
kWindow:HWND;
begin
kWindow:=FindWindow(nil,PChar('Perfect World'));
GetWindowThreadProcessId(kWindow, @PID);
hProcess:= OpenProcess(PROCESS_ALL_ACCESS, False, PID);
aParams.WID:= StrToInt('$' + Edit1.Text); // WID персонажа\моба\NPC
InjectFunc(hProcess, @TargetCall, @aParams, SizeOf(aParams ) ); // инжектим функцию
CloseHandle( hProcess); // закрываем хендл процесса
end;
и кусок asm кода:
Цитата:
MOV EDI, P1
MOV EBX, $006E8060
MOV EAX,DWORD PTR DS: [$C38B6C]
PUSH EDI
MOV ECX,DWORD PTR DS: [EAX+$20]
ADD ECX, $0F4
CALL EBX
Ты скорее всего неверно нашел функцию.
Если понадобится, написал мини-утилитку для определения ID Моба/NPC.
World ID
Последний раз редактировалось sedrik1992; 29.09.2013 в 01:32 .
29.09.2013, 06:35
#64
Пехотинец
Регистрация: 13.12.2012
Сообщений: 58
Популярность: 197
Сказал(а) спасибо: 23
Поблагодарили 31 раз(а) в 10 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
так светофорит и все
29.09.2013, 14:39
#65
Пехотинец
Регистрация: 03.02.2013
Сообщений: 60
Популярность: 10
Сказал(а) спасибо: 12
Поблагодарили 25 раз(а) в 12 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Пользователь сказал cпасибо:
30.09.2013, 05:21
#66
Пехотинец
Регистрация: 13.12.2012
Сообщений: 58
Популярность: 197
Сказал(а) спасибо: 23
Поблагодарили 31 раз(а) в 10 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Спасибо, оказалось я просто не ту функцию нашел) похожую, но не ту)
08.07.2014, 15:51
#67
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Возник вопрос: возможно ли найти нужный инжект в x64 винде, используя OD и CE?
В CE при любом раскладе получаю адрес 0089DFAC, а дальше тупик
[Ссылки могут видеть только зарегистрированные пользователи. ] . Сор если что не так, пробую искать инжекты впервые.
08.07.2014, 16:25
#68
Пехотинец
Регистрация: 04.12.2013
Сообщений: 66
Популярность: 228
Сказал(а) спасибо: 36
Поблагодарили 43 раз(а) в 24 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
89DFAC - это базовый адрес в EXE-шнике. При запуске, в памяти к нему добавляется 0x400000 И получается уже С9DFAC.
А что, собственно, пытался найти?
У меня по алгоритму из первого поста этой темы ничего найти не получается, т.к. игра тупо виснет при попытке отловить все доступы к базовому адресу.
Сейчас пошёл с другого конца - искал всё, что пишет в ячейку текущего таргета в структуре персонажа. Сразу же вышел на искомую функцию взятия в таргет (730FD0)...
И, вроде бы, разрядность винды на поиск никак не влияет. Я и на 64х и на 32х находил что-то. Олькой почти не пользуюсь. Всё, что нужно, пока удаётся сделать через СЕ-шку...
Последний раз редактировалось iGesha; 08.07.2014 в 16:30 .
08.07.2014, 17:33
#69
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Искал инжект на скил.
08.07.2014, 21:52
#70
Пехотинец
Регистрация: 03.02.2013
Сообщений: 60
Популярность: 10
Сказал(а) спасибо: 12
Поблагодарили 25 раз(а) в 12 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Под эту версию руофа:
~Target~
Код:
MOV ESI, P1 // Вносим WID моба в регистр EDI
MOV EBX, $730FD0 // Вносим в свободный регистр адрес функции
MOV EAX,DWORD PTR DS:[$C9DFAC] //
PUSH ESI // ; /Arg1
MOV ECX,DWORD PTR DS:[EAX+$20] // ; |
ADD ECX,$0F4 // ; |
CALL EBX // ; \elementc.00730FD0
27.07.2014, 06:29
#71
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Вроде нашел нужную функцию SkillCall:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Но возникли вопросы насчет последней строки.
CALL DWORD PTR DS:[<&ElementSkill.?IsGoblinSkill@ElementSkill@GNET@@S A_NI@Z>]
Что это за адрес такой? Как реализовать в дельфиях?
Добавлено через 19 минут
Есть подозрение, что теперь этот адрес зависит от класса персонажа( и берется откуда-то.
Последний раз редактировалось bestbeer; 27.07.2014 в 06:48 .
Причина: Добавлено сообщение
01.08.2014, 02:35
#72
Разведчик
Регистрация: 06.10.2013
Сообщений: 27
Популярность: 10
Сказал(а) спасибо: 24
Поблагодарили 12 раз(а) в 8 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Таки сумел разобраться.
Инжект на скил(как будто жмем на панели) под текущий руоф.
Код:
CallAddress:=Pointer($0047CBF0);
P1:=aPParams^.Param1;//DWord скил
Po1:=Pointer(P1);//pointer
asm
pushad
MOV ECX,DWORD PTR DS:[$0C9DFAC]
MOV EDX,DWORD PTR DS:[ECX+$1C]
MOV ESI,DWORD PTR DS:[EDX+$30]
push -1 // -1
push 0
push 0
mov ecx,Po1 // указатель на скил
push ecx
mov ecx,esi
CALL CallAddress
popad
end;
20.08.2014, 11:44
#73
Разведчик
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
del
Последний раз редактировалось scitelz; 21.08.2014 в 19:34 .
17.01.2015, 20:25
#74
Разведчик
Регистрация: 11.05.2014
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Пробую по примеру составить инжект таргета, нашел в Olly следующее ставил брейкпойнт на строке PUSH EDI:
[
Ссылки могут видеть только зарегистрированные пользователи. ]
0048BD75 A1 ACEFCC00 MOV EAX,DWORD PTR DS:[CCEFAC]
0048BD7A 57 PUSH EDI
0048BD7B 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20]
0048BD7E 81C1 F4000000 ADD ECX,0F4
0048BD84 E8 47AE2B00 CALL elementc.00746BD0
составил инжект:
Код:
MOV EDI 0x80108594; // вносим WID моба в регистр EDI (переменная)
MOV EBX, 0x00746bd0
MOV EAX,DWORD PTR DS:[0xCCEFAC]
PUSH EDI
MOV ECX,DWORD PTR DS:[EAX+0x20]
ADD ECX,0F4
CALL EBX
RETN
На основе него сделал сгенерировал код через Olly:
Код:
BF 11 11 11 11 BB D0 6B 74 00 A1 22 22 22 22 57 8B 48 20 81 C1 F4 00 00 00 FF D3 C3
сформировал из него массив:
Код:
char code[29] = "\xBF\x94\x85\x10\x80\xBB\xD0\x6B\x74\x00\xA1\xAC\xEF\xCC\x00\x57\x8B\x48\x20\x81\xC1\xF4\x00\x00\x00\xFF\xD3\xC3";
но при попытке инжекта вылетает клиент
Подскажите, структура на инжект таргета верная, или косяк не в ней?
18.01.2015, 23:11
#75
Пехотинец
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
Re: "Поиск инжектов" или "Наш код в чужом процессе"
Выкладываю рабочую версию берет target NPC и открывает диалоговое окно! Как то можно оптимизировать?
var
P1: DWord;
begin
P1:=aPParams^.WID;
asm
MOV EDI, P1 // Вносим WID моба в регистр EDI
MOV EBX, $00746BD0 //Call Targeta
MOV EAX,DWORD PTR DS:[$CCEFAC]
PUSH EDI
MOV ECX,DWORD PTR DS:[EAX+$20]
ADD ECX,$0F4
CALL EBX
MOV EDI, P1
MOV EBX, $00747000 // Call открытия диалога
MOV EAX,DWORD PTR DS:[$CCEFAC]
PUSH EDI
MOV ECX,DWORD PTR DS:[EAX+$20]
ADD ECX,$0F4
CALL EBX
end;
end;
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 18:13 .