FindPattern

Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
999
Реакции[?]
1,209
Поинты[?]
3K
Мой очень старый(2011-2012 год) туториал по поиску и работе с сигнатурами.Тутор делал для другого сайта, поэтому выглядит кривовато..(Скопировано как есть)
Пример на игре ПоинтБланк. Возможно кто-то подчерпнет для себя моменты...


Сканер адрессов:
Создаем новый проект:

Проект Win32


Тип проекта - Библтотека DLL
Доп.параметры - Пустой проект

Создаем фаил исходного кода(.срр) - ПКМ - Добавить - Создать элемент(или нажать Ctrl+Shift+A)



Подключаем нужные фаилы:
Код:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
Пишем точку входа(позже ее заполним)
Код:
BOOL WINAPI DllMain(HINSTANCE module, DWORD dwReason, LPVOID lpvReserved)
 {
 if (dwReason == DLL_PROCESS_ATTACH)
 {

 ExitProcess(0);//закрываем процесс
 }
 return true;
 }
Пока у нас только закрывается процесс при аттаче...

Не люблю когда все свалено в одном файле, поэтому создаем заголовочный файл(.h)

Я назвал его Hack.h... Подключаем его к главному фаилу проекта, дописав в нем
Код:
#include "Hack.h"
Теперь заполним этот фаил нужными нам функциями:
"ФиндПаттерн"
Код:
bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
 {
 for(;*szMask;++szMask,++pData,++bMask)
 if(*szMask=='x' && *pData!=*bMask) return 0;
 return (*szMask) == NULL;
 }
 DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
 {
 for(DWORD i=0; i<dwLen; i++)
 if (bCompare((BYTE*)(dwAddress+i),bMask,szMask)) return (DWORD)(dwAddress+i);
 return 0;
 }
"Работа с .txt
Код:
using namespace std;
ofstream ofile; 
char dlldir[320];

void __cdecl add_log (const char *fmt, ...)
 {
 if(ofile != NULL)
 {
 if(!fmt)
 { 
  return;
 }
 va_list va_alist;
 char logbuf[256] = {0};
 va_start (va_alist, fmt);
 _vsnprintf (logbuf+strlen(logbuf), sizeof(logbuf) - strlen(logbuf), fmt, va_alist);
 va_end (va_alist);
 ofile << logbuf << endl;
 }
 }
 char *GetDirectoryFile(char *filename)
 {
 static char path[320];
 strcpy(path, dlldir);
 strcat(path, filename);
 return path;
 }
Добавим еще два заголовочных фаила и включим их в проект:
Signature.h - здесь будем писать сигнатуры
PrintAdress.h - здесть будем записывать адресса в txt
Код:
#include "Signature.h"
#include "PrintAdress.h"
Заполняем(пример на ЕСП и АнтиСлеп):
Код:
 DWORD Flash = FindPattern(0x401000,0x4c8000,(PBYTE)"\x55\x8B\xEC\x83\xEC\x64\x89\x4D\xA4\x83\x7D\x08\x00","xxxxxxxxxxxxx");
 DWORD HP1 = FindPattern(0x401000,0x4c8000,(PBYTE)"\x0F\x85\x00\x00\x00\x00\x8D\x4D\x93","xx????xxx");
 DWORD HP2 = FindPattern(0x401000,0x4c8000,(PBYTE)"\x0F\x84\x00\x00\x00\x00\x8B\x85\x00\x00\x00\x00\x8B\x48\x10\xE8\x00\x00\x00\x00\x50","xx????xx????xxxx????x");
"PrintAdress.h"
Код:
void PrintLog()
{
  add_log("#define ESP1  0x%X",HP1);
  add_log("#define ESP2  0x%X",HP2);
  add_log("#define NoFlash  0x%X",Flash);
}
Вернемся к нашей точке входа и допишем все остальное:
Код:
BOOL WINAPI DllMain(HINSTANCE module, DWORD dwReason, LPVOID lpvReserved)
 {
 if (dwReason == DLL_PROCESS_ATTACH)
 {
 remove("C:\\LogSignature.txt");//удаляем,если есть, старый фаил
 ofile.open(GetDirectoryFile("C:\\LogSignature.txt"), ios::app);//создаем новый фаил
 PrintLog();//заполняем сoзданный ранее фаил
 ExitProcess(0);//закрываем процесс
 }
 return true;
 }
Компилируем и пробуем(заранее переименовав dll в "dxhook.dll" или "Game.dll")


Поиск сигнатур:
Используем ОллиДебаггер+плагин "SigScan"(Ссылки ниже)...

Запускаем программу и открываем "PointBlank.exe.exe"

Переходим по адрессу функции(в моем случаи это АнтиСлеп - 661FD0)

Выделяем область в несколько адрессов, ПКМ - Make Sig - Test Sig - Scan, и смотрим на результат

[

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


Ноходим уникальный набор байт и вписываем все в "формулу"
Код:
DWORD Адресс = FindPattern(Начало,Конец,(PBYTE)"Байты","Маска");
Если не удается найти уникальные байты(например такое происходит с быстрым минированием), то:
Annedroid;3481335 написал(а):
допустим ищешь какой-то динамический адрес, а он меняется, и байты к нему не подобрать, тогда ты ищешь адрес который рядом с ним и ищешь его байты, а потом просто прибавляешь смещение (разницу между нужным адресом и адресом по которому искали)...
"Для тех у кого нет строки Make Sig"
Meteor2142;3483825 написал(а):
Заходишь в Олли, жмешь Options->Appearence->Directories, там указываешь путь ка папке где лежит твой Олли, жмешь ОК, а потом перезагружаешь Олли!
 
Забаненный
Статус
Оффлайн
Регистрация
3 Дек 2016
Сообщения
321
Реакции[?]
176
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
где-то я уже это видел. На другом форуме. hmm. ССори. не прочитал.
 
Последнее редактирование:
Сверху Снизу