// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.h"
#include <process.h>
#include <Windows.h>
#include <TlHelp32.h>
#include <string>
void InjectJump(DWORD _offset, DWORD target)
{
unsigned long Protection;
VirtualProtect((void*)_offset, 5, PAGE_EXECUTE_READWRITE, &Protection);
target -= (_offset + 5);
*((char*)_offset) = 0xE9;
memcpy((LPVOID)(_offset + 1), &target, sizeof(DWORD));
VirtualProtect((void*)_offset, 5, Protection, 0);
}
VOID _stdcall OnSendChatCallback(DWORD arg1, DWORD arg2)
{
std::string msgText = "arg1 = " + std::to_string(arg1) + "\narg2 = " + std::to_string(arg2);
MessageBoxA(GetForegroundWindow(), msgText.c_str(), "CallBack", NULL);
}
LPVOID _onSendChatRetAddr;
_declspec(naked) VOID _onSendChatCallback()
{
_asm
{
pushad
//Количество пушей - это количество аргументов функции
//Смещение в стэке расчитывается так: (кол-во аргументов)*4+0x20
push[esp + 0x28]
push[esp + 0x28]
//Вызываем нашу основную функцию
call OnSendChatCallback
popad
//Ниже повторяем действия, которые мы подменили
push ebx
push esi
push edi
lea edi, [ecx + 0x196D]
//Возвращаемся в функцию
jmp _onSendChatRetAddr
}
}
void FuckAmazing(PVOID)
{
for (int i = 0x68E65; i < 0x68E69; ++i)
*(unsigned char*)i = 0x90; // nop
DWORD dwSAMP = (DWORD)GetModuleHandle(L"samp.dll");
_onSendChatRetAddr = (LPVOID)(dwSAMP + 0x68E65);
InjectJump(dwSAMP + 0x68E60, (DWORD)&_onSendChatCallback);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
_beginthread(FuckAmazing, NULL, NULL);
return TRUE;
}