Другое С/С++ Вопрос - Ответ

Шурик

Активный
216
42
Не могу вот настроить кодировку в проекте с ImGUI, использую эти функции, но ничего не помогает...

C++:
string to_utf8(const char *str)
{
    string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(1251, 0, str, -1, 0, 0);
    if (!result_u)
        return 0;
    wchar_t *ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(1251, 0, str, -1, ures, result_u))
    {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(CP_UTF8, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char *cres = new char[result_c];
    if (!WideCharToMultiByte(CP_UTF8, 0, ures, -1, cres, result_c, 0, 0))
    {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}

string to_cp1251(const char *str)
{
    string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
    if (!result_u)
        return string();
    wchar_t *ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(CP_UTF8, 0, str, -1, ures, result_u))
    {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(1251, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char *cres = new char[result_c];
    if (!WideCharToMultiByte(1251, 0, ures, -1, cres, result_c, 0, 0))
    {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}
 

BlackKnigga

Известный
BH Team
922
445
Не могу вот настроить кодировку в проекте с ImGUI, использую эти функции, но ничего не помогает...

C++:
string to_utf8(const char *str)
{
    string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(1251, 0, str, -1, 0, 0);
    if (!result_u)
        return 0;
    wchar_t *ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(1251, 0, str, -1, ures, result_u))
    {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(CP_UTF8, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char *cres = new char[result_c];
    if (!WideCharToMultiByte(CP_UTF8, 0, ures, -1, cres, result_c, 0, 0))
    {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}

string to_cp1251(const char *str)
{
    string res;
    int result_u, result_c;
    result_u = MultiByteToWideChar(CP_UTF8, 0, str, -1, 0, 0);
    if (!result_u)
        return string();
    wchar_t *ures = new wchar_t[result_u];
    if (!MultiByteToWideChar(CP_UTF8, 0, str, -1, ures, result_u))
    {
        delete[] ures;
        return 0;
    }
    result_c = WideCharToMultiByte(1251, 0, ures, -1, 0, 0, 0, 0);
    if (!result_c) {
        delete[] ures;
        return 0;
    }
    char *cres = new char[result_c];
    if (!WideCharToMultiByte(1251, 0, ures, -1, cres, result_c, 0, 0))
    {
        delete[] cres;
        return 0;
    }
    delete[] ures;
    res.append(cres);
    delete[] cres;
    return res;
}
ImGui::Text(to_utf8("Какие проблемы?").c_str())
Ну и шрифт надо грузить с кириллицей
 

_Vine_

Активный
154
57
Прошу помощи.
Мне нужно найти адрес 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, проблем нет)
vmVplmF.png


Че я увижу если перейду по этому адресу в откладчике:
aAOzR6O.png

Вроде бы все заебись, продолжаем.
Закрываем тестовое приложение, открываем SA:MP, инжектим заного ту же DLL уже в самп.
Что я вижу при инжекте:
uVpYa9c.png

Что это значит?
Это значит то, что модуль d3d9.dll найден, но сканер сигнатур не находит нужный адрес.
Снова перейдем в откладчик, по тому адресу, который мы получили в прошлый раз:
wswOJzo.png

Мы видим точно ту же картину, что и тогда.

Точно таким же образом я пытался инжектить эту длл в совершенно разные процессы, и там, где был модуль d3d9.dll - везде находило нормальный адрес.
Почему же в сампе это не работает?:thinking:
 

BlackKnigga

Известный
BH Team
922
445
Прошу помощи.
Мне нужно найти адрес 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, проблем нет)
vmVplmF.png


Че я увижу если перейду по этому адресу в откладчике:
aAOzR6O.png

Вроде бы все заебись, продолжаем.
Закрываем тестовое приложение, открываем SA:MP, инжектим заного ту же DLL уже в самп.
Что я вижу при инжекте:
uVpYa9c.png

Что это значит?
Это значит то, что модуль d3d9.dll найден, но сканер сигнатур не находит нужный адрес.
Снова перейдем в откладчик, по тому адресу, который мы получили в прошлый раз:
wswOJzo.png

Мы видим точно ту же картину, что и тогда.

Точно таким же образом я пытался инжектить эту длл в совершенно разные процессы, и там, где был модуль d3d9.dll - везде находило нормальный адрес.
Почему же в сампе это не работает?:thinking:
Убери собейт
 

_Vine_

Активный
154
57
потому что собейт заменяет d3d9 либу и твои сигнатуры там не работают
Сканер сигнатур ищет сигнатуру во всем модуле, и она там есть, даже в замененном собейтовском d3d9, я кидал скрин с дебаггера, разве не так?
 

_Vine_

Активный
154
57
Допиши перед названием длл путь к систем32
круто, спасибо, все работает

Зачем вообще что то искать? Есть статический указатель на девайс, поищи в гугле
не нашел ничего, если есть - можно ссылоку?