Шурик
Активный
- 216
- 44
Вот про шрифт надо будет протестить, а вот to_utf8("Привет").c_str() - делал, не работало.ImGui::Text(to_utf8("Какие проблемы?").c_str())
Ну и шрифт надо грузить с кириллицей
Вот про шрифт надо будет протестить, а вот to_utf8("Привет").c_str() - делал, не работало.ImGui::Text(to_utf8("Какие проблемы?").c_str())
Ну и шрифт надо грузить с кириллицей
Вот про шрифт надо будет протестить, а вот to_utf8("Привет").c_str() - делал, не работало.
ImGui::GetIO().Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\trebuc.ttf", 16.0f, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
#include <windows.h>
#include <Psapi.h>
#pragma warning(disable:4996)
DWORD FindPattern(HMODULE hModule, char *szPattern, char *szMask)
{
MODULEINFO mInfo = {};
GetModuleInformation(GetCurrentProcess(), hModule, &mInfo, sizeof(MODULEINFO));
DWORD dwBase = (DWORD)mInfo.lpBaseOfDll;
DWORD dwSize = (DWORD)mInfo.SizeOfImage;
DWORD dwPatternLength = (DWORD)strlen(szMask); for (DWORD i = 0; i < dwSize - dwPatternLength; i++)
{
bool bFound = true;
for (DWORD j = 0; j < dwPatternLength; j++) bFound &= szMask[j] == '?' || szPattern[j] == *(char*)(dwBase + i + j); if (bFound) return dwBase + i;
}
return 0;
}
void Thread()
{
HMODULE hD3D9 = GetModuleHandleA("d3d9.dll");
if (hD3D9)
{
char buf[256];
DWORD D3DDevice = FindPattern(hD3D9, "\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
MessageBoxA(0, _itoa(D3DDevice, buf, 16), 0, 0);
}
else
MessageBoxA(0, "hD3D9 == 0", 0, 0);
}
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0);
return TRUE;
}
Убери собейтПрошу помощи.
Мне нужно найти адрес EndScene из d3d9.dll сканером сигнатур, паттерн и маска известны.
Вот сам код:
C++:#include <windows.h> #include <Psapi.h> #pragma warning(disable:4996) DWORD FindPattern(HMODULE hModule, char *szPattern, char *szMask) { MODULEINFO mInfo = {}; GetModuleInformation(GetCurrentProcess(), hModule, &mInfo, sizeof(MODULEINFO)); DWORD dwBase = (DWORD)mInfo.lpBaseOfDll; DWORD dwSize = (DWORD)mInfo.SizeOfImage; DWORD dwPatternLength = (DWORD)strlen(szMask); for (DWORD i = 0; i < dwSize - dwPatternLength; i++) { bool bFound = true; for (DWORD j = 0; j < dwPatternLength; j++) bFound &= szMask[j] == '?' || szPattern[j] == *(char*)(dwBase + i + j); if (bFound) return dwBase + i; } return 0; } void Thread() { HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); if (hD3D9) { char buf[256]; DWORD D3DDevice = FindPattern(hD3D9, "\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx"); MessageBoxA(0, _itoa(D3DDevice, buf, 16), 0, 0); } else MessageBoxA(0, "hD3D9 == 0", 0, 0); } BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved) { if (dwReason == DLL_PROCESS_ATTACH) CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Thread, 0, 0, 0); return TRUE; }
Объясню че делает:
1) в dllmain'e создается новый поток "Thread"
2) в потоке "Thread" я получаю модуль d3d9.dll, если его нету вывожу сообщение о его отсутствии
3) если модуль d3d9.dll успешно получен - сканером сигнатур получаю адрес EndScene и вывожу его адрес в HEX'e
Сама проблема:
Если я инжекчу мою длл в тестовое приложение win32, там где нихуя нету, то я увижу это(нормальный адрес EndScene, проблем нет)
![]()
Че я увижу если перейду по этому адресу в откладчике:
![]()
Вроде бы все заебись, продолжаем.
Закрываем тестовое приложение, открываем SA:MP, инжектим заного ту же DLL уже в самп.
Что я вижу при инжекте:
![]()
Что это значит?
Это значит то, что модуль d3d9.dll найден, но сканер сигнатур не находит нужный адрес.
Снова перейдем в откладчик, по тому адресу, который мы получили в прошлый раз:
![]()
Мы видим точно ту же картину, что и тогда.
Точно таким же образом я пытался инжектить эту длл в совершенно разные процессы, и там, где был модуль d3d9.dll - везде находило нормальный адрес.
Почему же в сампе это не работает?:thinking:
Спасибо, помогло, но полностью это проблему не решает, почему с собейтом это не работает и как это исправить?Убери собейт
потому что собейт заменяет d3d9 либу и твои сигнатуры там не работаютСпасибо, помогло, но полностью это проблему не решает, почему с собейтом это не работает и как это исправить?
Сканер сигнатур ищет сигнатуру во всем модуле, и она там есть, даже в замененном собейтовском d3d9, я кидал скрин с дебаггера, разве не так?потому что собейт заменяет d3d9 либу и твои сигнатуры там не работают
Зачем вообще что то искать? Есть статический указатель на девайс, поищи в гуглеСпасибо, помогло, но полностью это проблему не решает, почему с собейтом это не работает и как это исправить?
круто, спасибо, все работаетДопиши перед названием длл путь к систем32
не нашел ничего, если есть - можно ссылоку?Зачем вообще что то искать? Есть статический указатель на девайс, поищи в гугле
0xC97C28не нашел ничего, если есть - можно ссылоку?
DLL_PROCESS_DETACHКак можно вызвать функцию при выключении плагина/выходе из игры
Для СФ это не подойдет. Так же в DLL_PROCESS_DETACH надо делать валидность на плагин.DLL_PROCESS_DETACH
А причём тут SF?Для СФ это не подойдет. Так же в DLL_PROCESS_DETACH надо делать валидность на плагин.