|
Работа с GUI, чтение заголоквка окна - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
18.02.2016, 21:19
|
#1
|
|
|
|
Разведчик
|
Регистрация: 11.04.2014
Сообщений: 2
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Работа с GUI, чтение заголоквка окна
Доброго времени суток!
Пытаюсь прочитать заголовок активного окна руофф, не фига не выходит получаю иероглифы.
Базовую инфу по гую получил тут Оффсеты GUI, в целом все понятно
Нашел на форуме свежие офсеты, спасибо товарищу diagnost, тут у самого с поиском тяжеловато пока, только учусь.
Ну и судя по теме GUI РУОФФ написал процедурку на делфях:
Код:
procedure ReadwinTest();
var
win_name: array [0..50] of char;
hProcess: HWND;
a, pid: DWORD;
tmp: SIZE_T;
const
// cтруктура GUI GA+10+08
game = $D6F84C;
gui_st1 = $10;
gui_st2 = $8;
// указатель на акт. окно GUI+
gui_cur_win = $74;
// основные поля структуры окна (WinStruct+...)
gui_win_name = $4c;
begin
hProcess:= go_handle();
GetWindowThreadProcessId(hProcess, @pid);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
// чтение названия активного окна
ReadProcessMemory (hProcess, Ptr(game), @a, SizeOf(a), tmp);
ReadProcessMemory (hProcess, Ptr(a+gui_st1), @a, SizeOf(a), tmp);
ReadProcessMemory (hProcess, Ptr(a+gui_st2), @a, SizeOf(a), tmp);
ReadProcessMemory (hProcess, Ptr(a+gui_cur_win), @a, SizeOf(a), tmp);
ReadProcessMemory (hProcess, Ptr(a+gui_win_name), @win_name, SizeOf(win_name), tmp);
ShowMessage(win_name);
end;
Более опытные форумчане, подскажите где косячу?
|
|
|
25.05.2016, 01:50
|
#2
|
|
|
|
Пехотинец
|
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
|
Re: Работа с GUI, чтение заголоквка окна
Вот готовый проект, сам уже неделю разбираюсь. Все работает (не могу найти №) Код корявый(Delphi XE8):
Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst;
type
TForm1 = class(TForm)
Button1: TButton;
Edit4: TEdit;
ComboGUI: TComboBox;
Radio_Verx: TRadioButton;
Radio_Niz: TRadioButton;
Edit_gui: TEdit;
CheckList_gui: TCheckListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
game_addr:DWORD;
gamer_addr: DWORD;
end;
const
BaseAdress = $00DB5BBC;
var
Form1: TForm1;
hProcess, ProcessID: DWORD;
function ReadInt32(addr: DWORD): DWORD;
function ReadString(addr: int64): UnicodeString;
function WinStruct(WinName: string): Dword;
function CtrlCommandAddr(winstruct: Dword; nomctrl: integer): Dword;
function CtrlEditTextPtr(winstruct: Dword; nomctrl: integer): Dword;
procedure CtrlCheck(winstruct: Dword; nomctrl: integer; state: boolean);
implementation
{$R *.dfm}
function ReadString(addr: int64): UnicodeString;
const
len = 255;
var
st: array [0..len] of widechar;
BytesCountOfRead: NativeUInt;
begin
if addr > 0 then
begin
ZeroMemory(@st, len*2);
ReadProcessMemory(hProcess, ptr(addr), @st, len*2, BytesCountOfRead);
result := st;
end
else
result := '';
end;
function ReadInt32(addr: DWORD): DWORD;
var
BytesCountOfRead: NativeUInt;
Value: DWORD;
begin
if (addr+4 < $FFFFFFFF) then
try
ReadProcessMemory(hProcess, ptr(addr), @Value, 4, BytesCountOfRead);
Result := Value;
except
Result := 0;
end
else
Result := 0;
end;
function WinStruct(WinName: string): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of AnsiChar;
rw : NativeUInt;
name: String;
i: integer;
begin
addr := ReadInt32(BaseAdress);
addr := addr + $1C;
arr := ReadInt32(addr);
arr := ReadInt32(arr + $10);
arr := ReadInt32(arr + $08);
addr := ReadInt32(arr + $AC);
while (addr <> 0) do
begin
next := ReadInt32(addr + $0);
addr := ReadInt32(addr + $08);
res := addr;
addr := ReadInt32(addr + $4C);
ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
i := 1;
name := '';
while (mass[i] <> '') do
begin
name := name + mass[i];
inc(i);
end;
if (name = WinName) then
begin
result := res;
exit;
end;
addr := next;
end;
addr := ReadInt32(arr + $8C);
while (addr <> 0) do
begin
next := ReadInt32(addr + $0);
addr := ReadInt32(addr + $08);
res := addr;
addr := ReadInt32(addr + $4C);
ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
i := 1;
name := '';
while (mass[i] <> '') do
begin
name := name + mass[i];
inc(i);
end;
if (name = WinName) then
begin
result := res;
exit;
end;
addr := next;
end;
result := 0;
end;
function CtrlCommandAddr(winstruct: Dword; nomctrl: integer): Dword;
var
addr: Dword;
i: integer;
begin
addr := ReadInt32(winstruct + $1C8);
for i := 1 to nomctrl do
addr := ReadInt32(addr + $04);
addr := ReadInt32(addr + $08);
result := ReadInt32(addr + $1C);
end;
function CtrlEditTextPtr(winstruct: Dword; nomctrl: integer): Dword;
var
addr: Dword;
i: integer;
begin
addr := ReadInt32(winstruct + $1C8);
for i:=1 to nomctrl do
addr := ReadInt32(addr + $04);
addr := ReadInt32(addr + $08);
result := addr + $13FC;
end;
procedure CtrlCheck(winstruct: Dword; nomctrl: integer; state: boolean);
var
addr: Dword;
i:integer;
rw: NativeUInt;
begin
addr := ReadInt32(winstruct+$1C8);
for i:=1 to nomctrl do
addr := ReadInt32(addr+$04);
addr := ReadInt32(addr+$08);
writeprocessmemory(hProcess, ptr(addr+$121), @state, sizeof(state), rw);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
arr, next, nexd, res, red, Ctrl_addr, Cap_addr, Nom: Dword;
mass: array[1..20] of AnsiChar;
rw : NativeUInt;
name, Ctrl_Name, Cap_Name: String;
i: DWORD;
addr, GUI, WinVerx, WinNiz: DWORD;
BytesCountOfRead: NativeUint;
begin
ProcessID:=0;
GetWindowThreadProcessId(FindWindow(nil,PChar(Edit4.Text)),@ProcessID);
if ProcessID<>0 then
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
if hProcess <> 0 then
begin
ComboGui.Clear;
addr := ReadInt32(BaseAdress);
game_addr := addr + $1C;
addr := ReadInt32(game_addr);
addr := ReadInt32(addr + $10);
GUI := ReadInt32(addr + $08);
WinVerx := ReadInt32(GUI + $8C);
WinNiz := ReadInt32(GUI + $AC);
if Radio_Verx.Checked then
addr := WinVerx
else
addr := WinNiz;
while (addr <> 0) do
begin
next := ReadInt32(addr);
addr := ReadInt32(addr + $08);
res := addr;
addr := ReadInt32(addr + $4C);
ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
i := 1;
name := '';
while (mass[i] <> '') do
begin
name := name + mass[i];
inc(i);
end;
ComboGui.Items.Add(Name);
//GUIList.Items.Add(name + ' *** ' + Ctrl_Name+ ' *** ' + IntToStr(Nom) + ' *** ' + Cap_Name);
addr := next;
end;
CloseHandle(hProcess);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
addr, next, conaddr, ctrlcom: dword;
mass: array[1..20] of AnsiChar;
rw: Nativeuint;
i: integer;
Name, ctrlname:String;
begin
ProcessID:=0;
GetWindowThreadProcessId(FindWindow(nil,PChar(Edit4.Text)),@ProcessID);
if ProcessID<>0 then
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
if hProcess <> 0 then
begin
CheckList_gui.Clear;
addr := winstruct(edit_gui.Text);
addr := readint32(addr + $1C8);
while (addr <> 0) do
begin
next := ReadInt32(addr + $0C);
addr := ReadInt32(addr + $08);
conaddr := addr;
addr := ReadInt32(addr + $B8);
Name := readstring(addr + $0);
ctrlcom:= readint32(conaddr + $18);
ReadProcessMemory(hProcess, ptr(ctrlcom), @mass, sizeof(mass), rw);
i := 1;
ctrlname := '';
while (mass[i] <> '') do
begin
ctrlname := ctrlname + mass[i];
inc(i);
end;
CheckList_gui.Items.Add(name + '___' + ctrlname);
addr := next;
end;
end;
end;
CloseHandle(hProcess);
end;
end.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] Чтение памяти
|
igo3000 |
Общение разработчиков |
12 |
16.04.2016 12:28 |
[Помогите!] Чтение из файла
|
Unheilig)) |
Общение разработчиков |
7 |
19.10.2013 20:01 |
c# чтение ini
|
Mr.Misha |
Вопросы и ответы, обсуждения |
4 |
04.08.2013 15:35 |
[Продам] Смотрим в темке
|
darorib |
Cross Fire |
7 |
18.06.2013 10:09 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 15:37.
|
|