LIRW Опубликовано 19 июля, 2016 Поделиться Опубликовано 19 июля, 2016 Всем привет. В общем в сети есть плагин для СЕ, но он что то не совсем адекватно работает, особенно на x64 версиях игры. Либо работает бывает не совсем правильно, а то есть строку генерирует бывает в 3 байта На 3_ох то байтах на вряд ли что то в обще может ведь найти. Так вот может кто понимает в этом деле и доделает его нормальное. Хотя мне кажется на вряд ли это кому то тут нужно будет, но всё таки. Он как бы и под С+ генерирует строку, но всё таки он какой то не до конца реализованный в плане того, что строку генерирует автоматически под свой расчет. Различия в нем от самого СЕ в том, что он более продуман на замену тех байт, которые могут изменится. Даже сам СЕ бывает не может генерировать сигнатуру на какой не будь Юнити игре из за частого совпадения инструкций, а просто пишет +1 байт и ERROR. Как и сам плагин "aamaker" Конечно не которые скажут, что можно и на глаз её смастерить, но бывают случаи где на это тратится больше времени, чем на поиск и реализацию самой функции на опцию в трейнере, а то есть поиск, фильтр и так далее. Вот код - сам код в паблике, так что на вряд ли кто то будет против того, что он тут выложен. Автор кода "SEGnosis" CPP: Скрытый текст #include <windows.h> #include <stdio.h> #include <string> #include <Windows.h> #include <tlhelp32.h> #include <vector> #include <sstream> #include <iomanip> #include "ADE32.h" #include "cepluginsdk.h" using namespace std; DWORD dwTargetAddress; ExportedFunctions Exported; DWORD FindPattern(DWORD base, DWORD size, char pattern[], char mask[] ) { for( DWORD retAddress = base; retAddress < (base + size - strlen(mask)); retAddress++ ) { if( *(BYTE*)retAddress == (pattern[0]&0xff) || mask[0] == '?' ) { DWORD startSearch = retAddress; for( int i = 0; mask[i] != '\0' ; i++, startSearch++ ) { if( (pattern[i]&0xff) != *(BYTE*)startSearch && mask[i] != '?') break; if( ((pattern[i]&0xff) == *(BYTE*)startSearch || mask[i] == '?') && mask[i+1] == '\0' ) return retAddress; } } } return NULL; } DWORD GetSizeOfAllocation(HANDLE hProcess, DWORD* pAddress) { DWORD dwSize, dwTemp; MEMORY_BASIC_INFORMATION info; dwSize = 0; dwTemp = (DWORD)pAddress; ZeroMemory(&info, sizeof(info)); while(true) { VirtualQueryEx(hProcess, (LPCVOID)dwTemp, &info, sizeof(info)); if((DWORD)info.AllocationBase == (DWORD)pAddress) { dwSize += info.RegionSize; dwTemp += info.RegionSize; } else break; } return dwSize; } DWORD GetAllocationBase(HANDLE hProcess, DWORD* pAddress) { MEMORY_BASIC_INFORMATION info; ZeroMemory(&info, sizeof(info)); VirtualQueryEx(hProcess, (LPCVOID)pAddress, &info, sizeof(info)); return (DWORD)info.AllocationBase; } void ReadProcessMemorySafe(HANDLE hProcess, LPCVOID lpAddress, LPVOID lpBuffer, SIZE_T size) { SIZE_T tempSize, bytesRead; do { // lazy shitty way to read a module with invalid pages tempSize = min(size, 0x1000); ReadProcessMemory(hProcess, lpAddress, lpBuffer, tempSize, &bytesRead); size -= tempSize; lpAddress = (LPCVOID)((DWORD)lpAddress + tempSize); lpBuffer = (LPVOID)((DWORD)lpBuffer + tempSize); }while(size != 0); } void SetClipboardText(string content) { LPVOID pSpace; HGLOBAL hMemory; size_t length; length = content.length() + 1; hMemory = GlobalAlloc(GMEM_MOVEABLE, length); if(hMemory != NULL) { pSpace = GlobalLock(hMemory); if(pSpace != NULL) { memcpy(pSpace, content.c_str(), length); if(OpenClipboard(NULL) != FALSE) { if(EmptyClipboard() != FALSE) { SetClipboardData(CF_TEXT, hMemory); CloseClipboard(); } } GlobalUnlock(hMemory); } } } BOOL WINAPI SignatureCallback(ULONG *selectedAddress) { // for some reason, the selected address in the popup // callback isn't the selected address so its cached here dwTargetAddress = (DWORD)selectedAddress; return TRUE; } BOOL WINAPI SignaturePopupCallback(ULONG selectedAddress, char **addressofname) { DWORD dwStartAddress, dwSectionSize, dwAddress, dwTest, dwCount, dwTestOffset, dwIndex, dwDataSize; HANDLE hProcess; stringstream pattern; BYTE* pTargetMemory; disasm_struct ins; vector<BYTE> tempSig; string tempMask; int iMethod; if(Exported.OpenedProcessID != NULL && *Exported.OpenedProcessID != NULL) { // Open the process hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, *Exported.OpenedProcessID); if(hProcess != NULL) { // Otherwise get the section base and size dwStartAddress = GetAllocationBase(hProcess, (DWORD*)dwTargetAddress); if(dwStartAddress != NULL) dwSectionSize = GetSizeOfAllocation(hProcess, (DWORD*)dwStartAddress); if(dwStartAddress != NULL && dwSectionSize != NULL) { pTargetMemory = (BYTE*)malloc(dwSectionSize); if(pTargetMemory != NULL) { // Copy the section for local testing ReadProcessMemorySafe(hProcess, (LPCVOID)dwStartAddress, pTargetMemory, dwSectionSize); tempMask = ""; dwAddress = dwTargetAddress - dwStartAddress; while(true) { if(pTargetMemory + dwAddress < pTargetMemory + dwSectionSize - tempSig.size()) { disasm(pTargetMemory + dwAddress, &ins); dwDataSize = ins.disasm_datasize; // guess if unsupported if(dwDataSize == 0) dwDataSize = ins.disasm_len - ((ins.disasm_flag & C_MODRM) == C_MODRM ? 2 : 1); if(ins.disasm_len > 0) { for(int i = 0; i < ins.disasm_len; i++) { if(i < ins.disasm_len - dwDataSize) { tempSig.push_back(*(BYTE*)(pTargetMemory + dwAddress + i)); tempMask += "x"; } else { tempSig.push_back(0); tempMask += "?"; } } dwAddress += ins.disasm_len; } else { Exported.ShowMessage("Unable to disassemble instruction."); break; } // Test if its unique dwCount = 0; dwTest = (DWORD)pTargetMemory - 1; DWORD foo= 0; do { foo = dwTest - (DWORD)pTargetMemory; // what the fuck am I doing here if(dwTest - (DWORD)pTargetMemory < dwSectionSize || foo == 0xFFFFFFFF) { dwTest = FindPattern(dwTest + 1, dwSectionSize - (dwTest - (DWORD)pTargetMemory), (char*)&tempSig[0], (char*)tempMask.c_str()); if(dwTest != NULL) dwCount++; } else break; }while(dwTest != NULL && dwCount < 2); // If its unique if(dwCount == 1) { // trim excess do { if(tempMask.length() > 0 && tempMask[tempMask.length() - 1] == '?') tempMask.erase(tempMask.begin() + tempMask.length() - 1); else break; }while(true); iMethod = MessageBox(NULL, "Click \"Yes\" for Code Style\r\nClick \"No\" for IDA Style\r\nThe signature is copied to your clipboard", "SEGnosis Sig Maker", MB_YESNOCANCEL | MB_ICONQUESTION | MB_TOPMOST); if(iMethod == IDYES) { for(int i = 0; i < tempMask.length(); i++) pattern << "\\x" << setfill('0') << setw(2) << hex << (DWORD)tempSig[i]; pattern << " " << tempMask; SetClipboardText(pattern.str()); } else if(iMethod == IDNO) { for(int i = 0; i < tempMask.length(); i++) { if(tempMask[i] == 'x') pattern << setfill('0') << setw(2) << hex << (DWORD)tempSig[i]; else pattern << "?"; if(i != tempMask.length() - 1) pattern << " "; } SetClipboardText(pattern.str()); } break; } } else { Exported.ShowMessage("Unable to find a unique signature."); break; } } } else Exported.ShowMessage("Unable to allocate memory."); } else Exported.ShowMessage("Selected address does not belong to a valid range of memory"); CloseHandle(hProcess); } else Exported.ShowMessage("Unable to open a handle to process."); } else Exported.ShowMessage("No process selected."); return TRUE; } BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } #pragma comment(linker, "/EXPORT:CEPlugin_GetVersion=?CEPlugin_GetVersion@@YAHPEAU_PluginVersion@@H@Z") __declspec(dllexport) BOOL __stdcall CEPlugin_GetVersion(PPluginVersion pv, int sizeofpluginversion) { pv->version = CESDK_VERSION; pv->pluginname = "CE SigMaker v1.0 (SDK version 4: 6.0+)"; return TRUE; } #pragma comment(linker, "/EXPORT:CEPlugin_InitializePlugin=?CEPlugin_InitializePlugin@@YAHPEAU_ExportedFunctions@@H@Z") __declspec(dllexport) BOOL __stdcall CEPlugin_InitializePlugin(PExportedFunctions ef, int pluginid) { BOOL bResult; int ContextPluginID; DISASSEMBLERCONTEXT_INIT init6; Exported = *ef; bResult = TRUE; if(Exported.sizeofExportedFunctions == sizeof(Exported)) { init6.name = "Generate Signature"; init6.shortcut = NULL; init6.shortcut = "Ctrl+Z"; init6.callbackroutine = SignatureCallback; init6.callbackroutineOnPopup = SignaturePopupCallback; ContextPluginID = Exported.RegisterFunction(pluginid, ptDisassemblerContext, &init6); if (ContextPluginID != -1) { // do anything else here } else { Exported.ShowMessage("Unable to hook context menu"); bResult = FALSE; } } else { Exported.ShowMessage("Version does not match"); bResult = FALSE; } return bResult; } #pragma comment(linker, "/EXPORT:CEPlugin_DisablePlugin=?CEPlugin_DisablePlugin@@YAHXZ") __declspec(dllexport) BOOL __stdcall CEPlugin_DisablePlugin() { return TRUE; } Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения