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.: Тапками не закидывайте, моя первая статья)
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.: Тапками не закидывайте, моя первая статья)