#pragma once #include <stdlib.h> #include "windows.h" #include <stdio.h> #include <iostream> #include <fstream> #include "anti.h" #include <ShlObj.h> // Shell API #include <Propkey.h> // PKEY_* constants #include <atlbase.h> // CComPtr, CComHeapPtr #include <io.h> #include <fcntl.h> #include <psapi.h> #include <string> #include <system_error> #include <comdef.h> #include <TlHelp32.h> #pragma comment(lib, "psapi.lib") using namespace std; std::wstring GetShellPropStringFromPath(LPCWSTR pPath, PROPERTYKEY const& key) { // Use CComPtr to automatically release the IShellItem2 interface when the function returns // or an exception is thrown. if (pPath!=nullptr){ CComPtr<IShellItem2> pItem; HRESULT hr = SHCreateItemFromParsingName(pPath, nullptr, IID_PPV_ARGS(&pItem)); if SUCCEEDED(hr){ CComHeapPtr<WCHAR> pValue; hr = pItem->GetString(key, &pValue); return std::wstring(pValue); } } } char* WideStringToAnsi(const wstring& Str, unsigned int CodePage = CP_ACP) { DWORD BuffSize = WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, NULL, 0, NULL, NULL); if (!BuffSize) return NULL; char* Buffer = new char[BuffSize]; if (!WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, Buffer, BuffSize, NULL, NULL)) return NULL; return (Buffer); } //получить базовый адрес процесса LPVOID GetBaseAddress(HANDLE hProc) { //структура с информацией о процессе MODULEINFO miInfo; //получаем базовый адрес процесса if (GetModuleInformation(hProc, NULL, &miInfo, sizeof(miInfo))) return miInfo.EntryPoint; else return NULL; } //получить размер используемой памяти приложения(в байтах) DWORD GetMemorySize(HANDLE hProc) { //структура с информацией о процессе PROCESS_MEMORY_COUNTERS pmcInfo; //получаем информацию о процессе if (GetProcessMemoryInfo(hProc, &pmcInfo, sizeof(pmcInfo))) return (DWORD)pmcInfo.WorkingSetSize; else return 0; } bool MethodScanApp() { HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snap){ PROCESSENTRY32 pe; pe.dwSize = sizeof(pe); std::string debuggerNamesdesc[] = { "Cheat Engine" }; std::string debuggerNamesexe[] = { "Cheat Engine" }; if (Process32First(snap, &pe)){ do { auto hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe.th32ProcessID); if (hProcess) { std::ofstream out("hex.txt", std::ios::app); //out << pe.th32ProcessID << std::endl; WCHAR buffer[MAX_PATH]; DWORD bufSize = MAX_PATH; QueryFullProcessImageName(hProcess, 0, buffer, &bufSize); _bstr_t b(buffer); const char* c = b; std::wstring tem; /* auto lvm = GetShellPropStringFromPath(buffer, PKEY_FileDescription); if (lvm != tem) { auto cf = WideStringToAnsi(lvm); for (int i = 0; i < (sizeof(debuggerNamesdesc) / sizeof(*debuggerNamesdesc)); i++) { if (debuggerNamesdesc[i] == cf) { out << cf << std::endl; out << c << std::endl; out << "CHEATTTTTTTTTTTTTTTTTTTTTTTTTT" << std::endl; //MessageBox(NULL,buffer,TEXT("CHEAT?"), MB_ICONERROR); return true; } } }*/ LPVOID dwStart = GetBaseAddress(hProcess); //получаем размер занимаемой памяти DWORD dwMemSize = GetMemorySize(hProcess); const char* signature = "Trainer"; // Последовательность которую будем искать size_t len_signature = strlen(signature); // Длина последовательности. DWORD start = (DWORD)dwStart;//счётчик для цикла SIZE_T lpRead = 0; while (start < ((DWORD)dwStart + dwMemSize)) { MEMORY_BASIC_INFORMATION mbi; int sz = VirtualQueryEx(hProcess, (void*)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if ((mbi.State == MEM_COMMIT) //если регион в состоянии передачи памяти && //и (mbi.Protect != PAGE_READONLY) //регион не только для чнения && //и (mbi.Protect != PAGE_EXECUTE_READ) //регион не тролько с исполнением программного кода и чтением && //и (mbi.Protect != PAGE_GUARD) //регион без сигнала доступа к странице && //и (mbi.Protect != PAGE_NOACCESS) //регион не защищён доступом к нему )//то { if (mbi.RegionSize != lpRead) { BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион if (ReadProcessMemory(hProcess, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead)) { BYTE* p = lpData; while ((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0) { if (0 == memcmp(p + 1, signature + 1, len_signature - 1)) { // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность. // соответственно адрес в приложении равен: Start + (p - lpData); out << c << std::endl; out << "trainer" << std::endl; //MessageBox(NULL, buffer, TEXT("CHEAT?"), MB_ICONERROR); return true; } ++p; } } free(lpData); } } start += mbi.RegionSize;//переходим на следующий регион } signature = "ArtMoney"; // Последовательность которую будем искать len_signature = strlen(signature); // Длина последовательности. start = (DWORD)dwStart;//счётчик для цикла lpRead = 0; while (start < ((DWORD)dwStart + dwMemSize)) { MEMORY_BASIC_INFORMATION mbi; int sz = VirtualQueryEx(hProcess, (void*)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if ((mbi.State == MEM_COMMIT) //если регион в состоянии передачи памяти && //и (mbi.Protect != PAGE_READONLY) //регион не только для чнения && //и (mbi.Protect != PAGE_EXECUTE_READ) //регион не тролько с исполнением программного кода и чтением && //и (mbi.Protect != PAGE_GUARD) //регион без сигнала доступа к странице && //и (mbi.Protect != PAGE_NOACCESS) //регион не защищён доступом к нему )//то { if (mbi.RegionSize != lpRead) { BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион if (ReadProcessMemory(hProcess, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead)) { BYTE* p = lpData; while ((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0) { if (0 == memcmp(p + 1, signature + 1, len_signature - 1)) { // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность. // соответственно адрес в приложении равен: Start + (p - lpData); out << c << std::endl; out << "art money" << std::endl; //MessageBox(NULL, buffer, TEXT("CHEAT?"), MB_ICONERROR); return true; } ++p; } } free(lpData); } } start += mbi.RegionSize;//переходим на следующий регион } signature = "Cheat Engine"; // Последовательность которую будем искать len_signature = strlen(signature); // Длина последовательности. start = (DWORD)dwStart;//счётчик для цикла lpRead = 0; while (start < ((DWORD)dwStart + dwMemSize)) { MEMORY_BASIC_INFORMATION mbi; int sz = VirtualQueryEx(hProcess, (void*)start, &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if ((mbi.State == MEM_COMMIT) //если регион в состоянии передачи памяти && //и (mbi.Protect != PAGE_READONLY) //регион не только для чнения && //и (mbi.Protect != PAGE_EXECUTE_READ) //регион не тролько с исполнением программного кода и чтением && //и (mbi.Protect != PAGE_GUARD) //регион без сигнала доступа к странице && //и (mbi.Protect != PAGE_NOACCESS) //регион не защищён доступом к нему )//то { if (mbi.RegionSize != lpRead) { BYTE* lpData = (BYTE*)malloc(mbi.RegionSize);//резервируем место для массива lpData, размером в регион if (ReadProcessMemory(hProcess, (LPCVOID)start, lpData, mbi.RegionSize, &lpRead)) { BYTE* p = lpData; while ((p = (BYTE*)memchr(p, signature[0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0) { if (0 == memcmp(p + 1, signature + 1, len_signature - 1)) { // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность. // соответственно адрес в приложении равен: Start + (p - lpData); out << c << std::endl; out << "cheat engine" << std::endl; //MessageBox(NULL, buffer, TEXT("CHEAT?"), MB_ICONERROR); return true; } ++p; } } free(lpData); } } start += mbi.RegionSize;//переходим на следующий регион } out.close(); } CloseHandle(hProcess); } while (Process32Next(snap, &pe)); } CloseHandle(snap); } return false; /* HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 peProcessEntry; peProcessEntry.dwSize = sizeof(PROCESSENTRY32); Process32First(hSnapshot, &peProcessEntry); do { out << *peProcessEntry.szExeFile << std::endl; DWORD dwProcessID = peProcessEntry.th32ProcessID; LPCWSTR lpmod = NULL; std::string debuggerNames[] = { "ollydbg.exe", "ida.exe" }; HANDLE hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcessID); out << "gop" << std::endl; if (hthSnapshot) { MODULEENTRY32 me = { sizeof(me) }; if (Module32First(hthSnapshot, &me)) { CloseHandle(hthSnapshot); lpmod = (LPCWSTR)me.szExePath; } } GetShellPropStringFromPath(lpmod, PKEY_FileDescription); for (int i = 0; i < (sizeof(debuggerNames) / sizeof(*debuggerNames)); i++) { std::cout << debuggerNames[i] << "\n"; if (debuggerNames[i] == stringfied) { return true; } } } while (Process32Next(hSnapshot, &peProcessEntry)); CloseHandle(hSnapshot);*/ }
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++
and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}