|
Выбор между Handle клиента Delphi - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
15.01.2016, 22:00
|
#1
|
|
|
|
Разведчик
|
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Выбор между Handle клиента Delphi
Помогите пожалуйста я уже весь мозг сломал
как мне сделать переход от окна к окну через ComboBox
Суть вот в чём, я запускаю программу она находит нужное мне окно, окон может быть много как только окно найдено автоматически я считываю значение из памяти имени, допустим персонажа и меняю название окна, на название его имени,
после чего я вывожу найденные окна которым уже присвоено имя из памяти в ComboBox ' sComboBox1.Items.Add(''+Nm+'') ;
Вот после этого мне нужно чтобы при выборе из списка 'ComboBox' имени персонажа и нажатии на кнопку я мог открыть процесс считывания памяти конкретно из этого окна
Заранее Спасибо
Нужно чтобы вот этот процесс применялся к выбранному окну в ComboBox
PHP код:
var Client Window:HWND; //Handle клиента Processed:Integer; process:Integer; //Идентификатор объекта Window Name: integer; Client Window := FindWindow(nil, PChar('Окно которое выбрано по имени персонажа в ComboBox')); //Находим Handle окна GetWindowThreadProcessed(Client Window,@Processed); //Получаем И.П. process := OpenProcess(PROCESS_ALL_ACCESS,False,Processed); //Открываем процесс с возможностью записи
Код определения окна и чтения из памяти имени персонажа
PHP код:
procedure TForm1.FormActivate(Sender: TObject); var Wd : HWnd; buf,Nm: array [0..255] of char; i: integer; PID: dword; lpBuffer:DWord; WNik: array[0..255] of widechar; s: WideString; NoB: SIZE_T; LvL,ClassID:Integer; Lvel,WClassID:DWord; begin i:= 0; smemo2.Clear; // Очистим список перед началом поисков Wd:=FindWindow(0,0); // Найдем первое окно верхнего уровня любого класса While (Wd<>0) do // Если такое окно существует Begin GetClassName(wd,@buf,100); //Получаем класс окна (Чувствителен к регистру) if buf='Имя Окна Window' then // Если наше begin GetWindowThreadProcessId(wd, @PID); hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID); //-----читаю-память--------------------------------------------------------------- ReadProcessMemory (hProcess, Pointer($00D6F84C), @lpBuffer, sizeof(lpBuffer), NoB); ReadProcessMemory (hProcess, Pointer(lpBuffer+$28), @lpBuffer, sizeof(lpBuffer), NoB); ReadProcessMemory (hProcess, Pointer(lpBuffer+$6E8), @lpBuffer, sizeof(lpBuffer), NoB); ReadProcessMemory (hProcess, Pointer(lpBuffer+StrToInt('$0')), @WNik, sizeof(WNik), NoB); s := WNik; //------------------------------------------------------------------------------------ //Делаем Заголовок окна по имени игрока setWindowText(Wd,(s)); GetWindowText(Wd,Nm,255); //получаем название окна smemo2.Lines.Add(s); smemo2.Lines.Add('Class: '+buf); // Добавим в список smemo2.Lines.Add('Window: '+Nm); smemo2.Lines.Add('HWnd: '+IntToStr(Wd)); Form1.sComboBox1.Items.Add(''+Nm+'') ;// Вы вожу в ComboBox1 inc(i); CloseHandle(hProcess); hProcess:= 0; end; Application.ProcessMessages; // Дадим возможность поработать другим Wd:=GetNextWindow(Wd,GW_HWNDNEXT); // Найдем следующее окно в системе. End; smemo2.Lines.Add('Найдено окон: '+inttostr(i)); end;
|
|
|
15.01.2016, 22:28
|
#2
|
|
|
|
Фельдмаршал
|
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
|
Re: Выбор между Handle клиента Delphi
Код:
var
akk:array [0..50]of record
PID:Dword;
end;
function EnumProc (h: HWnd; Param: LongInt): Boolean; stdcall;
var
p:array [0..255] of char;
bufs:array [1..60] of widechar;
PID,hProc,nbyte:dword;
bufd:dword;
buf:byte;
Begin
GetClassName(h ,p,sizeof(p));
if p='ElementClient Window' then
begin
GetWindowThreadProcessId(h, @PID);
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if hProc <> 0 then
begin
readprocessmemory(hProc,ptr(addr_level),@buf,1,nbyte);
//проверка версии
if (buf=strtoint('$'+copy(code_lvlST,1,2))) or (buf=strtoint('$'+code_lvl_1)) then
begin
readprocessmemory(hProc,ptr(base_addr),@bufd,4,nbyte);
readprocessmemory(hProc,ptr(bufd+$20),@bufd,4,nbyte);
readprocessmemory(hProc,ptr(bufd+Nick_offs),@bufd,4,nbyte);
readprocessmemory(hProc,ptr(bufd),@bufs,60,nbyte);
form1.ComboBox1.Items.Add(string(bufs));
akk[form1.ComboBox1.Items.Count-1].PID:=PID;
end;
end;
closehandle(hProc);
end;
EnumProc := TRUE;
end;
procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
combobox1.Items.Clear; // Очистим список перед началом поисков
EnumWindows (@EnumProc, 0); // и скажем - искать
end;
sic!
Забыл кусочек.
Собственно как организовано подключение к процессу:
Код:
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, akk[combobox1.ItemIndex].PID);
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Флудобот, Девизхак, OutFocusBot, OutFocusBot ver 3 (freepvp), PWMultiHack ver 3, AutoRespawn.
JD: JDMultiHack, JDFlooder, JDBot.
Статьи: Отключаем UAC, Ищем базовый адрес Perfect World, "Патчер памяти" или "Пишем флайхак", "Патчер памяти 2" или "Пишем Джампхак", "Поиск инжектов" или "Наш код в чужом процессе"
Последний раз редактировалось Dinmaite; 15.01.2016 в 22:38.
|
|
|
15.01.2016, 23:48
|
#3
|
|
|
|
Разведчик
|
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Выбор между Handle клиента Delphi
Скажите пожалуйста где тут не правильно
и откуда брать переменные addr_level, code_lvlST,code_lvl_1
Код:
function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall;
var
NoB: SIZE_T;
p:array [0..255] of char;
WNik,bufs:array [1..60] of widechar;
s: WideString;
PID,hProc,nbyte:dword;
lpBuffer:dword;
buf:byte;
Begin
GetClassName(Wd ,p,sizeof(p));
if p='ElementClient Window' then
begin
GetWindowThreadProcessId(Wd, @PID);
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if hProc <> 0 then
begin
readprocessmemory(hProc,ptr(addr_level),@buf,1,nbyte);
//проверка версии
if (buf=strtoint('$'+copy(code_lvlST,1,2))) or (buf=strtoint('$'+code_lvl_1)) then
begin
ReadProcessMemory (hProcess, Pointer($00D6F84C), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+$28), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+$6E8), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+StrToInt('$0')), @WNik, sizeof(WNik), NoB);
s := WNik;
form1.sComboBox1.Items.Add((s));
akk[form1.sComboBox1.Items.Count-1].PID:=PID;
end;
end;
closehandle(hProc);
end;
EnumProc := TRUE;
end;
procedure TForm1.sComboBox1DropDown(Sender: TObject);
begin
scombobox1.Items.Clear; // Очистим список перед началом поисков
EnumWindows (@EnumProc, 0); // и скажем - искать
end;
procedure TForm1.sSpeedButton1Click(Sender: TObject);
var
PID,hProc,nbyte:dword;
begin
hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, akk[scombobox1.ItemIndex].PID);
end;
|
|
|
16.01.2016, 00:05
|
#4
|
|
|
|
Фельдмаршал
|
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
|
Re: Выбор между Handle клиента Delphi
Выброси полностью две строки с неизвестными константами. Первая для проверки версии. Вторая для проверки установки патча. Тебе они не нужны.
А неверны возможно адреса. Не могу с этим помочь.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Флудобот, Девизхак, OutFocusBot, OutFocusBot ver 3 (freepvp), PWMultiHack ver 3, AutoRespawn.
JD: JDMultiHack, JDFlooder, JDBot.
Статьи: Отключаем UAC, Ищем базовый адрес Perfect World, "Патчер памяти" или "Пишем флайхак", "Патчер памяти 2" или "Пишем Джампхак", "Поиск инжектов" или "Наш код в чужом процессе"
|
|
|
16.01.2016, 08:14
|
#5
|
|
|
|
Сержант
|
Регистрация: 16.02.2012
Сообщений: 105
Популярность: 651
Сказал(а) спасибо: 19
Поблагодарили 39 раз(а) в 31 сообщениях
|
Re: Выбор между Handle клиента Delphi
А если использовать не form1.sComboBox1.Items.Add((s)), а form1.sComboBox1.AddObject(s, pointer(PID)), то и массив akk будет не нужен. Handle нужного процесса можно будет получать hProc:=OpenProcess(PROCESS_ALL_ACCESS, False, dword(combobox1.Items.Objects[combobox1.ItemIndex]));
а если не закрывать процесс в EnumProc (убрать closehandle(hProc)), то можно вообще сразу Handle процесса запоминать form1.sComboBox1.AddObject(s, pointer(hProc)), а получать так hProc:=THandle(combobox1.Items.Objects[combobox1.ItemIndex]); Правда closehandle(hProc) все же надо будет сделать перед перечитыванием.
for i:=0 combobox1.Items.Count-1 do
closehandle(THandle(combobox1.Items.Objects[i]));
combobox1.clear;
________________
backup - акт проявления трусости
Последний раз редактировалось pw.assistant; 16.01.2016 в 08:18.
|
|
|
16.01.2016, 13:51
|
#6
|
|
|
|
Фельдмаршал
|
Регистрация: 13.08.2009
Сообщений: 1,004
Популярность: 25098
Золото Zhyk.Ru: 350
Сказал(а) спасибо: 110
Поблагодарили 830 раз(а) в 395 сообщениях
|
Re: Выбор между Handle клиента Delphi
Вот только стандартная компонента TCombobox не поддерживает добавление объекта (как минимум D7), а AlphaControls установлен не у всех.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Флудобот, Девизхак, OutFocusBot, OutFocusBot ver 3 (freepvp), PWMultiHack ver 3, AutoRespawn.
JD: JDMultiHack, JDFlooder, JDBot.
Статьи: Отключаем UAC, Ищем базовый адрес Perfect World, "Патчер памяти" или "Пишем флайхак", "Патчер памяти 2" или "Пишем Джампхак", "Поиск инжектов" или "Наш код в чужом процессе"
|
|
|
18.01.2016, 22:01
|
#7
|
|
|
|
Разведчик
|
Регистрация: 17.01.2011
Сообщений: 1
Популярность: -290
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Выбор между Handle клиента Delphi
Может кто знает как прочесть Мировой чат на Delphi
как до него вообще добратся
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:09.
|
|