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

Сканер сигнатур


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

Можете помочь разобраться?Это сканер сигнатур на С++
 
signature_scanner.h
 


Example of using:

DLL itself:
 
 


That was just a code sample to show you hoe you can use it.

The search funcion inside the scanner class is what you will be using to do memory scanning.
Like if we search like this:
 
 

83 is a single hex byte. Meaning it is like this: 0x83.

So the actual signature is:
 
 




Two "?" is a wildcard byte. And the signature will ignore them.

Additionally it will take the address at the end of the signature unless you specify the second perameter in this function, which is 0 by default.

If the address is in the middle of the signature you can do the following:
 
 




As you know, the address is Unsigned long and thus we write 8 "X"(4bytes=4*2).
When X is detected in the string, the second perameter of the function is ignored.

The string must be in upper case letters.
Как тут он работает? не как не пойму.Как у него маска и сигнатура в одной строке но при этом у него все работает. 

Xipho: тег кода и спойлера для кого сделан?

#pragma once#include <windows.h>#include <psapi.h>#pragma comment(lib, "psapi.lib")#include <stdio.h>// Usage: unsigned long address = signature_scanner->search("3AB2DFAB????????3FBACD300200A1XXXXXXXXB1C4DA");// X is the address// ? is a wildcardclass signature_scanner{private:    unsigned long BaseAddress;    unsigned long ModuleSize;public:    signature_scanner()    {        //SYSTEM_INFO info;        //GetSystemInfo(&info);        //this->BaseAddress = (unsigned long)info.lpMinimumApplicationAddress;        // Could be injected earlier than expected        while (!(this->BaseAddress = (unsigned long)GetModuleHandle(NULL)))            Sleep(100);        // Getting size of image        MODULEINFO modinfo;        while (!GetModuleInformation(GetCurrentProcess(), GetModuleHandle(NULL), &modinfo, sizeof(MODULEINFO)))            Sleep(100);        this->ModuleSize = modinfo.SizeOfImage;        // Wait for the application to finish loading        MEMORY_BASIC_INFORMATION meminfo;        while (true)        {            if (VirtualQuery((void*)this->ModuleSize, &meminfo, sizeof(MEMORY_BASIC_INFORMATION)))                if (!(meminfo.Protect &PAGE_EXECUTE_WRITECOPY))                    break;            Sleep(100);        }    }    unsigned long search(const char* string, unsigned short offset=0)    {        unsigned int p_length = strlen(string);// Pattern's length        if (p_length % 2 != 0 || p_length < 2 || !this->BaseAddress || !this->ModuleSize) return NULL;// Invalid operation        unsigned short length = p_length / 2;// Number of bytes        // The buffer is storing the real bytes' values after parsing the string        unsigned char* buffer = new unsigned char[length];        SecureZeroMemory(buffer, length);        // Copy of string        char* pattern = new char[p_length+1];// +1 for the null terminated string        ZeroMemory(pattern, p_length+1);        strcpy_s(pattern, p_length+1, string);        _strupr_s(pattern, p_length+1);        // Set vars        unsigned char f_byte;        unsigned char s_byte;        // Parsing of string        for (unsigned short z = 0; z < length; z++)        {            f_byte = pattern[z*2];// First byte            s_byte = pattern[(z*2)+1];// Second byte            if ( ( (f_byte <= 'F' && f_byte >= 'A') || (f_byte <= '9' && f_byte >= '0') ) && ( (s_byte <= 'F' && s_byte >= 'A') || (s_byte <= '9' && s_byte >= '0') ) )            {                if (f_byte <= '9') buffer[z] += f_byte - '0';                else buffer[z] += f_byte - 'A' + 10;                buffer[z] *= 16;                if (s_byte <= '9') buffer[z] += s_byte - '0';                else buffer[z] += s_byte - 'A' + 10;            }            else if (f_byte == 'X' || s_byte == 'X') buffer[z] = 'X';            else buffer[z] = '?';// Wildcard        }        // Remove buffer        delete[] pattern;        // Start searching                unsigned short x;        unsigned long i = this->BaseAddress;        MEMORY_BASIC_INFORMATION meminfo;        unsigned long EOR;                while (i < this->ModuleSize)        {            VirtualQuery((void*)i, &meminfo, sizeof(MEMORY_BASIC_INFORMATION));            if (!(meminfo.Protect &PAGE_EXECUTE_READWRITE))// Good for AVA for now            {// !(meminfo.Protect &(PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) || !(meminfo.State &MEM_COMMIT)                i += meminfo.RegionSize;                continue;            }            EOR = i + meminfo.RegionSize;            for (; i < EOR; i++)            {                for (x = 0; x < length; x++)                    if (buffer[x] != ((unsigned char*)i)[x] && buffer[x] != '?' && buffer[x] != 'X')                        break;                if (x == length)                {                    delete[] buffer;                    const char* s_offset = strstr(string, "X");                    if (s_offset != NULL)                        return *(unsigned long*)&((unsigned char*)i)[length - strlen(s_offset) / 2];                    else                        return *(unsigned long*)&((unsigned char*)i)[length + offset];                }            }        }                // Didn't find anything        delete[] buffer;        return NULL;    }}; 
#include <windows.h>#include "signature_scanner.h"void main(){    Beep(1000, 100);    signature_scanner *scanner = new signature_scanner;        HANDLE checking;    unsigned long pointer;    bool* ingame;    try    {        if (!(ingame = (bool*)scanner->search("83C40885C00F95C0C705????????????????A2")))            throw "Couldn't retrieve ingame pointer.";        if (!(pointer = scanner->search("6BF666C086FFA3XXXXXXXX743C8BB6")))            throw "Couldn't retrieve bino pointer.";    }    catch ( LPCSTR error )    {        MessageBox(NULL, error, "Error", MB_OK | MB_ICONERROR);        return;    }    while (true)    {        // Checks if he is in game                if (*ingame)        {            // If he is in game then do some stuff                        if (IsBadReadPtr((void*)pointer, sizeof(unsigned long)) == NULL)            {                unsigned long address = *(unsigned long*)pointer + offset;                if (IsBadReadPtr((void*)address, sizeof(unsigned long)) == NULL)                {                }            }        }                Sleep(2000);    }}bool WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved){    if (fdwReason == DLL_PROCESS_ATTACH)    {        DisableThreadLibraryCalls(hDLLInst);        if (CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)main, NULL, 0, NULL) == NULL)        {            MessageBox(NULL, new_thread, "Error", MB_OK | MB_ICONERROR);            return false;        }    }        return true;}
Code:scanner->search("83C40885C00F95C0C705????????????????A2");
Code:0x83 0xC4 0x08 0x85 0xC0 0x0F 0x95 0xC0 0xC7 0x05 ?? ?? ?? ?? ?? ?? ?? ?? 0xA2
Code:scanner->search("6BF666C086FFA3XXXXXXXX743C8BB6");
Ссылка на комментарий
Поделиться на другие сайты

Привет! Код я прочитал по диагонали и могу тольк сказать, что все можно реализовать раз в пять проще. Поищи на форуме - есть и темы и видеоуроки, в том числе на C++. На самом деле кода там строчек 5, а не 50.
Ссылка на комментарий
Поделиться на другие сайты

[terminus=16]Привет! Код я прочитал по диагонали и могу тольк сказать, что все можно реализовать раз в пять проще. Поищи на форуме - есть и темы и видеоуроки, в том числе на C++. На самом деле кода там строчек 5, а не 50.[/term

[terminus=16]хотел еще спросить если адрес не один, а например их 40 штук, то как это все прописывать? просто в уроках этого нету([/term

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

Так это не входит в рамки объяснения работы сканера сигнатур. Проще говоря, у тебя есть функция, которая принимает аргументы и возвращает результат и есть массив из 100 разных аргументов. Чтобы получить 100 результатов работы функции, нужно вызвать ее 100 раз (для каждого из аргументов). Хоть циклом, вариантов - масса.
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Так это не входит в рамки объяснения работы сканера сигнатур. Проще говоря, у тебя есть функция, которая принимает аргументы и возвращает результат и есть массив из 100 разных аргументов. Чтобы получить 100 результатов работы функции, нужно вызвать ее 100 раз (для каждого из аргументов). Хоть циклом, вариантов - масса.

спасибо 

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

  • 5 месяцев спустя...

Код и описание ошибки религия не позволяет выложить? Или на телепатов надеешься?

Так зачем? Этот же код из темы... 

  _strupr_s(pattern, p_length+1); // здесь ошибка :(

NullAlex: Для кода и всего остального - есть специальные теги. Последнее китайское устное предупреждение.

char* pattern = new char[p_length+1];// +1 for the null terminated string        ZeroMemory(pattern, p_length+1);        strcpy_s(pattern, p_length+1, string);        _strupr_s(pattern, p_length+1);        // Set vars        unsigned char f_byte;        unsigned char s_byte;
Ссылка на комментарий
Поделиться на другие сайты

Ну так какая ошибка? Или мне нужно запускать студию, смотреть код и получать ошибку?

На ваши экстросенсорные способности я зря надеялся ,поэтому вот ...

FHVs_1oP388.jpg

P.S. Всё делаю в Rad Studio c++ Builder (могу исходник программы с ошибкой кинуть)...

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

FHVs_1oP388.jpg

Тебе ведь компилятор пишет, что функция неизвестна.

Смотрим MSDN, и видим зависимости:

_strupr_s, _strupr_s_l - <string.h>

_wcsupr_s, _wcsupr_s_l, _mbsupr_s, _mbsupr_s_l - <string.h> или <wchar.h>

Ты подключал указанный хедер?
Ссылка на комментарий
Поделиться на другие сайты

У меня выдаёт ошибку ... _strupr_s(pattern, p_length+1);

более эпически бредового сканера еще не видел Lol, Sleep местами эт нечто *FACEPALM*

я в соседней теме кидал пример консольтренера, попробуй тот сканер заюз...

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

NullAlex: Читай FAQ по тегам.

#include#pragma once#include#include#pragma comment(lib, "psapi.lib")#include// Usage: unsigned long address = signature_scanner->search("3AB2DFAB????????3FBACD300200A1XXXXXXXXB1C4DA");// X is the address// ? is a wildcardclass signature_scanner{private:unsigned long BaseAddress;unsigned long ModuleSize;public:signature_scanner(){//SYSTEM_INFO info;//GetSystemInfo(&info);//this->BaseAddress = (unsigned long)info.lpMinimumApplicationAddress;// Could be injected earlier than expectedwhile (!(this->BaseAddress = (unsigned long)GetModuleHandle(NULL)))Sleep(100);// Getting size of imageMODULEINFO modinfo;while (!GetModuleInformation(GetCurrentProcess(), GetModuleHandle(NULL), &modinfo, sizeof(MODULEINFO)))Sleep(100);this->ModuleSize = modinfo.SizeOfImage;// Wait for the application to finish loadingMEMORY_BASIC_INFORMATION meminfo;while (true){if (VirtualQuery((void*)this->ModuleSize, &meminfo, sizeof(MEMORY_BASIC_INFORMATION)))if (!(meminfo.Protect &PAGE_EXECUTE_WRITECOPY))break;Sleep(100);}}unsigned long search(const char* string, unsigned short offset=0){unsigned int p_length = strlen(string);// Pattern's lengthif (p_length % 2 != 0 || p_length < 2 || !this->BaseAddress || !this->ModuleSize) return NULL;// Invalid operationunsigned short length = p_length / 2;// Number of bytes// The buffer is storing the real bytes' values after parsing the stringunsigned char* buffer = new unsigned char[length];SecureZeroMemory(buffer, length);// Copy of stringchar* pattern = new char[p_length+1];// +1 for the null terminated stringZeroMemory(pattern, p_length+1);strcpy_s(pattern, p_length+1, string);[color=#ff0000]_strupr_s(pattern, p_length+1);[/color]// Set varsunsigned char f_byte;unsigned char s_byte;// Parsing of stringfor (unsigned short z = 0; z < length; z++){f_byte = pattern[z*2];// First bytes_byte = pattern[(z*2)+1];// Second byteif ( ( (f_byte <= 'F' && f_byte >= 'A') || (f_byte <= '9' && f_byte >= '0') ) && ( (s_byte <= 'F' && s_byte >= 'A') || (s_byte <= '9' && s_byte >= '0') ) ){if (f_byte <= '9') buffer[z] += f_byte - '0';else buffer[z] += f_byte - 'A' + 10;buffer[z] *= 16;if (s_byte <= '9') buffer[z] += s_byte - '0';else buffer[z] += s_byte - 'A' + 10;}else if (f_byte == 'X' || s_byte == 'X') buffer[z] = 'X';else buffer[z] = '?';// Wildcard}// Remove bufferdelete[] pattern;// Start searchingunsigned short x;unsigned long i = this->BaseAddress;MEMORY_BASIC_INFORMATION meminfo;unsigned long EOR;while (i < this->ModuleSize){VirtualQuery((void*)i, &meminfo, sizeof(MEMORY_BASIC_INFORMATION));if (!(meminfo.Protect &PAGE_EXECUTE_READWRITE))// Good for AVA for now{// !(meminfo.Protect &(PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY)) || !(meminfo.State &MEM_COMMIT)i += meminfo.RegionSize;continue;}EOR = i + meminfo.RegionSize;for (; i < EOR; i++){for (x = 0; x < length; x++)if (buffer[x] != ((unsigned char*)i)[x] && buffer[x] != '?' && buffer[x] != 'X')break;if (x == length){delete[] buffer;const char* s_offset = strstr(string, "X");if (s_offset != NULL)return *(unsigned long*)&((unsigned char*)i)[length - strlen(s_offset) / 2];elsereturn *(unsigned long*)&((unsigned char*)i)[length + offset];}}}// Didn't find anythingdelete[] buffer;return NULL;}};
Ссылка на комментарий
Поделиться на другие сайты

#include

#pragma once

#include

#include

У тебя пустые инклуды. Где то, что должно быть в них включено? И да, если код предназначен для MS Visual C++, то его под C++ Builder нужно адаптировать, сходу он не соберется.

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

У тебя пустые инклуды. Где то, что должно быть в них включено? И да, если код предназначен для MS Visual C++, то его под C++ Builder нужно адаптировать, сходу он не соберется.

Я код копировал , а они пропали ...(Потом на Visual Studio попробую что-то сделать...) 

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

Код этого сканера сигнатур - полнейший шлак, крайне противопоказано к использованию.

Советую взять сканер gmz, мой или кенга (Мой и кенга нужно искать на YouTube), а у gmz здесь где-то на форуме лежит.

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

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

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

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