F0RQU1N and
Известный
- 1,294
- 501
samp - это адрес в памяти
0xB7C5 это смещение
Нужно хукнуть samp.dll?
Или как сделать что бы просто работало? 😄
std::string chatSAMP{ "SAMP 0.3.7 R1" };
class patchChatSAMP {
public:
patchChatSAMP() {
*reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP;
}
}
на данное предупреждение можешь не обращать внимания, .asi плагины подгружаются после подгрузки модуля samp.dll, а значит он уже не может быть пустым
std::string chatSAMP{ "SAMP 0.3.7 R1" };
class patchChatSAMP {
public:
patchChatSAMP() {
*reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP;
}
} pChatSAMP;
так ты прям в иде можешь поменять байтыС++:#include "pch.h" #include "string" std::string chatSAMP{ "SAMP 0.3.7 R1" }; class patchChatSAMP { public: patchChatSAMP() { *reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP; } } pChatSAMP; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
Всё равно не хочет работать 😒
Посмотреть вложение 140403
Посмотреть вложение 140404
С++:#include "pch.h" #include "string" std::string chatSAMP{ "SAMP 0.3.7 R1" }; class patchChatSAMP { public: patchChatSAMP() { *reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP; } } pChatSAMP; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
Всё равно не хочет работать 😒
Посмотреть вложение 140403
Посмотреть вложение 140404
#include "pch.h"
#include <string>
std::string chatSAMP{ "SAMP 0.3.7 R1" };
class patchChatSAMP {
private:
uintptr_t module_samp{ 0 };
public:
patchChatSAMP() {
module_samp = reinterpret_cast<uintptr_t>(GetModuleHandleA("samp.dll"));
DWORD lpflOldProtect;
VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
*reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP;
VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, lpflOldProtect, &lpflOldProtect);
}
} pChatSAMP;
#include "pch.h"
#include <string>
std::string chatSAMP{ "SAMP 0.3.7 R1" };
class patchChatSAMP {
private:
uintptr_t module_samp{ 0 };
public:
patchChatSAMP() {
module_samp = reinterpret_cast<uintptr_t>(GetModuleHandleA("samp.dll"));
DWORD lpflOldProtect;
VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
*reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP[0];
VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, lpflOldProtect, &lpflOldProtect);
}
} pChatSAMP;
#include <windows.h>
BOOL APIENTRY DllMain( HMODULE, DWORD dwReason, LPVOID ) {
if ( dwReason == DLL_PROCESS_ATTACH ) {
auto samp = (DWORD)GetModuleHandleA( "samp.dll" );
auto addr = samp + 0xE596Cu + 29u;
DWORD vp = PAGE_EXECUTE_READWRITE;
VirtualProtect( (void *)addr, 1u, vp, &vp );
*(char *)addr = '1';
VirtualProtect( (void *)addr, 1u, vp, nullptr );
}
}
зачем трогать оригинальную строчку, ведь если ему потребуется использовать строку больше 46 символов, то твой пример затронет и чужую строкувы ебнутые? @zTechnology @legendabrn
C++:#include <windows.h> BOOL APIENTRY DllMain( HMODULE, DWORD dwReason, LPVOID ) { if ( dwReason == DLL_PROCESS_ATTACH ) { auto samp = (DWORD)GetModuleHandleA( "samp.dll" ); auto addr = samp + 0xE596Cu + 29u; DWORD vp = PAGE_EXECUTE_READWRITE; VirtualProtect( (void *)addr, 1, vp, &vp ); *(char *)addr = '1'; VirtualProtect( (void *)addr, 1, vp, nullptr ); } }
ему надо 1 символ поменять, кстати твой пример тоже работать не будет, там const char[] а ты подменяешь на std::string.зачем трогать оригинальную строчку, ведь если ему потребуется использовать строку больше 46 символов, то твой пример затронет и чужую строку
ему надо 1 символ поменять, кстати твой пример тоже работать не будет, там const char[] а ты подменяешь на std::string.
в любом случае это UB, т.к. если кто то (к примеру другой плагин) будет пытаться обращаться к этой памяти, он скорее всего будет это делать как const char[], а там будет лежать указатель на std string
че ты несешь, там указатель на саму строку...
std::string chatSAMP{ "SAMP 0.3.7 R1" }
там указатель на std::string*reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP;
такой структурой
Lua:typedef struct _stdstring { union { char str[16]; char* pstr; }; size_t length; size_t allocated; } stdstring;
@ShadowBroker да
с gcc компилятором ничего не работает.@4el0ve4ik @legendabrn вам повезло, что указатель на первом месте стоит
а твой пример ваще никак не будет работатьведь если ему потребуется использовать строку больше 46 символов