CPointer* CBinaryFile::FindAddress(object oIdentifier) { #ifdef _WIN32 if(CheckClassname(oIdentifier, "bytes")) return FindSignature(oIdentifier); #endif return FindSymbol(extract<char*>(oIdentifier)); }
/* Initialize the Signature Object */ void CSigScan::Init(unsigned char *sig, char *mask, size_t len) { is_set = 0; sig_len = len; sig_str = new unsigned char[sig_len]; ustrncpy(sig_str, sig, sig_len); sig_mask = new char[sig_len+2]; //Original line was "sig_mask = new char[sig_len+1];", but made my module fail with "invalid access to memory" (translated error message into English) @aVoN strncpy(sig_mask, mask, sig_len); sig_mask[sig_len+1] = 0; if(!base_addr) return ; // GetDllMemInfo() Failed if((sig_addr = FindSignature()) == NULL) return ; // FindSignature() Failed is_set = 1; // SigScan Successful! }
/* Initialize the Signature Object */ void CSigScan::Init(unsigned char *sig, char *mask, size_t len) { is_set = 0; sig_len = len; sig_str = new unsigned char[sig_len]; ustrncpy(sig_str, sig, sig_len); sig_mask = new char[sig_len+1]; strncpy(sig_mask, mask, sig_len); sig_mask[sig_len+1] = 0; if(!base_addr) return ; // GetDllMemInfo() Failed if((sig_addr = FindSignature()) == NULL) return ; // FindSignature() Failed is_set = 1; // SigScan Successful! }
bool l4dtoolz::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late) { #ifdef WIN32 hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, GetCurrentProcessId()); #endif PLUGIN_SAVEVARS(); GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER); GET_V_IFACE_CURRENT(GetEngineFactory, icvar, ICvar, CVAR_INTERFACE_VERSION); #if defined METAMOD_PLAPI_VERSION if ((vsp_callbacks = ismm->GetVSPInfo(NULL)) == NULL) #endif { ismm->AddListener(this, this); ismm->EnableVSPListener(); } #if !defined METAMOD_PLAPI_VERSION m_EngineCC = SH_GET_CALLCLASS(engine); #endif #if SOURCE_ENGINE >= SE_ORANGEBOX g_pCVar = icvar; ConVar_Register(0, &s_BaseAccessor); #else ConCommandBaseMgr::OneTimeInit(&s_BaseAccessor); #endif char* base_addr = NULL; size_t base_len = 0; find_base(matchmaking_dll, base_addr, base_len); #ifdef WIN32 if(base_addr == NULL) find_base("matchmaking.dll", base_addr, base_len); #endif if(lobby_match_ptr == NULL){ lobby_match_ptr = (char*)FindSignature(lobby_match, base_addr, base_len, true); get_org_sig(lobby_match, (const char*)lobby_match_new, lobby_match_org); } find_base(engine_dll, base_addr, base_len); if(max_players_friend_lobby == NULL){ max_players_friend_lobby = (char*)FindSignature(friends_lobby, base_addr, base_len); get_org_sig(max_players_friend_lobby, (const char*)friends_lobby_new, friends_lobby_org); } if(max_players_connect == NULL){ max_players_connect = (char*)FindSignature(max_players, base_addr, base_len); if(max_players_connect != NULL){ get_org_sig(max_players_connect, (const char*)max_players_new, max_players_org); } } if(lobby_sux_ptr==NULL){ #ifdef WIN32 lobby_sux_ptr = max_players_connect; #else lobby_sux_ptr = (char*)FindSignature(lobby_sux, base_addr, base_len); #endif if(lobby_sux_ptr!=NULL){ get_org_sig(lobby_sux_ptr, lobby_sux_new, lobby_sux_org); } } #ifdef WIN32 if(max_players_server_browser == NULL){ max_players_server_browser = (char*)FindSignature(server_bplayers, base_addr, base_len); get_org_sig(max_players_server_browser, (const char*)server_bplayers_new, server_bplayers_org); } #endif if(tmp_player == NULL){ tmp_player = (char*)FindSignature(players, base_addr, base_len); if(tmp_player != NULL){ #ifdef WIN32 tmp_player2 = (char*)FindSignature(players2, base_addr, base_len); #else tmp_player2 = tmp_player; #endif if(tmp_player2 != NULL){ get_org_sig(tmp_player, players_new, players_org); WriteSignature(tmp_player, players_new); get_org_sig(tmp_player2, players_new2, players_org2); WriteSignature(tmp_player2, players_new2); engine->ServerCommand("maxplayers 32\n"); engine->ServerCommand("L4DToolZ [email protected]\n"); } } } if(unreserved_ptr==NULL){ unreserved_ptr = (char*)FindSignature(unreserved, base_addr, base_len); get_org_sig(unreserved_ptr, unreserved_new, unreserved_org); } find_base(server_dll, base_addr, base_len); if(chuman_limit == NULL){ chuman_limit = (char*)FindSignature(human_limit, base_addr, base_len); get_org_sig(chuman_limit, human_limit_new, human_limit_org); } #ifndef WIN32 if(max_players_server_browser == NULL){ max_players_server_browser = (char*)FindSignature(server_bplayers, base_addr, base_len); get_org_sig(max_players_server_browser, (const char*)server_bplayers_new, server_bplayers_org); } #endif return true; }
VOID FillSysTablesInfo(VOID **Tables, UINT32 TablesSize) { UINT32 Table = 0; EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdPtr; VOID *TablesPage; #define FLAG_OPTIONAL 1<<0 #define FLAG_NO_CHECKSUM 1<<1 static struct { UINT32 Signature; UINT32 Flags; CHAR8* Name; } TableInfo[] = { // MADT, optional { SIGNATURE_32('A', 'P', 'I', 'C'), FLAG_OPTIONAL, "MADT"}, // FACP (also called FADT) { SIGNATURE_32('F', 'A', 'C', 'P'), 0, "FADT"}, // FACS, according 5.2.9 of ACPI v2. spec FACS doesn't have checksum field { SIGNATURE_32('F', 'A', 'C', 'S'), FLAG_NO_CHECKSUM, "FACS"}, // DSDT { SIGNATURE_32('D', 'S', 'D', 'T'), 0, "DSDT"}, // SSDT { SIGNATURE_32('S', 'S', 'D', 'T'), FLAG_OPTIONAL, "SSDT"}, // HPET { SIGNATURE_32('H', 'P', 'E', 'T'), FLAG_OPTIONAL, "HPET"}, // MCFG { SIGNATURE_32('M', 'C', 'F', 'G'), FLAG_OPTIONAL, "MCFG"} }; UINT32 Index; RsdPtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)FindAcpiRsdPtr(); ASSERT(RsdPtr != NULL); TablesPage = (VOID*)(UINTN)((RsdPtr->RsdtAddress) & ~0xfff); DEBUG((DEBUG_INFO, "TablesPage:%p\n", TablesPage)); for (Index = 0; Index < sizeof TableInfo / sizeof TableInfo[0]; Index++) { VOID *Ptr = FindSignature(TablesPage, TableInfo[Index].Signature, (BOOLEAN)((TableInfo[Index].Flags & FLAG_NO_CHECKSUM) != 0)); if (TableInfo[Index].Signature == SIGNATURE_32('F', 'A', 'C', 'P')) { // we actually have 2 FADTs, see https://xtracker.innotek.de/index.php?bug=4082 Ptr = FindSignature((UINT8*)Ptr+32, SIGNATURE_32('F', 'A', 'C', 'P'), FALSE); } if (!(TableInfo[Index].Flags & FLAG_OPTIONAL)) { if (!Ptr) DEBUG((EFI_D_ERROR, "%a: isn't optional %p\n", TableInfo[Index].Name, Ptr)); ASSERT(Ptr != NULL); } DEBUG((EFI_D_ERROR, "%a: %p\n", TableInfo[Index].Name, Ptr)); if (Ptr) Tables[Table++] = Ptr; } #if 0 // RSDT ASSERT(Table < TablesSize); Tables[Table] = FindSignature(TablesPage, SIGNATURE_32('R', 'S', 'D', 'T')); DEBUG ((EFI_D_ERROR, "RSDT: %p\n", Tables[Table])); ASSERT(Tables[Table] != NULL); Table++; // XSDT ASSERT(Table < TablesSize); Tables[Table] = FindSignature(TablesPage, SIGNATURE_32('X', 'S', 'D', 'T')); DEBUG ((EFI_D_ERROR, "XSDT: %p\n", Tables[Table])); ASSERT(Tables[Table] != NULL); Table++; #endif DEBUG((DEBUG_INFO, "We found %d tables from %d\n", Table, TablesSize)); Tables[Table] = NULL; }
int SzExtractFromBuf(const void* pBuf, unsigned int nBufLength, wchar_t* cUnPackPath, DWORD dwPathLength) { if(pBuf==NULL || nBufLength<=0) return 1; SRes res = SZ_OK; CBufInStream archiveStream; CLookToRead lookStream; CSzArEx db; ISzAlloc allocImp; ISzAlloc allocTempImp; const char *errorMessage = NULL; wchar_t path[MAX_PATH * 3 + 2] = {0}; size_t pathLen = wcslen(cUnPackPath); wcscpy_s(path,MAX_PATH * 3 + 2, cUnPackPath); if (cUnPackPath[pathLen - 1] != '\\') { wcscat_s(path, L"\\"); pathLen = wcslen(path); } CrcGenerateTable(); allocImp.Alloc = SzAlloc; allocImp.Free = SzFree; allocTempImp.Alloc = SzAllocTemp; allocTempImp.Free = SzFreeTemp; BufInStream_CreateVTable(&archiveStream); LookToRead_CreateVTable(&lookStream, False); if (InBuf_Init(&archiveStream.buf, pBuf, nBufLength) != 0) { errorMessage = "can not open input file"; res = SZ_ERROR_FAIL; } else { UInt64 pos = 0; if (!FindSignature(&archiveStream.buf, &pos)) res = SZ_ERROR_FAIL; else if (InBuf_Seek(&archiveStream.buf, (Int64 *)&pos, SZ_SEEK_SET) != 0) res = SZ_ERROR_FAIL; if (res != 0) errorMessage = "Can't find 7z archive"; } if (res == SZ_OK) { lookStream.realStream = &archiveStream.s; LookToRead_Init(&lookStream); } SzArEx_Init(&db); if (res == SZ_OK) { res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); } if (res == SZ_OK) { UInt32 executeFileIndex = (UInt32)(Int32)-1; UInt32 minPrice = 1 << 30; UInt32 i; UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ for (i = 0; i < db.db.NumFiles; i++) { size_t offset = 0; size_t outSizeProcessed = 0; const CSzFileItem *f = db.db.Files + i; size_t len; wchar_t *temp; len = SzArEx_GetFileNameUtf16(&db, i, NULL); if (len >= MAX_PATH) { res = SZ_ERROR_FAIL; break; } temp = path + pathLen; SzArEx_GetFileNameUtf16(&db, i, reinterpret_cast<UInt16*>(temp)); { res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); if (res != SZ_OK) break; } { CSzFile outFile; size_t processedSize; size_t j; size_t nameStartPos = 0; for (j = 0; temp[j] != 0; j++) { if (temp[j] == '/') { temp[j] = 0; MyCreateDir(path); temp[j] = CHAR_PATH_SEPARATOR; nameStartPos = j + 1; } } if (f->IsDir) { MyCreateDir(path); continue; } else { if (DoesFileOrDirExist(path)) { errorMessage = "Duplicate file"; res = SZ_ERROR_FAIL; break; } if (OutFile_OpenW(&outFile, path)) { errorMessage = "Can't open output file"; res = SZ_ERROR_FAIL; break; } } processedSize = outSizeProcessed; if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) { errorMessage = "Can't write output file"; res = SZ_ERROR_FAIL; } #ifdef USE_WINDOWS_FILE if (f->MTimeDefined) { FILETIME mTime; mTime.dwLowDateTime = f->MTime.Low; mTime.dwHighDateTime = f->MTime.High; SetFileTime(outFile.handle, NULL, NULL, &mTime); } #endif { SRes res2 = File_Close(&outFile); if (res != SZ_OK) break; if (res2 != SZ_OK) { res = res2; break; } } #ifdef USE_WINDOWS_FILE if (f->AttribDefined) SetFileAttributesW(path, f->Attrib); #endif } } IAlloc_Free(&allocImp, outBuffer); } SzArEx_Free(&db, &allocImp); if (res == SZ_OK) { _tcscpy_s(cUnPackPath, dwPathLength, path); return 0; } else return 1; }
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, #ifdef UNDER_CE LPWSTR #else LPSTR #endif lpCmdLine, int nCmdShow) #endif { CFileInStream archiveStream; CLookToRead lookStream; CSzArEx db; SRes res = SZ_OK; ISzAlloc allocImp; ISzAlloc allocTempImp; WCHAR sfxPath[MAX_PATH + 2]; WCHAR path[MAX_PATH * 3 + 2]; #ifndef UNDER_CE WCHAR workCurDir[MAX_PATH + 32]; #endif size_t pathLen; DWORD winRes; const wchar_t *cmdLineParams; const char *errorMessage = NULL; Bool useShellExecute = True; DWORD exitCode = 0; LoadSecurityDlls(); #ifdef _CONSOLE SetConsoleCtrlHandler(HandlerRoutine, TRUE); #else UNUSED_VAR(hInstance); UNUSED_VAR(hPrevInstance); UNUSED_VAR(lpCmdLine); UNUSED_VAR(nCmdShow); #endif CrcGenerateTable(); allocImp.Alloc = SzAlloc; allocImp.Free = SzFree; allocTempImp.Alloc = SzAllocTemp; allocTempImp.Free = SzFreeTemp; FileInStream_CreateVTable(&archiveStream); LookToRead_CreateVTable(&lookStream, False); winRes = GetModuleFileNameW(NULL, sfxPath, MAX_PATH); if (winRes == 0 || winRes > MAX_PATH) return 1; { cmdLineParams = GetCommandLineW(); #ifndef UNDER_CE { Bool quoteMode = False; for (;; cmdLineParams++) { wchar_t c = *cmdLineParams; if (c == L'\"') quoteMode = !quoteMode; else if (c == 0 || (c == L' ' && !quoteMode)) break; } } #endif } { unsigned i; DWORD d; winRes = GetTempPathW(MAX_PATH, path); if (winRes == 0 || winRes > MAX_PATH) return 1; pathLen = wcslen(path); d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId(); for (i = 0;; i++, d += GetTickCount()) { if (i >= 100) { res = SZ_ERROR_FAIL; break; } wcscpy(path + pathLen, L"7z"); { wchar_t *s = path + wcslen(path); UInt32 value = d; unsigned k; for (k = 0; k < 8; k++) { unsigned t = value & 0xF; value >>= 4; s[7 - k] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10))); } s[k] = '\0'; } if (DoesFileOrDirExist(path)) continue; if (CreateDirectoryW(path, NULL)) { wcscat(path, WSTRING_PATH_SEPARATOR); pathLen = wcslen(path); break; } if (GetLastError() != ERROR_ALREADY_EXISTS) { res = SZ_ERROR_FAIL; break; } } #ifndef UNDER_CE wcscpy(workCurDir, path); #endif if (res != SZ_OK) errorMessage = "Can't create temp folder"; } if (res != SZ_OK) { if (!errorMessage) errorMessage = "Error"; PrintErrorMessage(errorMessage); return 1; } if (InFile_OpenW(&archiveStream.file, sfxPath) != 0) { errorMessage = "can not open input file"; res = SZ_ERROR_FAIL; } else { UInt64 pos = 0; if (!FindSignature(&archiveStream.file, &pos)) res = SZ_ERROR_FAIL; else if (File_Seek(&archiveStream.file, (Int64 *)&pos, SZ_SEEK_SET) != 0) res = SZ_ERROR_FAIL; if (res != 0) errorMessage = "Can't find 7z archive"; } if (res == SZ_OK) { lookStream.realStream = &archiveStream.s; LookToRead_Init(&lookStream); } SzArEx_Init(&db); if (res == SZ_OK) { res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); } if (res == SZ_OK) { UInt32 executeFileIndex = (UInt32)(Int32)-1; UInt32 minPrice = 1 << 30; UInt32 i; UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ for (i = 0; i < db.NumFiles; i++) { size_t offset = 0; size_t outSizeProcessed = 0; WCHAR *temp; if (SzArEx_GetFileNameUtf16(&db, i, NULL) >= MAX_PATH) { res = SZ_ERROR_FAIL; break; } temp = path + pathLen; SzArEx_GetFileNameUtf16(&db, i, temp); { res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize, &offset, &outSizeProcessed, &allocImp, &allocTempImp); if (res != SZ_OK) break; } { CSzFile outFile; size_t processedSize; size_t j; size_t nameStartPos = 0; for (j = 0; temp[j] != 0; j++) { if (temp[j] == '/') { temp[j] = 0; MyCreateDir(path); temp[j] = CHAR_PATH_SEPARATOR; nameStartPos = j + 1; } } if (SzArEx_IsDir(&db, i)) { MyCreateDir(path); continue; } else { unsigned extLen; const WCHAR *name = temp + nameStartPos; unsigned len = (unsigned)wcslen(name); unsigned nameLen = FindExt(temp + nameStartPos, &extLen); unsigned extPrice = FindItem(kExts, sizeof(kExts) / sizeof(kExts[0]), name + len - extLen, extLen); unsigned namePrice = FindItem(kNames, sizeof(kNames) / sizeof(kNames[0]), name, nameLen); unsigned price = namePrice + extPrice * 64 + (nameStartPos == 0 ? 0 : (1 << 12)); if (minPrice > price) { minPrice = price; executeFileIndex = i; useShellExecute = (extPrice != k_EXE_ExtIndex); } if (DoesFileOrDirExist(path)) { errorMessage = "Duplicate file"; res = SZ_ERROR_FAIL; break; } if (OutFile_OpenW(&outFile, path)) { errorMessage = "Can't open output file"; res = SZ_ERROR_FAIL; break; } } processedSize = outSizeProcessed; if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) { errorMessage = "Can't write output file"; res = SZ_ERROR_FAIL; } #ifdef USE_WINDOWS_FILE if (SzBitWithVals_Check(&db.MTime, i)) { const CNtfsFileTime *t = db.MTime.Vals + i; FILETIME mTime; mTime.dwLowDateTime = t->Low; mTime.dwHighDateTime = t->High; SetFileTime(outFile.handle, NULL, NULL, &mTime); } #endif { SRes res2 = File_Close(&outFile); if (res != SZ_OK) break; if (res2 != SZ_OK) { res = res2; break; } } #ifdef USE_WINDOWS_FILE if (SzBitWithVals_Check(&db.Attribs, i)) SetFileAttributesW(path, db.Attribs.Vals[i]); #endif } } if (res == SZ_OK) { if (executeFileIndex == (UInt32)(Int32)-1) { errorMessage = "There is no file to execute"; res = SZ_ERROR_FAIL; } else { WCHAR *temp = path + pathLen; UInt32 j; SzArEx_GetFileNameUtf16(&db, executeFileIndex, temp); for (j = 0; temp[j] != 0; j++) if (temp[j] == '/') temp[j] = CHAR_PATH_SEPARATOR; } } IAlloc_Free(&allocImp, outBuffer); } SzArEx_Free(&db, &allocImp); File_Close(&archiveStream.file); if (res == SZ_OK) { HANDLE hProcess = 0; #ifndef UNDER_CE WCHAR oldCurDir[MAX_PATH + 2]; oldCurDir[0] = 0; { DWORD needLen = GetCurrentDirectory(MAX_PATH + 1, oldCurDir); if (needLen == 0 || needLen > MAX_PATH) oldCurDir[0] = 0; SetCurrentDirectory(workCurDir); } #endif if (useShellExecute) { SHELLEXECUTEINFO ei; UINT32 executeRes; BOOL success; memset(&ei, 0, sizeof(ei)); ei.cbSize = sizeof(ei); ei.lpFile = path; ei.fMask = SEE_MASK_NOCLOSEPROCESS #ifndef UNDER_CE | SEE_MASK_FLAG_DDEWAIT #endif /* | SEE_MASK_NO_CONSOLE */ ; if (wcslen(cmdLineParams) != 0) ei.lpParameters = cmdLineParams; ei.nShow = SW_SHOWNORMAL; /* SW_HIDE; */ success = ShellExecuteEx(&ei); executeRes = (UINT32)(UINT_PTR)ei.hInstApp; if (!success || (executeRes <= 32 && executeRes != 0)) /* executeRes = 0 in Windows CE */ res = SZ_ERROR_FAIL; else hProcess = ei.hProcess; } else { STARTUPINFOW si; PROCESS_INFORMATION pi; WCHAR cmdLine[MAX_PATH * 3]; wcscpy(cmdLine, path); wcscat(cmdLine, cmdLineParams); memset(&si, 0, sizeof(si)); si.cb = sizeof(si); if (CreateProcessW(NULL, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) res = SZ_ERROR_FAIL; else { CloseHandle(pi.hThread); hProcess = pi.hProcess; } } if (hProcess != 0) { WaitForSingleObject(hProcess, INFINITE); if (!GetExitCodeProcess(hProcess, &exitCode)) exitCode = 1; CloseHandle(hProcess); } #ifndef UNDER_CE SetCurrentDirectory(oldCurDir); #endif } path[pathLen] = L'\0'; RemoveDirWithSubItems(path); if (res == SZ_OK) return (int)exitCode; { if (res == SZ_ERROR_UNSUPPORTED) errorMessage = "Decoder doesn't support this archive"; else if (res == SZ_ERROR_MEM) errorMessage = "Can't allocate required memory"; else if (res == SZ_ERROR_CRC) errorMessage = "CRC error"; else { if (!errorMessage) errorMessage = "ERROR"; } if (errorMessage) PrintErrorMessage(errorMessage); } return 1; }