Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2009, 22:20   #51
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Блин, уважаемые, почитайте хотя-бы Флёнова чтоли, не рановато ли инлайн-патчи делать?

Код:
  HandleWindow :=FindWindow(nil, 'name');
  if(HandleWindow  <> 0) then
  begin
    GetWindowThreadProcessId(HandleWindow  ,@ProcessId);
    h := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
    if(h <> 0) then
    begin
        // buf: DWORD;
        addr := GetModuleBase(ProcessId, 'game.dll')+$8EDDC8;
        if(ReadProcessMemory(h, Pointer(addr), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then
        begin
          // о да прочитали... теперь ваше 4х байтовое значение в buf
        end;
      CloseHandle(h);
    end;
addr переименуйте как-нибудь, это в делфях имя функции - задолбаетесь ошибки потом искать. И там PROCESS_ALL_ACCESS - чтоб в чужой процесс лезть с такими намерениями, хорошо бы сначала получить привилегии отладки
Код:
procedure GetDebugPrivileges;
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  retval: dword;
begin
  if  (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or  TOKEN_QUERY, hToken)) then
  begin
    if not LookupPrivilegeValue(nil, 'SeDebugPrivilege'  , tkp.Privileges[0].Luid) then
      Win32Check(false);
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if not AdjustTokenPrivileges(hToken, false, tkp, 0, nil, retval) then
      Win32Check(false);
  end
  else
    Win32Check(false)
end;
пыщь
JTG вне форума Ответить с цитированием
Старый 21.11.2009, 15:50   #52
Niklan
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 55
По умолчанию

Вот опять траблы. Другой метод выщитать то что нам надо из памяти.
Цитата:
pointer = game.dll + 0x62EB7
pointre2 = pointer + 0x1C4
result = pointer2 + 0x34
сделал по примеру выше, вставил в код и вот что получилось
Цитата:
address := GetModuleBase(ProcessId, 'Game.dll')+$62EB7;
address2:= GetModuleBase(ProcessId, 'address')+$1C4;
address3:= GetModuleBase(ProcessId, 'address2')+$34;
HandleWindow :=FindWindow(nil, 'name');
if(HandleWindow <> 0) then
GetWindowThreadProcessId(HandleWind ow ,@ProcessId);
h := OpenProcess(PROCESS_ALL_ACCESS,Fals e,ProcessId);
if(h <> 0) then
begin
// buf: DWORD;

if(ReadProcessMemory(h, Pointer(address3), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then
begin

Label27.Caption:=IntTostr(buf);

end;
CloseHandle(h);
end;
Но он не срабатывает
address2,3 в варе есть, тип dword.
мне кажется на 2ой и 3ей строке не нужны processid а что-то другое.

Последний раз редактировалось Niklan; 21.11.2009 в 16:05.
Niklan вне форума Ответить с цитированием
Старый 21.11.2009, 16:14   #53
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34
думать иногда надо что пишите(я про ваш код).
вы ищите модуль вместо того чтоб переменные брать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.11.2009, 16:35   #54
Niklan
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34
думать иногда надо что пишите(я про ваш код).
вы ищите модуль вместо того чтоб переменные брать.
а ваш код тоже не работает...
Niklan вне форума Ответить с цитированием
Старый 21.11.2009, 17:05   #55
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
HandleWindow :=FindWindow(nil, 'name');
if(HandleWindow <> 0) then GetWindowThreadProcessId(HandleWind ow ,@ProcessId);
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34;
h := OpenProcess(PROCESS_ALL_ACCESS,Fals e,ProcessId);
if(h <> 0) then
begin
// buf: DWORD;
if(ReadProcessMemory(h, Pointer(address3), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then
begin
Label27.Caption:=IntTostr(buf);
end;
CloseHandle(h);
странный у вас порядок действий в коде был.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.11.2009, 17:14   #56
Niklan
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
HandleWindow :=FindWindow(nil, 'name');
if(HandleWindow <> 0) then GetWindowThreadProcessId(HandleWind ow ,@ProcessId);
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34;
h := OpenProcess(PROCESS_ALL_ACCESS,Fals e,ProcessId);
if(h <> 0) then
begin
// buf: DWORD;
if(ReadProcessMemory(h, Pointer(address3), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then
begin
Label27.Caption:=IntTostr(buf);
end;
CloseHandle(h);
странный у вас порядок действий в коде был.
от этого ничего не изменилось, все равно не работает
Niklan вне форума Ответить с цитированием
Старый 21.11.2009, 17:37   #57
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
HandleWindow :=FindWindow(nil, 'name');
if(HandleWindow <> 0) then GetWindowThreadProcessId(HandleWind ow ,@ProcessId);
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34;
h := OpenProcess(PROCESS_ALL_ACCESS,Fals e,ProcessId);
if(h <> 0) then
 begin
  // buf: DWORD;
  if(ReadProcessMemory(h, Pointer(address3), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then Label27.Caption:=IntTostr(buf);
 end;
 else ShowMessage('Ошибка');
CloseHandle(h)
сообщение вылетит или нет?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.11.2009 в 17:45. Причина: исправил код.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.11.2009, 17:59   #58
Niklan
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
HandleWindow :=FindWindow(nil, 'name');
if(HandleWindow <> 0) then GetWindowThreadProcessId(HandleWind ow ,@ProcessId);
address3:=GetModuleBase(ProcessId, 'Game.dll')+$62EB7+$1C4+$34;
h := OpenProcess(PROCESS_ALL_ACCESS,Fals e,ProcessId);
if(h <> 0) then
 begin
  // buf: DWORD;
  if(ReadProcessMemory(h, Pointer(address3), @buf, sizeof(DWORD), outbytes) and (outbytes = sizeof(DWORD))) then Label27.Caption:=IntTostr(buf);
 end;
 else ShowMessage('Ошибка');
CloseHandle(h)
сообщение вылетит или нет?
ошибка не вылетает, но значение он показывал и раньше. Но он показывает не правильно. Ибо если убрать +$1C4+$34, Значение особо и не изменится, там максимум 10000 может быть, а он миллиард показывается

Вообще понять не могу.
7 адресов имеют вид:
Game.dll+4F5874
Но если к ним например прибавить 0х018 то уже получит то что нужно, но прибавляя не получаю того что нужно.
Т.е. к Game.dll+4F5874 надо прибавить смещение 018. Уже мозг поломали понять не можем.

Последний раз редактировалось Niklan; 21.11.2009 в 21:28.
Niklan вне форума Ответить с цитированием
Старый 21.11.2009, 23:06   #59
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Потому что методом научного тыка тут нифига не сделать. По порядку:

GetModuleBase(ProcessId, 'Game.dll') возвращает базовый адрес загрузки Game.dll в процессе ProcessId - место в памяти, где лежит первый байт библиотеки, т.е. то самое "Game.dll+". Это значение может быть при каждом запуске разное.

Если в библиотеке есть статическая переменная - её значение будет лежать в памяти по адресу game.dll+X, где X - константа.

Если переменная динамическая - Х хранит адрес указателя. В этом случае сначала находят этот адрес (var pi: PInteger), затем читают значение на которое он показывает (integer_value = pi^, и это значение, кстати, тоже может быть указателем и т.д.)

Код:
Pointer1Addr := GetModuleBase(ProcessId, 'Game.dll')+$62EB7;
Pointer2Addr := dword(ptr(Pointer1Addr)^)+$1C4;
value := dword(ptr(Pointer2Addr)^)+$34;
Только вот в режиме телепатии я не могу определить что такое $1C4, $34 - это адрес следующего указателя или смещение поля в какой-то структуре или вообще константа
пыщь
JTG вне форума Ответить с цитированием
Старый 21.11.2009, 23:38   #60
Niklan
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 55
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Потому что методом научного тыка тут нифига не сделать. По порядку:

GetModuleBase(ProcessId, 'Game.dll') возвращает базовый адрес загрузки Game.dll в процессе ProcessId - место в памяти, где лежит первый байт библиотеки, т.е. то самое "Game.dll+". Это значение может быть при каждом запуске разное.

Если в библиотеке есть статическая переменная - её значение будет лежать в памяти по адресу game.dll+X, где X - константа.

Если переменная динамическая - Х хранит адрес указателя. В этом случае сначала находят этот адрес (var pi: PInteger), затем читают значение на которое он показывает (integer_value = pi^, и это значение, кстати, тоже может быть указателем и т.д.)

Код:
Pointer1Addr := GetModuleBase(ProcessId, 'Game.dll')+$62EB7;
Pointer2Addr := dword(ptr(Pointer1Addr)^)+$1C4;
value := dword(ptr(Pointer2Addr)^)+$34;
Только вот в режиме телепатии я не могу определить что такое $1C4, $34 - это адрес следующего указателя или смещение поля в какой-то структуре или вообще константа
Кароче вот надо что.
Game.dll+$4F5874 всегда одна и таже, но в неё же хранится разная информация, и чтобы её получить нужно сделать смещение как я понял.
Например чтобы получить жизни нужно сделать смещение 0х034, чтобы получить имя нужно сместить 0х036.
Если сместить он выдаст значение. В проге чит енгин он выдает, в делфи непоняли как сделать.

Цитата:
address := GetModuleBase(ProcessId, 'Game.dll')+$4F5874;
address2 := dword(ptr(address)^)+$034;
Безрезультатно, еррор при компиляции
address,2 : dword;
Вот жизни и имя
Кликнув на P->????? он выдает то что на сером фоне.
Niklan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
внедрение MatLab в Web-приложения Honey JavaScript, Ajax 2 27.05.2009 20:52
Внедрение кода в EXE prizrak1390 Общие вопросы Delphi 16 07.05.2008 08:10
Внедрение звука WAW/MP3 в файл GAGARIN-NEW Мультимедиа в Delphi 26 02.04.2008 13:52
Внедрение ActiveX компонент в проект D@rk M@k Общие вопросы Delphi 5 29.01.2008 19:40
внедрение Delphi приложения в КПК shkiper Общие вопросы Delphi 2 05.04.2007 20:59