PDA

Просмотр полной версии : [Статья] WinStruct и CtrlStruct [Delphi/C++]


vladoscom93
24.08.2012, 15:53
Решил написать эту статью, т.к. в свое время мне очень трудно было понять как же все там устроено) зачем нам нужна структура GUI? Нужна она нам для того, чтобы к примеру нажимать на кнопки в наших окнах или получить доступ к полям ввода логина/пароля и т.д. По сути я собрал всю информацию в кучу, которую мне предоставили dwa83 и krukovis за, что им огромное спасибо. Итак приступим:
1. Что нам нужно? Нам нужны оффсеты GUI, которые нам любезно предоставил dwa83 в этой теме ТЫК ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
2. Нам нужно усвоить как же там все представляется... И опять же dwa83 об этом позаботился) Вот вам наглядная картинка:[Ссылки могут видеть только зарегистрированные и активированные пользователи]
3. Собственно сами функции для работы GUI, которые тоже предоставил dwa83:
1)DWORD READER::WinStruct(AnsiString winname)
{
DWORD arr = Read_32(GA);
arr = Read_32(arr+0x18);
arr = Read_32(arr+0x08);
DWORD addr = Read_32(arr+0xAC);

while (addr!=NULL)
{
DWORD next = Read_32(addr);
addr = Read_32(addr+0x08);
DWORD result = addr;
addr = Read_32(addr+0x4C);

char mass[20]={0};
Read_Mass(addr,mass,20);
AnsiString name=mass;
if (name==winname) return result;
addr = next;
}

addr = Read_32(arr+0x8C);
while (addr!=NULL)
{
DWORD next = Read_32(addr);
addr = Read_32(addr+0x08);
DWORD result = addr;
addr = Read_32(addr+0x4C);

char mass[20]={0};
Read_Mass(addr,mass,20);
AnsiString name=mass;
if (name==winname) return result;
addr = next;
}
return 0;
} / 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;
2)DWORD READER::CtrlCommandAddr(DWORD winstruct, int nomctrl)
{
DWORD addr = Read_32(winstruct+0x1C8);
for (int i=0; i<nomctrl; i++)
addr = Read_32(addr+0x04);
addr = Read_32(addr+0x08);
return Read_32(addr+0x1C);
}

void READER::CtrlCheck(DWORD winstruct, int nomctrl, bool state)
{
DWORD addr = Read_32(winstruct+0x1C8);
for (int i=0; i<nomctrl; i++)
addr = Read_32(addr+0x04);
addr = Read_32(addr+0x08);
Write_8(addr+0x121,state);
}

DWORD READER::CtrlEditTextPtr(DWORD winstruct, int nomctrl)
{
DWORD addr = Read_32(winstruct+0x1C8);
for (int i=0; i<nomctrl; i++)
addr = Read_32(addr+0x04);
addr = Read_32(addr+0x08);
return addr+0x13FC;
} /
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) ТЫК ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) / VT ([Ссылки могут видеть только зарегистрированные и активированные пользователи] f2363bf396c3b1/analysis/1342984920/)


P.S.: Тапками не закидывайте, моя первая статья)

gurin
25.08.2012, 12:56
А как узнать названия всех доступных окон и имена контролов в них с их номерами?

vladoscom93
25.08.2012, 13:50
5. Программа, которая сканирует структуру окна и его контролы(её тоже предоставил dwa83) ТЫК / VT
В верхнем поле программы отображается имя окна, в нижнем структура.... К примеру окно приветствия выглядит так:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

В программе же вот как это окно находится:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Теперь допустим нам нужна кнопка подтвердить, как мы видим имя структуры окна у нас Win_LoginPage, а кнопка подтвердить 20 по счету в массиве контролов)
Чтобы нажать на эту кнопку используется такой код:

aParams.Param1 := WinStruct('Win_LoginPage');
aParams.Param2 := CtrlCommandAddr(aParams.Param1, 20);
InjectFunc(hProcess, @GUICommand, @aParams, sizeof(aParams));


Сама процедура нажатия на кнопку вот:

procedure GUICommand(aParams: PParams); Stdcall;
var
CallAddr: Pointer;
win_struct, command_addr: Dword;
begin
win_struct := aParams^.Param1;
command_addr := aParams^.Param2;
CallAddr := ptr($0077D3E0);
asm
pushad
MOV ECX, win_struct
push command_addr
call CallAddr
popad
end;
end;


С другими окнами делаете все по аналогии

dwa83
31.08.2012, 22:48
3. Собственно сами функции для работы GUI, которые тоже предоставил dwa83:
Не совсем) на делфи писал должно быть krukovis, я больше по с++

vladoscom93
03.09.2012, 02:59
Не совсем) на делфи писал должно быть krukovis, я больше по с++

на делфи писал я) взяв за основу твои функции