[Информация] [Инжект] Функция для работы с GUI - Zhyk.Ru Forums
Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.Ru LIVE! Реклама на Zhyk.Ru Доска почета top.zhyk.ru (beta) Премиум-аккаунт

[Инжект] Функция для работы с GUI

-

Разработка ПО для Perfect World

- Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World

Ответ
 
Опции темы Опции просмотра
Старый 18.07.2012, 23:52   #1
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 323 раз(а) в 103 сообщениях
 
По умолчанию [Инжект] Функция для работы с 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.

Ну вот у вас теперь есть все, чтобы запустить любую команду у контрола, если таковая у него есть.
________________
--------------------------------------------
PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
[for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------

Последний раз редактировалось krukovis; 19.07.2012 в 00:25.
  Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
/GeG/ (25.07.2012), Nek1t (18.07.2012), pw.lancer (08.08.2013), vladoscom93 (27.07.2012)
Старый 19.07.2012, 16:19   #2
 Пехотинец
Аватар для pwgamer
 
pwgamer никому не известный тип
Регистрация: 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, 13:36   #3
 Пехотинец
Аватар для Nek1t
 
Nek1t на правильном путиNek1t на правильном пути
Регистрация: 31.08.2010
Сообщений: 64
Популярность: 129
Сказал(а) спасибо: 30
Поблагодарили 12 раз(а) в 7 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Цитата:
Сообщение от krukovisПосмотреть сообщение
Если мы рассматриваем активный контрол, то указатель на его структуру тут: ActiveControlStructPtr = WinStruct + (0xE8+ 0x1C). А чтобы получить адрес команды - нужно считать 4 байта (DWORD) по этому указателю - (ActiveControlStructPtr + 0x1C)- это сумма значений, а не цепочка оффсетов. Сначала нужно сложить, а потом по полученному указателю прочитать значение типа DWORD.

Можно, пожалуйста, подробнее про это. А то у меня при любых раскладах крашится клиент.
  Ответить с цитированием
Старый 20.07.2012, 16:12   #4
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 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 в 16:18.
  Ответить с цитированием
Старый 21.07.2012, 12:58   #5
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 323 раз(а) в 103 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Если на Delphi то это должно выглядеть как то так:
Код:
var 
buff, CommandAddress:dword;
begin
CommandAddressPointer:=ContorlStruct + $1C;
readProcessMemory(hProcess,ptr(CommandAddressPointer),buff,sizeof(buff), 4);
CommandAddress := buff;
end;
________________
--------------------------------------------
PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
[for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
  Ответить с цитированием
Старый 21.07.2012, 14:15   #6
 Пехотинец
Аватар для Nek1t
 
Nek1t на правильном путиNek1t на правильном пути
Регистрация: 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, 01:10   #7
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Цитата:
Сообщение от Nek1tПосмотреть сообщение
DWORD ctrladd

Лучше назовите CtrlTextCommandAddr, или подобно, ну чтоб понятно было что за адрес. По сути это адрес где лежит текстовая команда данного контрола в процессе игры.

Добавлено через 15 минут
Цитата:
Сообщение от vladoscom93Посмотреть сообщение
ну я думаю это к примеру так
Код:

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 в 01:53. Причина: Добавлено сообщение
  Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Hilling (04.01.2015), vladoscom93 (27.07.2012)
Старый 25.07.2012, 17:35   #8
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 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, 20:17   #9
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Перед while mass[i]<>'' do
ставьте name:='';
иначе при проверке следующего окна там уже будет находиться предыдущее имя, и плюсоваться будет к нему, в итоге имя будет состоять из имени нескольких окон, а такого имени естественно нет, потому окно не найдётся. Кстати почему то при не найденном окне не хочет оканчиваться цыкл, видимо в последнем окне указатель на следующее окно не стоит в nil, странно.. я на ноль проверяю, и вроде всё норм..
А так все кнопки нажимает, кроме выхода на странице логина, не в курсе почему. А почему бы не выходить из самой игры а не из окна логина?

Добавлено через 10 минут
поставил везде while (addr<>0) do.., так вроде цикл нормально завершается, если окно не найдено
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 25.07.2012 в 20:28. Причина: Добавлено сообщение
  Ответить с цитированием
Пользователь сказал cпасибо:
vladoscom93 (27.07.2012)
Старый 25.07.2012, 20:53   #10
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 23.02.2011
Сообщений: 19
Популярность: 18
Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

все работает) мне главное было нажать на кнопку выбора сервера)
  Ответить с цитированием
Старый 25.07.2012, 22:09   #11
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Цитата:
Сообщение от vladoscom93Посмотреть сообщение
выбора сервера)

чую назревающую огромную кучу вопросов))
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Пользователь сказал cпасибо:
vladoscom93 (27.07.2012)
Старый 25.07.2012, 23:22   #12
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 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 в 18:57. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.07.2012, 22:25   #13
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Зачем число то инжектить)? мы ведь используем само это число, а не указатель на него, как при работе с текстом). Можно смело "пихать" его в структуру без предварительного инжекта в память.
Код:
num:=3;
       textptr:=CtrlEditTextPtr(WinStruct('Win_LoginServerList'), 22);
       WriteProcessMemory(hProcess, ptr(textptr), @num, 1,rw);
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Пользователь сказал cпасибо:
vladoscom93 (27.07.2012)
Старый 27.07.2012, 04:08   #14
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 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, 10:24   #15
 Пехотинец
Аватар для dwa83
 
dwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небеdwa83 лучик света в грозовом небе
Регистрация: 21.03.2012
Сообщений: 82
Популярность: 727
Сказал(а) спасибо: 17
Поблагодарили 97 раз(а) в 52 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

Чтобы считать Caption а не указатель на неё
result := Read_32(addr + $13FC); - адрес текста(адрес в указателе)
а не
result := addr + $13FC; - адрес указателя(адрес адреса)
Но вопрос состоит в другом.. Почему у листбокса пустой caption..
И мой ответ - хз, хотя мне говорили, что тут должно лежать значение выделенного элемента, но видимо ошиблись.

А вообще, для какой конкретной цели всё это делаете?
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 27.07.2012 в 10:27.
  Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Функция Xaker-style Общение разработчиков 7 16.03.2012 21:36
[Обсуждение] Функция Магнит ˆGeFoRcEˆ Общение и обсуждение, архив Point Blank 5 07.01.2012 11:50
[Помогите!] Функция открытия Rakim Вопросы и ответы, обсуждения 1 23.07.2011 10:40
[Информация] Функция открыта Vadimka999 Общение и обсуждение, архив Point Blank 5 10.05.2010 19:58

www.webmoney.ru
Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 06:07.

Пишите нам: forum@zhyk.ru
Copyright © 2019 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net