 |
[Инжект] Функция для работы с GUI - Разработка ПО для Perfect World - Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World |
18.07.2012, 22:52
|
#1
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 07.10.2009
 Сообщений: 496
 Популярность: 2687
 Сказал(а) спасибо: 64
Поблагодарили 325 раз(а) в 105 сообщениях
|
[Инжект] Функция для работы с GUI
Всем привет!
Хочу поделиться с вами функцией исполняющей команды контролов на любых формах в игре.
Delphi:
Код:
procedure GUICommand(aPParams:PParams);Stdcall;
var CallAddress:Pointer;
WIN_STRUCT, COMMAND_TEXT_ADDRESS : DWORD ;
begin
WIN_STRUCT:=aPParams^.Param1;
COMMAND_TEXT_ADDRESS:=aPParams^.Param2;
CallAddress:=ptr($0077d3e0);
asm
pushad
mov ecx, WIN_STRUCT
push COMMAND_TEXT_ADDRESS
call CallAddress
popad
end;
end;
C# (с использованием класса ASM)
Код:
int CallAddress = 0x0077d3e0;
ASM asm = new ASM();
asm.Pushad();
asm.Mov_ECX(form_sturct);
asm.Push68(command_text_adr);
asm.Mov_EAX(CallAddress);
asm.Call_EAX();
asm.Popad();
asm.Ret();
asm.RunAsm(ProcessID, 0);
Сразу скажу что все смещения которые могут вам понадобиться для работы с GUI для вас нашел, оформил и выложил dwa83 в теме Оффсеты GUI.
А в этом топике еще и дал программу и готовые функции для анализа контролов в игре. Без этих данных эта функция вам, боюсь, не поможет. И рассчитываю, что ваша благодарность ему не будет знать границ.
Поясню ключевые параметры в терминах выложенной там информации.
WIN_STRUCT - структура окна.
Если рассматривать Активное окно, то это тут ActiveWinStruct = BA + 0x1C + 0x18 + 0x08 + 0x74.
COMMAND_TEXT_ADDRESS - адрес (я подчеркиваю, что это адрес) текста команды контрола.
Если мы рассматриваем активный контрол, то указатель на его структуру тут: ActiveControlStructPtr = WinStruct + (0xE8+ 0x1C). А чтобы получить адрес команды - нужно считать 4 байта (DWORD) по этому указателю - (ActiveControlStructPtr + 0x1C)- это сумма значений, а не цепочка оффсетов. Сначала нужно сложить, а потом по полученному указателю прочитать значение типа DWORD.
Ну вот у вас теперь есть все, чтобы запустить любую команду у контрола, если таковая у него есть.
________________
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Последний раз редактировалось krukovis; 18.07.2012 в 23:25.
|
|
|
4 пользователя(ей) сказали cпасибо:
|
|
19.07.2012, 15:19
|
#2
|
|
|
|
Пехотинец
|
 Регистрация: 11.11.2010
 Сообщений: 67
 Популярность: 16
 Сказал(а) спасибо: 58
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Добавлю до кучи на autoit закрытие окна (нажатие на крестик)
Код:
Func NPCTALKCLOSE()
$OPCODE = ""
PUSHAD()
MOV_EAX(0x950C18) ; // DlgCancelPush
PUSH_EAX()
MOV_EDX($APP_BASE_ADDRESS)
MOV_EDX_DWORD_PTR_EDX()
MOV_EDX_DWORD_PTR_EDX_ADD(Dec("18"))
MOV_EDX_DWORD_PTR_EDX_ADD(Dec("8"))
MOV_EDX_DWORD_PTR_EDX_ADD(Dec("74"))
MOV_ECX_EDX()
MOV_EDX(Dec("0077D3E0")) ;// DialogOpAddr
CALL_EDX()
POPAD()
RET()
INJECTCODE($PROCESS_ID)
Sleep(1000)
EndFunc ;==>NPCTALKCLOSE
|
|
|
20.07.2012, 12:36
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 31.08.2010
 Сообщений: 64
 Популярность: 129
 Сказал(а) спасибо: 30
Поблагодарили 12 раз(а) в 7 сообщениях
|
Re: [Инжект] Функция для работы с GUI
|
|
|
20.07.2012, 15:12
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 23.02.2011
 Сообщений: 19
 Популярность: 18
 Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
|
Re: [Инжект] Функция для работы с GUI
ну я думаю это к примеру так
Код:
sum:=hextodec(ActiveControlStructPtr) + hextodec($1C)
readProcessMemory(hProcess,ptr(dectohex(sum)),buff,sizeof(buff),rw);
или вот еще вариант, что мне кажется более верный, насчет первого варианта я не уверен.... Взять прочитать значение по этому адресу ActiveControlStructPtr, потом по этому 0x1C и значения обоих сложить, и должен получиться нужный нам адрес
Последний раз редактировалось vladoscom93; 20.07.2012 в 15:18.
|
|
|
21.07.2012, 11:58
|
#5
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 07.10.2009
 Сообщений: 496
 Популярность: 2687
 Сказал(а) спасибо: 64
Поблагодарили 325 раз(а) в 105 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Если на Delphi то это должно выглядеть как то так:
Код:
var
buff, CommandAddress:dword;
begin
CommandAddressPointer:=ContorlStruct + $1C;
readProcessMemory(hProcess,ptr(CommandAddressPointer),buff,sizeof(buff), 4);
CommandAddress := buff;
end;
________________
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
|
|
|
21.07.2012, 13:15
|
#6
|
|
|
|
Пехотинец
|
 Регистрация: 31.08.2010
 Сообщений: 64
 Популярность: 129
 Сказал(а) спасибо: 30
Поблагодарили 12 раз(а) в 7 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Спасибо огромное. Работает.
На С++ для инжектора из этой темы:
Код:
void GUICommand(DWORD ctrladdr, DWORD wstruct)
{
char code[20] = "\x60\xB9\x11\x11\x11\x11\x68\x22\x22\x22\x22\xB8\xE0\xD3\x77\x00\xFF\xD0\x61\xC3";
memcpy(code+2,&wstruct,4);
memcpy(code+7,&ctrladdr,4);
InjectAndExecute(code, 20);
}
|
|
|
22.07.2012, 00:10
|
#7
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Лучше назовите CtrlTextCommandAddr, или подобно, ну чтоб понятно было что за адрес. По сути это адрес где лежит текстовая команда данного контрола в процессе игры.
Добавлено через 15 минут
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
ну я думаю это к примеру так
Код:
sum:=hextodec(ActiveControlStructPtr) + hextodec($1C)
readProcessMemory(hProcess,ptr(dectohex(sum)),buff ,sizeof(buff),rw);
|
|
 |
|
 |
|
Да по сути всё как обычно с любыми оффсетами, просто некоторые группы значений из цепочки оффсетов названы одним именем для укорачивания цепочки, вот к примеру равнозначные обозначения
GA+18+08 = GUI
GUI + АС = GA+18+08+AC
Так же и WinStruct. К примеру WinStruct может быть и
GA+18+08+AC+0+0+0+0+8
и
GA+18+08+AC+0+0+0+0+0+0+0+8
и даже
GA+18+08+AC+8(структура первого окна в массиве)
WinStruct обозначает общее для всех окон
GA+18+08+AC+(+0 n-ое количество раз в зависимости от номера окна в списке)+8
Просто в этих цепочках может быть в зависимости от позиции окна в массиве переменное количество смещений к примеру +00(подразумевающих считывание по этому оффсету разное количество раз в цикле для разных окон), потому для всех окон длина цепочки из-за этого смещения будет разной, но суть конечного результата одна, например результатом будет адрес структуры окна. То же касается и массива элементов управления.
Вот простая иллюстрация
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 22.07.2012 в 00:53.
Причина: Добавлено сообщение
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
25.07.2012, 16:35
|
#8
|
|
|
|
Разведчик
|
 Регистрация: 23.02.2011
 Сообщений: 19
 Популярность: 18
 Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
|
Re: [Инжект] Функция для работы с GUI
у меня возникла проблема с тыканием по кнопкам окон верхнего уровня... Смещения все проверил вроде правильно указаны, пытаюсь нажать кнопку выйти и моя программка виснет... Пробовал тыкать по кнопкам окон нижнего уровня(кнопка вход) все нормально работает, вот мой код, подскажите где я допустил оплошность:
Код:
type
PParams = ^TParams;
TParams = packed record
Param1,Param2: Dword;
end;
const
GA = $00A57ACC;
var
Form1: TForm1;
rw: Cardinal;
hProcess: Dword;
implementation
{$R *.dfm}
procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer;
aParamsSize: DWord);
var
hThread: THandle;
lpNumberOfBytes: DWord;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID<>0 then
begin
// ---- Âûäåëÿåì ìåñòî â ïàìÿòè ïðîöåññà, è çàïèñûâàåì òóäà íàøó ôóíêöèþ
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Òàêæå çàïèøåì ïàðàìåòðû ê íåé
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Ñîçäàåì ïîòîê, â êîòîðîì âñå ýòî áóäåò âûïîëíÿòüñÿ.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Îæèäàåì çàâåðøåíèÿ ôóíêöèè
WaitForSingleObject(hThread, INFINITE);
// ---- ïîä÷èùàåì çà ñîáîé
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end
end;
function Read_32(Addr: Dword): Dword;
var value: Dword;
begin
ReadProcessMemory(hProcess, ptr(addr), @value, sizeof(value), rw);
result := value;
end;
function WinStruct(WinName: AnsiString): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of Char;
name: AnsiString;
i:integer;
begin
arr := Read_32(GA);
arr := Read_32(arr + $18);
arr := Read_32(arr + $08);
addr := Read_32(arr + $AC);
while (addr <> null) 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;
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 <> null) 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;
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;
procedure GUICommand(aParams:PParams);Stdcall;
var CallAddress:Pointer;
WIN_STRUCT, COMMAND_TEXT_ADDRESS : DWORD ;
begin
WIN_STRUCT:=aParams^.Param1;
COMMAND_TEXT_ADDRESS:=aParams^.Param2;
CallAddress:=ptr($0077d3e0);
asm
pushad
mov ecx, WIN_STRUCT
push COMMAND_TEXT_ADDRESS
call CallAddress
popad
end;
end;
procedure connect;
var
PID: dword;
WID: Thandle;
begin
WID:=FindWindow(nil,'Perfect World');
GetWindowThreadProcessId(WID, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aParams: TParams;
begin
connect;
aParams.Param1 := WinStruct('Win_LoginButton');
aParams.Param2 := CtrlCommandAddr(aParams.Param1, 2);
InjectFunc(hProcess, @GUICommand, @aParams, sizeof(aParams));
end;
|
|
|
25.07.2012, 19:17
|
#9
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Перед while mass[i]<>'' do
ставьте name:='';
иначе при проверке следующего окна там уже будет находиться предыдущее имя, и плюсоваться будет к нему, в итоге имя будет состоять из имени нескольких окон, а такого имени естественно нет, потому окно не найдётся. Кстати почему то при не найденном окне не хочет оканчиваться цыкл, видимо в последнем окне указатель на следующее окно не стоит в nil, странно.. я на ноль проверяю, и вроде всё норм..
А так все кнопки нажимает, кроме выхода на странице логина, не в курсе почему. А почему бы не выходить из самой игры а не из окна логина?
Добавлено через 10 минут
поставил везде while (addr<>0) do.., так вроде цикл нормально завершается, если окно не найдено
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 25.07.2012 в 19:28.
Причина: Добавлено сообщение
|
|
|
Пользователь сказал cпасибо:
|
|
25.07.2012, 19:53
|
#10
|
|
|
|
Разведчик
|
 Регистрация: 23.02.2011
 Сообщений: 19
 Популярность: 18
 Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
|
Re: [Инжект] Функция для работы с GUI
все работает) мне главное было нажать на кнопку выбора сервера)
|
|
|
25.07.2012, 21:09
|
#11
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: [Инжект] Функция для работы с GUI
чую назревающую огромную кучу вопросов))
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
|
|
|
Пользователь сказал cпасибо:
|
|
25.07.2012, 22:22
|
#12
|
|
|
|
Разведчик
|
 Регистрация: 23.02.2011
 Сообщений: 19
 Популярность: 18
 Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
|
Re: [Инжект] Функция для работы с GUI
ну список серверов как я понимаю это листбокс, который я нашел в программке которую ты дал... Единственный вопрос как определять под каким номером в листбоксе какой сервер и на нужный переносить выделение... Над этим я завтра еще подумаю)
Добавлено через 16 часов 35 минут
dwa83, ты предсказываешь будущее) в общем у меня почти все получилось, но почему-то вместо того, чтобы выделить нужную мне строку у меня просто пропадает выделение в списке серверов...
вот код, который как бы должен выделить нужную мне строку:
Код:
const
GA = $00A57ACC;
var
Form1: TForm1;
rw: Cardinal;
hProcess: Dword;
prov:array[0..255] of WideChar;
implementation
{$R *.dfm}
function Read_32(Addr: Dword): Dword;
var value: Dword;
begin
ReadProcessMemory(hProcess, ptr(addr), @value, sizeof(value), rw);
result := value;
end;
function WinStruct(WinName: AnsiString): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of Char;
name: AnsiString;
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 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 + $13C;
end;
function WriteNumb(numb: integer): dword;
var
ThreadAddr: pointer;
begin
ThreadAddr := VirtualAllocEx(hProcess, nil, 1024, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, ptr(dword(ThreadAddr)+100), @numb, sizeof(numb), rw);
result:=dword(ThreadAddr)+100;
end;
procedure connect;
var
PID: dword;
WID: Thandle;
begin
WID:=FindWindow(nil,'Perfect World');
GetWindowThreadProcessId(WID, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
end;
procedure TForm1.Button1Click(Sender: TObject);
var addr, textptr: dword;
begin
connect;
if hProcess<>0 then
begin
addr:=WriteNumb(3);
textptr:=CtrlEditTextPtr(WinStruct('Win_LoginServerList'), 22);
WriteProcessMemory(hProcess, ptr(textptr), @addr, 4,rw);
end
else
showmessage('îøèáêà');
end;
Последний раз редактировалось vladoscom93; 26.07.2012 в 17:57.
Причина: Добавлено сообщение
|
|
|
26.07.2012, 21:25
|
#13
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Зачем число то инжектить)? мы ведь используем само это число, а не указатель на него, как при работе с текстом). Можно смело "пихать" его в структуру без предварительного инжекта в память.
Код:
num:=3;
textptr:=CtrlEditTextPtr(WinStruct('Win_LoginServerList'), 22);
WriteProcessMemory(hProcess, ptr(textptr), @num, 1,rw);
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
|
|
|
Пользователь сказал cпасибо:
|
|
27.07.2012, 03:08
|
#14
|
|
|
|
Разведчик
|
 Регистрация: 23.02.2011
 Сообщений: 19
 Популярность: 18
 Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
|
Re: [Инжект] Функция для работы с GUI
новая проблема( почему-то не правильно считывает caption выделенного сервера... может я не по тем смещениям беру имя?
Код:
const
GA = $00A57ACC;
var
Form1: TForm1;
rw: Cardinal;
hProcess: Dword;
prov:array[0..255] of WideChar;
implementation
{$R *.dfm}
function Read_32(Addr: Dword): Dword;
var value: Dword;
begin
ReadProcessMemory(hProcess, ptr(addr), @value, sizeof(value), rw);
result := value;
end;
function WinStruct(WinName: AnsiString): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of Char;
name: AnsiString;
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 CtrlCaptionPtr(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 + $B8;
end;
function CtrlServerListPtr(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 + $13C;
end;
procedure connect;
var
PID: dword;
WID: Thandle;
begin
WID:=FindWindow(nil,'Perfect World');
GetWindowThreadProcessId(WID, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
end;
procedure TForm1.Button1Click(Sender: TObject);
var captionPtr, ListPtr: dword;
caption: array[0..255] of WideChar;
serverWide: array[0..255] of WideChar;
server: string;
numbServer: integer;
serverWideString: WideString;
captionWideString: WideString;
begin
connect;
server := 'Ëèðà';
numbServer := 2;
if hProcess<>0 then
begin
captionPtr := CtrlCaptionPtr(WinStruct('Win_LoginServerList'), 22);
listPtr := CtrlServerListPtr(WinStruct('Win_LoginServerList'), 22);
writeProcessMemory(hProcess,ptr(listPtr), @numbServer, sizeof(numbServer), rw);
readProcessMemory(hProcess, ptr(captionPtr), @caption, sizeof(caption), rw);
StringToWideChar(server, serverWide, Length(server)+1);
serverWideString := serverWide;
captionWideString := caption;
if serverWideString = captionWideString then
showMessage('Âåðíî')
else
showMessage('Íå âåðíî');
end
else
showmessage('îøèáêà');
end;
|
|
|
27.07.2012, 09:24
|
#15
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: [Инжект] Функция для работы с GUI
Чтобы считать Caption а не указатель на неё
result := Read_32(addr + $13FC); - адрес текста(адрес в указателе)
а не
result := addr + $13FC; - адрес указателя(адрес адреса)
Но вопрос состоит в другом.. Почему у листбокса пустой caption..
И мой ответ - хз, хотя мне говорили, что тут должно лежать значение выделенного элемента, но видимо ошиблись.
А вообще, для какой конкретной цели всё это делаете?
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 27.07.2012 в 09:27.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Помогите!] Функция
|
Xaker-style |
Общение разработчиков |
7 |
16.03.2012 21:36 |
[Обсуждение] Функция Магнит
|
ˆGeFoRcEˆ |
Общение и обсуждение, архив Point Blank |
5 |
07.01.2012 11:50 |
[Помогите!] Функция открытия
|
Rakim |
Вопросы и ответы, обсуждения |
1 |
23.07.2011 09:40 |
[Информация] Функция открыта
|
Vadimka999 |
Общение и обсуждение, архив Point Blank |
5 |
10.05.2010 18:58 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 21:29.
|
 |