Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

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

-

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

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

Ответ
 
Опции темы
Старый 18.07.2012, 22:52   #1
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 324 раз(а) в 104 сообщениях
 
По умолчанию [Инжект] Функция для работы с 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; 18.07.2012 в 23:25.
  Ответить с цитированием
4 пользователя(ей) сказали cпасибо:
/GeG/ (25.07.2012), Nek1t (18.07.2012), pw.lancer (08.08.2013), vladoscom93 (27.07.2012)
Старый 19.07.2012, 15: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, 12: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, 15: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 в 15:18.
  Ответить с цитированием
Старый 21.07.2012, 11:58   #5
-= Мастер Света =-
 Рыцарь-капитан
Аватар для krukovis
 
krukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нацииkrukovis гордость нации
Регистрация: 07.10.2009
Сообщений: 496
Популярность: 2687
Сказал(а) спасибо: 64
Поблагодарили 324 раз(а) в 104 сообщениях
 
По умолчанию 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, 13: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, 00:10   #7
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию 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 в 00:53. Причина: Добавлено сообщение
  Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Hilling (04.01.2015), vladoscom93 (27.07.2012)
Старый 25.07.2012, 16: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, 19:17   #9
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 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пасибо:
vladoscom93 (27.07.2012)
Старый 25.07.2012, 19:53   #10
 Разведчик
Аватар для vladoscom93
 
vladoscom93 никому не известный тип
Регистрация: 23.02.2011
Сообщений: 19
Популярность: 18
Сказал(а) спасибо: 30
Поблагодарили 4 раз(а) в 2 сообщениях
 
По умолчанию Re: [Инжект] Функция для работы с GUI

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

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

чую назревающую огромную кучу вопросов))
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Пользователь сказал cпасибо:
vladoscom93 (27.07.2012)
Старый 25.07.2012, 22: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 в 17:57. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.07.2012, 21:25   #13
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 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пасибо:
vladoscom93 (27.07.2012)
Старый 27.07.2012, 03: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, 09:24   #15
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 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.
  Ответить с цитированием
Ответ


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

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

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

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

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

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

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net