Перейти к содержанию

Cheat Engine. Поиск указателей без бейкпоинтов


pachela

Рекомендуемые сообщения

Возможно ли найти указатели на адрес без возможностей ставить брейкпоинты? Прикол в том,что в игре стоит защита от отладки и любая попытка приаттачиться заканчивается закрытием отладчика и баном. Отладчик в СЕ работает, но только из режима ядра, но беда в том, что защита игры подгружает хуки в ring3 на установку брейкпоинтов. Пытался снимать руками эти хуки, выбираю адрес и жму F6, окно открывается, но после манипуляций в игре, оно остается пустым.

Если открыть карту памяти (Memmory Viewer) то в окошке с инструкциями вся инфа высвечивается, но опять же, выставив брейкпоинт на доступ окошко снова пустое.

Короче вопрос в следующем: Можно ли через окошко асемблера (то где написаны инструкции) найти ручками и глазками нужные указатели?

Ссылка на комментарий
Поделиться на другие сайты

Благо я баны не получаю , но приатачиться тоже не могу...
Тут моя тема:


- Буду следить за вашим выходом из ситуации

Изменено пользователем Kakdakak
Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, pachela сказал:

Короче вопрос в следующем: Можно ли через окошко асемблера (то где написаны инструкции) найти ручками и глазками нужные указатели?

Думаю, что без постановки бряков, не получиться. Лично я не знаю таких способов.

Ссылка на комментарий
Поделиться на другие сайты

Можно тупо дампить всю память процесса, если на  это он вдруг не ругается. Затем - руками, долго и муторно перебирать весь дамп. После N попыток и N дампов указатель должен без проблем найтись, но, думаю, это не стоит затраченных ресурсов. Вряд ли игра умеет противодействовать всем возможным способам прочитать ее память.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Зачем руками? Есть в артемоне поиск по файлам, например. Или, в про версии - поиск по формуле. Там тоже сначала снимаются дампы памяти, а потом сравниваются по формуле. В этом случае, я думаю, может что-то получиться.

Ссылка на комментарий
Поделиться на другие сайты

2 hours ago, Xipho said:

Зачем руками? Есть в артемоне поиск по файлам, например. Или, в про версии - поиск по формуле. Там тоже сначала снимаются дампы памяти, а потом сравниваются по формуле. В этом случае, я думаю, может что-то получиться.

 

Как худший вариант, когда ничего больше не работает. Да и для общего развития полезно такие вещи самому делать хоть иногда.

Ссылка на комментарий
Поделиться на другие сайты

 

В 22.08.2016в12:20, pachela сказал:

Возможно ли найти указатели на адрес без возможностей ставить брейкпоинты?

 

Возможно. Сканер указателей или поиск по дампам.

 

В 22.08.2016в12:20, pachela сказал:

Короче вопрос в следующем: Можно ли через окошко асемблера (то где написаны инструкции) найти ручками и глазками нужные указатели?

 

 

Без отладчика, брейкпоинтов, трассировки проблематично. Инструкций обычно очень много и в них можно найти обращения к статическим адресам из найденных указателей. По статическим адресам можно просмотреть обращения по смещениям, но куда следовать по коду и по каким смещениям надо изучать более детально в IDA, смотреть структуры одновременно. Можешь использовать декомпилятор плагин в IDA, тоже может помочь.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Xipho сказал:

Зачем руками? Есть в артемоне поиск по файлам, например. Или, в про версии - поиск по формуле. Там тоже сначала снимаются дампы памяти, а потом сравниваются по формуле. В этом случае, я думаю, может что-то получиться.

Какой артмани? Если стоит защита от отладки, то можно было догадаться, что артмани 100% работать не будет, т.к. от нее тоже защита. СЕ тоже получается запустить только после танцев с бубном.

12 минуты назад, MasterGH сказал:

 

 

Возможно. Сканер указателей или поиск по дампам.

 

 

Без отладчика, брейкпоинтов, трассировки проблематично. Инструкций обычно очень много и в них можно найти обращения к статическим адресам из найденных указателей. По статическим адресам можно просмотреть обращения по смещениям, но куда следовать по коду и по каким смещениям надо изучать более детально в IDA, смотреть структуры одновременно. Можешь использовать декомпилятор плагин в IDA, тоже может помочь.

Сканер указателей не хочет давать результаты. Просто зависает процесс игры и СЕ. А если после 100500 попытки не зависает, то все равно результатов нет. =(

Я посмотрел, есть кое какие люди которые для этой игры трейнеры рисуют, но они же в приватной беседе говорят, что отладчик заставить работать с этой защитой нереально (на 99%, за 1% шанса возьмут 15-20к рублей и гарантий не дадут) и что они трейнера пишут не через отладчик.

Ссылка на комментарий
Поделиться на другие сайты

Еще вариант - попробовать переименовать файл СЕ и, через тот же Resource Hacker или Restorator (или же поиском и отладкой), заголовок главного окна. Возможно, детект происходит именно по этим параметрам. Или, тоже вариант, поставить хук на функции чтения из памяти, чтобы убедиться, что целевая игра их не хукала.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Xipho сказал:

Еще вариант - попробовать переименовать файл СЕ и, через тот же Resource Hacker или Restorator (или же поиском и отладкой), заголовок главного окна. Возможно, детект происходит именно по этим параметрам. Или, тоже вариант, поставить хук на функции чтения из памяти, чтобы убедиться, что целевая игра их не хукала.

Ну хук то можно поставить, но я не умею. А вот переименовка процесса и т.п. не помогает. В особенности когда загружен драйвер dbk64.sys, для работы с ядром. Без ядра, вообще СЕ не работает.

Ссылка на комментарий
Поделиться на другие сайты

В 27.08.2016в09:39, keng сказал:

 Так это, что за игра-то? Без названия можно долго тыкать пальцем в небо, а так хоть попробовать можно что-то сделать.

В паблике этого не могу написать.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Появились новые соображения, но опять таки, я не сильно знакомы со ВСЕМИ функциями СЕ, но думаю что есть нечто подобное в нем, либо у кого то в наработках.

Т.к. у меня окно асемблера работает, то я могу снять дамп куска памяти. Так вот как мне сообщил один "умник" который делает трейнера для игры, он делает их при помощи автоматического сравнения дампов.

Может кто подсказать как сравнивать дампы и что в них искать?

Ссылка на комментарий
Поделиться на другие сайты

18 час назад, Dino сказал:

у тебя Veh Debugger палится игрой? 

Вообще СЕ палится, но после своей сборки, то с танцами с бубном получается запустить. Дебаггер вроде бы не палится, но ни один, кроме Kernelmod не аттачится к процессу, а последний, так и после аттача не работает. В игре стоят хуки на брекпоинты. Но самое интересное, что я вижу окно ассемблера.

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, pachela сказал:

Вообще СЕ палится, но после своей сборки, то с танцами с бубном получается запустить. Дебаггер вроде бы не палится, но ни один, кроме Kernelmod не аттачится к процессу, а последний, так и после аттача не работает. В игре стоят хуки на брекпоинты. Но самое интересное, что я вижу окно ассемблера.

Veh Debugger  не может не работать, но с ним могут возникнуть пару нюансов. Для работы он должен загрузить свой модуль в адресное пространство игры, а затем уже проинициализироваться, этого не случится если :

a) В игре установлены хуки(как ты уже подметил) на такие функции как LoadLibrary, LoadLibraryEx, LdrLoadDll, в этом случае нужно вернуть оригинальные байты пролога, в общем то ничего сложного.. если конечно в игре не стоит контроль за целостностью памяти

б) Защита игры мониторит загруженные в нее модули и  в случае обнаружения постороннего - бан/вылет и все в этом духе. 

 

 

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Dino сказал:

Veh Debugger  не может не работать, но с ним могут возникнуть пару нюансов. Для работы он должен загрузить свой модуль в адресное пространство игры, а затем уже проинициализироваться, этого не случится если :

a) В игре установлены хуки(как ты уже подметил) на такие функции как LoadLibrary, LoadLibraryEx, LdrLoadDll, в этом случае нужно вернуть оригинальные байты пролога, в общем то ничего сложного.. если конечно в игре не стоит контроль за целостностью памяти

б) Защита игры мониторит загруженные в нее модули и  в случае обнаружения постороннего - бан/вылет и все в этом духе. 

 

 

Я пробовал снимать через PCHunter хуки на брекпоинты (название хуков сейчас не припомню и нет возможности подсмотреть в шпаргалку), ничего это не дало. Значения то изменились, но от этого дебаггеры не стали работать.

В общем то поснимал я несколько раз дампы памяти и через dissect data\structure сравнил их. В том месте где находятся нужный мне адрес, присутствуют некоторые поинтеры и просто значения, которые не меняются. Можно ли как то опираясь на эти адреса, находить мой адрес? Может написать трейнер который будет искать поинтер такой то, от него отсупать на сколько то там байт и изменять значение в нужном адресе? Либо имея кучу дампов, можно ли как то найти оффсеты?

Ссылка на комментарий
Поделиться на другие сайты

17 час назад, pachela сказал:

Я пробовал снимать через PCHunter хуки на брекпоинты (название хуков сейчас не припомню и нет возможности подсмотреть в шпаргалку), ничего это не дало. Значения то изменились, но от этого дебаггеры не стали работать.

В общем то поснимал я несколько раз дампы памяти и через dissect data\structure сравнил их. В том месте где находятся нужный мне адрес, присутствуют некоторые поинтеры и просто значения, которые не меняются. Можно ли как то опираясь на эти адреса, находить мой адрес? Может написать трейнер который будет искать поинтер такой то, от него отсупать на сколько то там байт и изменять значение в нужном адресе? Либо имея кучу дампов, можно ли как то найти оффсеты?

Хуки которые снимал - не помнишь, название игры - не скажешь, элементарно скинуть текст ошибки - не можешь. Слишком мало информации для оказания помощи.

Без бряков искать цепочку указатели это мудацтво. В крайнем случае можешь воспользоваться встроенным PointerScan, но он неточный, жрет много ресурсов и долгий. 

 

Поснимал несколько раз дампы памяти? :D А какова вероятность что часть поинтеров не попало в твой дамп? Или ты считаешь что поинтеры лежать всегда друг за другом?:D Да даже если и лежали бы, то ты этого все равно не смог узнать. Можно еще сдампить весь процесс при помощи того же PeTools, затем загнать этот дамп в IDA Pro(тк у нее есть фишка - показывает цепочку вызовов функций), но для этого тебе все равно нужно знать адрес  конечной инструкции, которая пишет в твой адрес. Это очень трудоемкий процесс, тк нужно все регистры и стек в голове держать.

Ссылка на комментарий
Поделиться на другие сайты

Хук стоит DbgUiRemoteBreakin его античит ставит на ntdll.dll, попробовал познакомиться с Идой и заглянул в ntdll.dll и по адресу хука увидел "Trap to Debbugger", а рядышком была еще одна занятная функция DbgBreakPointWithStatus@4 endp; sp-analys failed. короче если бы я был хорошим кодером, я бы попытался подставить в DbgBreakPointWithStatus положительный ответ. Предполагаю что возможно это помогло бы, но я не тру кодер.

Так же еще раз вернусь к вопросу выше: можно ли опираясь на несколько соседних байт, которые имеют перманентные значения (либо содержат поинтеры, левые, но поинтеры, всегда одни и те же) найти нужный мне адресс, который находится всегда на одном и том же расстоянии от этих перманентных значений.

Ссылка на комментарий
Поделиться на другие сайты

То что ты перечислил должно защищать только от Windows Dbg

 

38 минуты назад, pachela сказал:

можно ли опираясь на несколько соседних байт, которые имеют перманентные значения (либо содержат поинтеры, левые, но поинтеры, всегда одни и те же) найти нужный мне адресс, который находится всегда на одном и том же расстоянии от этих перманентных значений.

Это называется паттерн. Можно. Гугли "сканер сигнатур".

 

Изменено пользователем Dino
Ссылка на комментарий
Поделиться на другие сайты

14 часа назад, Dino сказал:

То что ты перечислил должно защищать только от Windows Dbg

 

Это называется паттерн. Можно. Гугли "сканер сигнатур".

 

Я тебе больше скажу, что за ольку, античит сразу банит и не важно какие плагины ставлю. А вот за дбг64 нет, но что первый, что второй, без SilentAttach и Scylla вообще не хотели видеть процесс.

Сейчас посмотрю про паттерн и сканер сигнатур

Ссылка на комментарий
Поделиться на другие сайты

Без названия игры это все еще гадание на кофейной гуще. Автор, может хотя бы в лс название укажешь? Я никому не расскажу, честно!

Ссылка на комментарий
Поделиться на другие сайты

 

23 минуты назад, keng сказал:

Без названия игры это все еще гадание на кофейной гуще. Автор, может хотя бы в лс название укажешь? Я никому не расскажу, честно!

Ответил.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Нашел на одном буржуйском сайте исходник паттер сканер сигнатур.

Functions.h

Скрытый текст

#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>
#include <Psapi.h>

void MsgBoxAddy(DWORD addy)
{
 char szBuffer[1024];
 sprintf(szBuffer, "Addy: %02x", addy);
 MessageBox(NULL, szBuffer, "Title", MB_OK);

}

MODULEINFO GetModuleInfo( char *szModule )
{
 MODULEINFO modinfo = {0};
 HMODULE hModule = GetModuleHandle(szModule);
 if(hModule == 0) 
  return modinfo;
 GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
 return modinfo;
}


void WriteToMemory(uintptr_t addressToWrite, char* valueToWrite, int byteNum)
{
 unsigned long OldProtection;
 VirtualProtect((LPVOID)(addressToWrite), byteNum, PAGE_EXECUTE_READWRITE, &OldProtection);
 memcpy( (LPVOID)addressToWrite, valueToWrite, byteNum);
 VirtualProtect((LPVOID)(addressToWrite), byteNum, OldProtection, NULL);
}


DWORD FindPattern(char *module, char *pattern, char *mask)
{
 MODULEINFO mInfo = GetModuleInfo(module);
 DWORD base = (DWORD)mInfo.lpBaseOfDll;
 DWORD size =  (DWORD)mInfo.SizeOfImage;
 DWORD patternLength = (DWORD)strlen(mask);

 for(DWORD i = 0; i < size - patternLength; i++)
 {
  bool found = true;
  for(DWORD j = 0; j < patternLength; j++)
  {
   found &= mask[j] == '?' || pattern[j] == *(char*)(base + i + j);
  }
  if(found) 
  {
   return base + i;
  }
 }

 return NULL;
}

 

Source.cpp

Скрытый текст

#include <Windows.h>
#include <iostream>  
#include "Functions.h"

using namespace std;
char OpCode[] = "\xDB\x45";


void InitiateHooks()
{
  DWORD aAddy = FindPattern("s4client.exe",
  "\xD9\x45\x57\x8B\x7C\x24\x14\x8D\x74\x24\x28\xE8\x00\x00\x00\x00\x5F\x5E\xB0\x01",
  "xxxxxxxxxxxx????xxxx");
 aAddy += 5;


 MsgBoxAddy(aAddy);
 WriteToMemory(aAddy, OpCode, 4);
 
}
#pragma endregion

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL, 
    DWORD fdwReason, 
    LPVOID lpReserved) 
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
   InitiateHooks();
            break;
    }
    return TRUE;
}

 

Я с С++ знаком на уровне плинтуса (успел прочитать только 50 страниц Шилдт Г.С. С++ базовый курс). Но меня вот интересует этот код и хотелось бы его применить. Так вот. Что мне поменять и в какую сторону копать?

Я так понимаю что мне нужно поменять в DWORD aAddy = FindPattern("s4client.exe", название моего клиента?

Дальше   "\xD9\x45\x57\x8B\x7C\x24\x14\x8D\x74\x24\x28\xE8\x00\x00\x00\x00\x5F\x5E\xB0\x01", тут количество байт можно грубо подставлять свои или еще где в коде нужно указывать это? И почему нет 0 пере х? Я на сколько понял, что в шестнадцатеричной системе байт должен выглядеть 0хАА, а тут хАА, где я не прав?
Что это за секция?  "xxxxxxxxxxxx????xxxx"); Что значит эта запись? Что за ххх и что за "???" ?
 Это я так понимаю, что отступ от найденной сигнатуры aAddy += 5;? Т.е. отступаем 5 байт и видим нужный нам адрес? Который и будет виведен в MsgBox?

Далее, что это за опкод char OpCode[] = "\xDB\x45"? Зачем он нужен?

И последнее, в этой инструкции WriteToMemory(aAddy, OpCode, 4); что значит цифра 4?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.