 |
Проблема с поиском бвзовых адресов клиента. - Разработка ПО для Perfect World - Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World |
26.02.2024, 23:12
|
#1
|
|
|
|
|
|
Разведчик
|
 Регистрация: 24.10.2010
 Сообщений: 7
 Популярность: 12
 Сказал(а) спасибо: 1
Поблагодарили 1 раз в 1 сообщении
|
Проблема с поиском бвзовых адресов клиента.
Ищу с помощью чит инжин, нахожу статические зелененькие адреса, но они выглядят странно, например elementclient.exe + 0089DC20. По началу все работает, но потом либо они вообще исчезают, либо по этому адресу в памяти находиться 0 а не следующий адрес. Подскажите хотя-бы что это за защита, что-бы я нагуглил. Спасибо.
Добавлено через 13 часов 0 минут
Нагуглил это ASLR (address space layout randomization), подскажите как ее обойти. Тут еще кто-то остался кто шарит?
Последний раз редактировалось sasha21l(№2 ); 27.02.2024 в 12:13.
Причина: Добавлено сообщение
|
|
|
|
14.09.2024, 05:09
|
#2
|
|
|
|
|
|
Разведчик
|
 Регистрация: 01.07.2009
 Сообщений: 24
 Популярность: 83
 Сказал(а) спасибо: 33
Поблагодарили 14 раз(а) в 11 сообщениях
|
Re: Проблема с поиском бвзовых адресов клиента.
 |
Цитата: |
 |
|
|
 |
Сообщение от sasha21l(№2 ) |
 |
|
|
|
|
|
|
|
|
Ищу с помощью чит инжин, нахожу статические зелененькие адреса, но они выглядят странно, например elementclient.exe + 0089DC20. По началу все работает, но потом либо они вообще исчезают, либо по этому адресу в памяти находиться 0 а не следующий адрес. Подскажите хотя-бы что это за защита, что-бы я нагуглил. Спасибо.
Добавлено через 13 часов 0 минут
Нагуглил это ASLR (address space layout randomization), подскажите как ее обойти. Тут еще кто-то остался кто шарит?
|
|
 |
|
 |
|
Код:
unit uOFFSETS;
uses
Winapi.Windows, System.SysUtils, Vcl.Forms, TLHelp32;
////////////////////////////////////////////////////////////////////////////////
function GetBase:Dword;
const
procName = 'ElementClient.exe';
var
m_pID: integer;
module: TModuleEntry32;
//****************************************************************************
procedure GetPID;
var
snapshot: THandle;
pInfo: PROCESSENTRY32;
begin
snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pInfo.dwSize := sizeof(PROCESSENTRY32);
if (Process32First(snapshot, pInfo)) then
begin
while (Process32Next(snapshot, pInfo)) do
begin
if UpperCase(pInfo.szExeFile) = UpperCase(procName) then
begin
m_pID := pInfo.th32ProcessID;
CloseHandle(snapshot);
exit;
end;
end;
end;
m_pID := 0;
CloseHandle(snapshot);
exit;
end;
//****************************************************************************
function GetModuleInfo(const module_name: PChar; main_process: boolean): TModuleEntry32;
var
snapshot: THandle;
module: TModuleEntry32;
begin
snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_pID);
module.dwSize := sizeof(TModuleEntry32);
if (Module32First(snapshot, module)) then
begin
if (main_process) then
begin
CloseHandle(snapshot);
result := module;
end;
while (Module32Next(snapshot, module)) do
begin
if (StrIComp(PChar(ExtractFileName(module.szModule)), PChar(module_name)) = 0) then
begin
CloseHandle(snapshot);
result := module;
end;
end;
end;
result := module;
end;
//******************************************************************************
begin
GetPID;
if m_pID<>0 then
begin
module := GetModuleInfo(nil, true);
module_hModule := module.hModule; // В классике 0х00400000, в реале всегда разный
Result := module.hModule + $BD6450; // Base Addr
// $BD6450 - не меняеться, или меняеться с обновой.
// Найди BA, отними hModule -получишь это смещение.
// С остальными так же (WalkCall, PackCall, SkillCall, OnlineFlag etc...)
// Game := module.hModule + $BD98CC; // $400000+$BD98CC = GameAddr (BA+$1C)
// Base := module.hModule + $BD6450; // BA
end;
Последний раз редактировалось krysun; 15.09.2024 в 13:29.
Причина: Уточнение версии
|
|
|
|
18.10.2024, 01:14
|
#3
|
|
|
|
|
|
Разведчик
|
 Регистрация: 01.07.2009
 Сообщений: 24
 Популярность: 83
 Сказал(а) спасибо: 33
Поблагодарили 14 раз(а) в 11 сообщениях
|
Re: Проблема с поиском бвзовых адресов клиента.
Вопрос был в другом у автора топика.
У него сам по себе меняется базовый.
По факту меняет смещение базового, т.к. сам Хидер модуля не стандартный (или постоянный) как у большинства EXE-шников (точка входа в само приложение, или может, как-то по другому по умному называется) не 400000, а меняется при переподключении, или перезагрузке компа, или хз от чего оно зависит.
Саму функцию выше написал, а базовый (постоянный) по ПОСТОЯННОМУ смещению всегда на своем месте. До обновы, конечно)
---
ПыСы: Клиент камбэк (обе версии)
Последний раз редактировалось krysun; 18.10.2024 в 01:17.
|
|
|
|
18.10.2024, 21:36
|
#4
|
|
|
|
|
|
Разведчик
|
 Регистрация: 12.07.2022
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Проблема с поиском бвзовых адресов клиента.
Поняла, про что вы говорите.
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
У него сам по себе меняется базовый |
|
 |
|
 |
|
Да, меняется адрес исполняемого файла ".exe"
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
PE-файл может быть загружен по адресу, отличному от того, для которого он был создан (это свойство называется перемещаемостью), при этом система автоматически корректирует все ссылки на абсолютные адреса, заменяя их новыми значениями. В результате образ файла в памяти не будет соответствовать тому, что записано на диске. И это происходит после каждой перезагрузки системы, а порой даже перезапуска приложения. Всякий раз PE-файл помещается по новому адресу.
Вдобавок к этому если раньше (до «Висты») системный загрузчик мог перемещать только DLL (в то же время, если ему не удавалось разместить в памяти по заданным адресам .exe, Windows выдавала ошибку загрузки модуля), то теперь исполняемые файлы тоже подвержены перемещению. |
|
 |
|
 |
|
В Engine ПКМ по любому найденному адресу->Dissasemble this memory region->Tools->Dissect PE Headers.
На С++ код выглядит примерно аналогично вашему.
На пилоте можно проще, Сtrl+A по окну и:
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
--lua
function getExeAddress()
return relativeaddress2absolute("elementclient.exe")
end |
|
 |
|
 |
|
Ну и, соответственно, значение берется как-то так:
[ [ getExeAddress()(меняется каждый раз при перезапуске игры)+ оффсет до игры, инстанс класса CECGameRun(меняется каждый раз при обнове) ] + оффсет до персонажа(условно постоянный) ] + оффсет до ХП(условно постоянный)
 как-то не было таких проблем, поэтому не поняла вопрос.
Добавлено через 1 час 19 минут
Если автор искал в Engine при добавлении в список адресов "elementclient.exe" он в любом случае корректно адрес выдаст для модуля. По-моему просто неправильно нашли статический базовый адрес / или напоролись на структуру у которой смещение определяется по значениям из регистров
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
По началу все работает, но потом либо они вообще исчезают, либо по этому адресу в памяти находиться 0 а не следующий адрес |
|
 |
|
 |
|
Скорее всего, автор искал что-то в массиве или хэшмапе
Последний раз редактировалось LOLyta111; 18.10.2024 в 23:00.
Причина: Добавлено сообщение
|
|
|
|
Вчера, 12:38
|
#5
|
|
|
|
|
|
Разведчик
|
 Регистрация: 01.07.2009
 Сообщений: 24
 Популярность: 83
 Сказал(а) спасибо: 33
Поблагодарили 14 раз(а) в 11 сообщениях
|
Re: Проблема с поиском бвзовых адресов клиента.
Защита ASLR менят базовый адрес. Его не нужно искать, а просто взять, как написал в примере выше.
Или вот пример на C#:
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
class WinAPI
{
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
[DllImport("user32.dll")]
public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
byte[] lpBuffer,
int dwSize,
out int lpNumberOfBytesRead);
public const uint PROCESS_VM_READ = 0x0010;
public const uint PROCESS_QUERY_INFORMATION = 0x0400;
}
class ProcessHelper
{
public static IntPtr GetBaseAddress(uint pid)
{
Process proc = Process.GetProcessById((int)pid);
return proc.MainModule.BaseAddress;
}
}
class GameFinder
{
public static List<GameWindow> FindAll()
{
List<GameWindow> result = new List<GameWindow>();
WinAPI.EnumWindows(delegate(IntPtr hWnd, IntPtr lParam)
{
StringBuilder className = new StringBuilder(256);
WinAPI.GetClassName(hWnd, className, className.Capacity);
if (className.ToString() == "ElementClient Window")
{
uint pid;
WinAPI.GetWindowThreadProcessId(hWnd, out pid);
IntPtr hProcess = WinAPI.OpenProcess(
WinAPI.PROCESS_VM_READ | WinAPI.PROCESS_QUERY_INFORMATION,
false,
pid);
if (hProcess != IntPtr.Zero)
{
GameWindow gw = new GameWindow();
gw.hWnd = hWnd;
gw.PID = pid;
gw.ProcessHandle = hProcess;
gw.BaseAddress = ProcessHelper.GetBaseAddress(pid);
result.Add(gw);
}
}
return true;
}, IntPtr.Zero);
return result;
}
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
List<GameWindow> games = GameFinder.FindAll();
foreach (GameWindow game in games)
{
//string name = ReadPlayerName(game);
//richTextBox1.AppendText("NAME = " + name + "\n");
//int hp = ReadHP(game);
//richTextBox1.AppendText("HP = " + hp + "\n");
richTextBox1.AppendText("HWND: 0x" + game.hWnd.ToString("X") + "\n");
richTextBox1.AppendText("PID: " + game.PID + "\n");
richTextBox1.AppendText("BaseAddress: 0x" + game.BaseAddress.ToString("X") + "\n");
}
} |
|
 |
|
 |
|
Т.е., адрес модуля + тот что дописывается в "зелёном" найденом и есть базовый.
Замечу - не читать цепочку (модуль -> добавочный), а именно сумма. Дальше как обычно читаем по цепочке.
Ваш найденый
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
|
elementclient.exe + 0089DC20 |
|
 |
|
 |
|
Это адрес модуля elementclient.exe (например=1СС00000) + 0089DC20 = 1D49DC20 и есть базовый.
1D49DC20+1С - (уже указатель на игровой)
ASLR меняет именно 1СС00000. Он все время разный. А то что плюсуеться (0089DC20)- статичен)
...
Последний раз редактировалось krysun; Вчера в 12:43.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 16:45.
|
 |