#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);*/
} 

C++ Online Compiler

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!

Read inputs from stdin

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;
}

About C++

C++ is a widely used middle-level programming language.

  • Supports different platforms like Windows, various Linux flavours, MacOS etc
  • C++ supports OOPS concepts like Inheritance, Polymorphism, Encapsulation and Abstraction.
  • Case-sensitive
  • C++ is a compiler based language
  • C++ supports structured programming language
  • C++ provides alot of inbuilt functions and also supports dynamic memory allocation.
  • Like C, C++ also allows you to play with memory using Pointers.

Syntax help

Loops

1. If-Else:

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.

2. Switch:

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;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  //code  
} 

4. While:

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 
}  

5. Do-While:

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); 

Functions

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.

How to declare a Function:

return_type function_name(parameters);

How to call a Function:

function_name (parameters)

How to define a Function:

return_type function_name(parameters) {  
 // code
}