USSR Опубликовано 13 марта, 2015 Поделиться Опубликовано 13 марта, 2015 Можете помочь разобраться?Это сканер сигнатур на С++ 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 ?? ?? ?? ?? ?? ?? ?? ?? 0xA2Code:scanner->search("6BF666C086FFA3XXXXXXXX743C8BB6"); Ссылка на комментарий Поделиться на другие сайты Поделиться
USSR Опубликовано 14 марта, 2015 Автор Поделиться Опубликовано 14 марта, 2015 USSR,http://www.mpgh.net/forum/showthread.php?t=505474 хочу сделать для crysis Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 14 марта, 2015 Поделиться Опубликовано 14 марта, 2015 Привет! Код я прочитал по диагонали и могу тольк сказать, что все можно реализовать раз в пять проще. Поищи на форуме - есть и темы и видеоуроки, в том числе на C++. На самом деле кода там строчек 5, а не 50. Ссылка на комментарий Поделиться на другие сайты Поделиться
USSR Опубликовано 14 марта, 2015 Автор Поделиться Опубликовано 14 марта, 2015 [terminus=16]Привет! Код я прочитал по диагонали и могу тольк сказать, что все можно реализовать раз в пять проще. Поищи на форуме - есть и темы и видеоуроки, в том числе на C++. На самом деле кода там строчек 5, а не 50.[/term[terminus=16]хотел еще спросить если адрес не один, а например их 40 штук, то как это все прописывать? просто в уроках этого нету([/term Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 14 марта, 2015 Поделиться Опубликовано 14 марта, 2015 Так это не входит в рамки объяснения работы сканера сигнатур. Проще говоря, у тебя есть функция, которая принимает аргументы и возвращает результат и есть массив из 100 разных аргументов. Чтобы получить 100 результатов работы функции, нужно вызвать ее 100 раз (для каждого из аргументов). Хоть циклом, вариантов - масса. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
USSR Опубликовано 14 марта, 2015 Автор Поделиться Опубликовано 14 марта, 2015 Так это не входит в рамки объяснения работы сканера сигнатур. Проще говоря, у тебя есть функция, которая принимает аргументы и возвращает результат и есть массив из 100 разных аргументов. Чтобы получить 100 результатов работы функции, нужно вызвать ее 100 раз (для каждого из аргументов). Хоть циклом, вариантов - масса.спасибо Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 10 сентября, 2015 Поделиться Опубликовано 10 сентября, 2015 У меня выдаёт ошибку ..._strupr_s(pattern, p_length+1); Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 Код и описание ошибки религия не позволяет выложить? Или на телепатов надеешься? Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 Код и описание ошибки религия не позволяет выложить? Или на телепатов надеешься?Так зачем? Этот же код из темы... _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; Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 Ну так какая ошибка? Или мне нужно запускать студию, смотреть код и получать ошибку? Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 (изменено) Ну так какая ошибка? Или мне нужно запускать студию, смотреть код и получать ошибку?На ваши экстросенсорные способности я зря надеялся ,поэтому вот ... P.S. Всё делаю в Rad Studio c++ Builder (могу исходник программы с ошибкой кинуть)... Изменено 11 сентября, 2015 пользователем NullAlex Красный цвет может использовать только администрация. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 Тебе ведь компилятор пишет, что функция неизвестна. Смотрим MSDN, и видим зависимости: _strupr_s, _strupr_s_l - <string.h> _wcsupr_s, _wcsupr_s_l, _mbsupr_s, _mbsupr_s_l - <string.h> или <wchar.h>Ты подключал указанный хедер? Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 У меня выдаёт ошибку ... _strupr_s(pattern, p_length+1);более эпически бредового сканера еще не видел Lol, Sleep местами эт нечто *FACEPALM*я в соседней теме кидал пример консольтренера, попробуй тот сканер заюз... Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 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;}}; Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 сентября, 2015 Поделиться Опубликовано 11 сентября, 2015 #include#pragma once#include#includeУ тебя пустые инклуды. Где то, что должно быть в них включено? И да, если код предназначен для MS Visual C++, то его под C++ Builder нужно адаптировать, сходу он не соберется. Ссылка на комментарий Поделиться на другие сайты Поделиться
afro228offical Опубликовано 12 сентября, 2015 Поделиться Опубликовано 12 сентября, 2015 У тебя пустые инклуды. Где то, что должно быть в них включено? И да, если код предназначен для MS Visual C++, то его под C++ Builder нужно адаптировать, сходу он не соберется.Я код копировал , а они пропали ...(Потом на Visual Studio попробую что-то сделать...) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 12 сентября, 2015 Поделиться Опубликовано 12 сентября, 2015 Код этого сканера сигнатур - полнейший шлак, крайне противопоказано к использованию.Советую взять сканер gmz, мой или кенга (Мой и кенга нужно искать на YouTube), а у gmz здесь где-то на форуме лежит. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения