Решил написать эту статью, т.к. в свое время мне очень трудно было понять как же все там устроено) зачем нам нужна структура GUI? Нужна она нам для того, чтобы к примеру нажимать на кнопки в наших окнах или получить доступ к полям ввода логина/пароля и т.д. По сути я собрал всю информацию в кучу, которую мне предоставили dwa83 и krukovis за, что им огромное спасибо. Итак приступим:
1. Что нам нужно? Нам нужны оффсеты GUI, которые нам любезно предоставил dwa83 в этой теме ТЫК
2. Нам нужно усвоить как же там все представляется... И опять же dwa83 об этом позаботился) Вот вам наглядная картинка:Открыть
function WinStruct(WinName: string): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of Char;
name: String;
i: integer;
begin
arr := Read_32(GA);
arr := Read_32(arr + $18);
arr := Read_32(arr + $08);
addr := Read_32(arr + $AC);
while (addr <> 0) do
begin
next := Read_32(addr);
addr := Read_32(addr + $08);
res := addr;
addr := Read_32(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 := Read_32(arr + $8C);
while (addr <> 0) do
begin
next := Read_32(addr);
addr := Read_32(addr + $08);
res := addr;
addr := Read_32(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 := Read_32(winstruct + $1C8);
for i := 1 to nomctrl do
addr := Read_32(addr + $04);
addr := Read_32(addr + $08);
result := Read_32(addr + $1C);
end;
function CtrlEditTextPtr(winstruct: Dword; nomctrl: integer): Dword;
var
addr: Dword;
i: integer;
begin
addr := Read_32(winstruct + $1C8);
for i:=1 to nomctrl do
addr := Read_32(addr + $04);
addr := Read_32(addr + $08);
result := addr + $13FC;
end;
procedure CtrlCheck(winstruct: Dword; nomctrl: integer; state: boolean);
var
addr: Dword;
i:integer;
begin
addr := Read_32(winstruct+$1C8);
for i:=1 to nomctrl do
addr := Read_32(addr+$04);
addr := Read_32(addr+$08);
writeprocessmemory(hProcess, ptr(addr+$121), @state, sizeof(state), rw);
end;
4. Теперь пример работы одной из этих функций, к примеру "чекнутость" чекбокса усиленно на странице ввода логина и пароля: Открыть
Код:
CtrlCheck(WinStruct('Win_Login'), 6, true);
5. Программа, которая сканирует структуру окна и его контролы(её тоже предоставил dwa83) ТЫК / [Ссылки могут видеть только зарегистрированные пользователи. ]
5. Программа, которая сканирует структуру окна и его контролы(её тоже предоставил dwa83) ТЫК / VT
В верхнем поле программы отображается имя окна, в нижнем структура.... К примеру окно приветствия выглядит так:
В программе же вот как это окно находится:
Теперь допустим нам нужна кнопка подтвердить, как мы видим имя структуры окна у нас Win_LoginPage, а кнопка подтвердить 20 по счету в массиве контролов)
Чтобы нажать на эту кнопку используется такой код: