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

LUCHARE

Известный
Друг
545
687
  • Нравится
Реакции: AdCKuY_DpO4uLa

ishi

Известный
493
110
У меня уже мозг расплавился от этой чихарды.

Имеется старая игра warzone2100, где по указателю хранится строка
1617205615460.png

Это однобайтовая кодировка, но лишь cheat engine выводит её нормально

Читая её как char*, я получаю козяблики
Выводя её через opengl рендер, вижу тоже самое, что и через MessageBoxA

CharToOem и наоборот -- никак не помогают прочитать эту чёртову строку.

Нагуглил функцию "определения кодировки", и по её показаниям, это не ascii и не ut8
C++:
enum DetectedCoding { ASCII, UTF8, OTHER };

DetectedCoding DetectEncoding(const std::string& s)
{
    const char* cs = s.c_str();
    DetectedCoding d = ASCII;
    while (*cs)
    {
        unsigned char b = (unsigned char)*(cs++);
        if (b & 0x80) { // not a plain ASCII character
        // if the string is already UTF8 encoded, then it must conform to a multibyte sequence standard. Let's verify it
            if (b < 0xC0) // first of all, b must start with 11
                return OTHER; //  no multibyte sequence starts with 10xxxxxx
                // now we expect a number of continuation bytes, depending on the number of ones following the 11
            size_t nCont = 0;
            if (b < 0xE0) // two bytes sequence: 110xxxxx 10xxxxxx
                nCont = 1;
            else if (b < 0xF0) // three bytes sequence: 1110xxxx 10xxxxxx 10xxxxxx
                nCont = 2;
            else if (b < 0xF8) // four bytes sequence: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 3;
            else if (b < 0xFC) // five bytes sequence: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 4;
            else if (b < 0xFE) // six bytes sequence: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 5;
            else
                return OTHER; //  no multibyte sequence starts with 1111111x
            while (nCont--)
                if (((unsigned char)*(cs++) & 0xC0) != 0xC0) // in case string ends, 0 is found so the following test prevents us from illegal memory access
                    return OTHER; //  each continuation byte must starts with 10xxxxxx
            d = UTF8;
        }
    }
    return d;
}
[/code]
Это совершенно точно НЕ мой косяк при чтении, потому что все указатели проверяются, и чтение происходит, лишь когда курсор наведён на иконку элемента, обладающего строкой по нужному оффсету:

C++:
int* ptr = (int*)((char*)GetModuleHandleA(0) + 0x9C4EE0);
int lastnumber = 0;
int* elid2 = 0;
char* buff2 = 0;

bool checkptr()
{
    if (*ptr == 0)
        return 0;
    elid2 = (int*)(*ptr + 8);
    if (*elid2)
    {
        buff2 = (char*)(*ptr + 0xD4);
        if (*(int*)elid2 >= IDSTAT_START)
            if (*(int*)elid2 <= IDSTAT_END)
                return 1;
    }
    return 0;

Отчаянно прошу помощи! Нихрена нагуглить не смог, все мне известные способы конвертации -- тоже не работают! Ужасно!
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
У меня уже мозг расплавился от этой чихарды.

Имеется старая игра warzone2100, где по указателю хранится строка
Посмотреть вложение 91499
Это однобайтовая кодировка, но лишь cheat engine выводит её нормально

Читая её как char*, я получаю козяблики
Выводя её через opengl рендер, вижу тоже самое, что и через MessageBoxA

CharToOem и наоборот -- никак не помогают прочитать эту чёртову строку.

Нагуглил функцию "определения кодировки", и по её показаниям, это не ascii и не ut8
C++:
enum DetectedCoding { ASCII, UTF8, OTHER };

DetectedCoding DetectEncoding(const std::string& s)
{
    const char* cs = s.c_str();
    DetectedCoding d = ASCII;
    while (*cs)
    {
        unsigned char b = (unsigned char)*(cs++);
        if (b & 0x80) { // not a plain ASCII character
        // if the string is already UTF8 encoded, then it must conform to a multibyte sequence standard. Let's verify it
            if (b < 0xC0) // first of all, b must start with 11
                return OTHER; //  no multibyte sequence starts with 10xxxxxx
                // now we expect a number of continuation bytes, depending on the number of ones following the 11
            size_t nCont = 0;
            if (b < 0xE0) // two bytes sequence: 110xxxxx 10xxxxxx
                nCont = 1;
            else if (b < 0xF0) // three bytes sequence: 1110xxxx 10xxxxxx 10xxxxxx
                nCont = 2;
            else if (b < 0xF8) // four bytes sequence: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 3;
            else if (b < 0xFC) // five bytes sequence: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 4;
            else if (b < 0xFE) // six bytes sequence: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                nCont = 5;
            else
                return OTHER; //  no multibyte sequence starts with 1111111x
            while (nCont--)
                if (((unsigned char)*(cs++) & 0xC0) != 0xC0) // in case string ends, 0 is found so the following test prevents us from illegal memory access
                    return OTHER; //  each continuation byte must starts with 10xxxxxx
            d = UTF8;
        }
    }
    return d;
}
[/code]
Это совершенно точно НЕ мой косяк при чтении, потому что все указатели проверяются, и чтение происходит, лишь когда курсор наведён на иконку элемента, обладающего строкой по нужному оффсету:

C++:
int* ptr = (int*)((char*)GetModuleHandleA(0) + 0x9C4EE0);
int lastnumber = 0;
int* elid2 = 0;
char* buff2 = 0;

bool checkptr()
{
    if (*ptr == 0)
        return 0;
    elid2 = (int*)(*ptr + 8);
    if (*elid2)
    {
        buff2 = (char*)(*ptr + 0xD4);
        if (*(int*)elid2 >= IDSTAT_START)
            if (*(int*)elid2 <= IDSTAT_END)
                return 1;
    }
    return 0;

Отчаянно прошу помощи! Нихрена нагуглить не смог, все мне известные способы конвертации -- тоже не работают! Ужасно!
Покажи строку в hex виде в hex view у cheatengine
 
  • Нравится
Реакции: ishi

ishi

Известный
493
110
ты явно в коде делаешь что-то не так:
Посмотреть вложение 91536
А вот, едрись оно конём, хрен его знает, что я делаю не так, если ты прав!
1617256565639.png
C++:
BOOL __stdcall PHook::hkSwapBuffers(_In_ HDC hdc)
{
    if (!init)
    {
     
        //MessageBox(NULL, "1", "2", MB_OK);
        init = true;
    }
    HWND hwnd = GetForegroundWindow();
    if (hwnd && checkptr())
    {
     
        POINT cur;
        GetCursorPos(&cur);
        ScreenToClient(hwnd, &cur);

            PHook::SetupOrtho();

        glShadeModel(GL_SMOOTH);

        /*glBegin(GL_QUADS);
        glColor4f(1.0F, 0.0F, 0.5F, 0.5F);
        glVertex2f(cur.x + 50, cur.y + 30);
        glVertex2f(cur.x + 250.0, cur.y + 30);
        glVertex2f(cur.x + 250.0, cur.y + 250.0);
        glVertex2f(cur.x + 50, cur.y + 250.0);
        glEnd();*/

        glColor4f(0.5F, 7.0F, 0.1F, 1.0F);
        wglUseFontBitmaps(hdc, 0, 256, 1000);

        glRasterPos2f(cur.x + 30.0, cur.y + 65.0);

        glListBase(1000);
        /*int screen[2];
        glGetIntegerv(GL_VIEWPORT, screen);*/
        char totxt[256];
        char totxt2[256];
        memset(totxt, 0, 256);

        OemToCharA(buff2, totxt);
        CharToOemA(buff2, totxt2);
     
        glCallLists(10, GL_UNSIGNED_BYTE, totxt);
        glRasterPos2f(cur.x + 30.0, cur.y + 80.0);
        glCallLists(20, GL_UNSIGNED_BYTE, buff2);
        glRasterPos2f(cur.x + 30.0, cur.y + 95.0);
        glCallLists(20, GL_UNSIGNED_BYTE, totxt2);

        glFlush();

        glDeleteLists(1000, 256);

        PHook::Restore();
    }
    return oSwapBuffers(hdc);
}

Как видно, я вывожу сразу три варианта: и оригинал, и два вида перекодирования. И все три идентичны, и выводится какая-то кракозябра. Чёрт-те знает, что происходит. У меня уже даже идей нет, я вообще всё перепробовал, что в голову приходило.


ЧУВАК, ТЫ ТАКАЯ КИСА, СПАСИБО!
ТЫ МЕНЯ НАТОЛКНУЛ НА НЕСКОЛЬКО НОВЫХ ИДЕЙ ДЛЯ ПРОВЕРКИ, И Я ЗАМЕТИЛ, ЧТО ЗАБЫЛ ВСЕГО ОДИН УРОВЕНЬ УКАЗАТЕЛЯ РАЗЫМЕНОВАТЬ
buff2 это не char*, а char**, едрёна мать, и я всё это время думал, что проблема где-то в другом месте. Капец пиздец.
В ЛЮБОМ СЛУЧАЕ СПАСИБО, БОЖЕ, КАК ЭТО КРУТО

1617257545254.png
 
Последнее редактирование:

Krisp

Новичок
23
1
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер
Надо не удалять, а не вызывать создания искры от пули. Ищешь адресс в плагин СДК(без знаний примитивного английского и логики поиска хер найдешь) и когда нужно на него ставишь ноп. Это я лишь логику работы описал. Не сам рабочий код.
 
  • Нравится
Реакции: Krisp
У

Удалённый пользователь 123482

Гость
Посмотрел в IDA что патчит https://www.blast.hk/threads/19560/, чтобы включить мультипроцесс.
Повторил это и оно хочет воркать. хелп
C++:
memset(*reinterpret_cast<void **>(0x74872D), 0x90, 9);
*reinterpret_cast<unsigned long *>(0x406946) = 0;
 

AdCKuY_DpO4uLa

Известный
287
477
C++:
char *p = new char[128];
strcat(p, "123123123123123123123123123123123123");
printf("%s\n", p);
delete[] p;
printf("%s\n", p);
p = nullptr;
почему p не чистится после delete[] p; ?
если гуглить динамические массивы, то по первой же ссылке будет:
C++:
int num; // размер массива
    cout << "Enter integer value: ";
    cin >> num; // получение от пользователя размера массива

    int *p_darr = new int[num]; // Выделение памяти для массива
    for (int i = 0; i < num; i++) {
        // Заполнение массива и вывод значений его элементов
        p_darr[i] = i;
        cout << "Value of " << i << " element is " << p_darr[i] << endl;
    }
    delete [] p_darr; // очистка памяти
1617896833501.png
 

SR_team

like pancake
BH Team
4,719
6,362
C++:
char *p = new char[128];
strcat(p, "123123123123123123123123123123123123");
printf("%s\n", p);
delete[] p;
printf("%s\n", p);
p = nullptr;
почему p не чистится после delete[] p; ?
если гуглить динамические массивы, то по первой же ссылке будет:
C++:
int num; // размер массива
    cout << "Enter integer value: ";
    cin >> num; // получение от пользователя размера массива

    int *p_darr = new int[num]; // Выделение памяти для массива
    for (int i = 0; i < num; i++) {
        // Заполнение массива и вывод значений его элементов
        p_darr[i] = i;
        cout << "Value of " << i << " element is " << p_darr[i] << endl;
    }
    delete [] p_darr; // очистка памяти
Посмотреть вложение 92469
delete и не должен ничего чистить. Он вызывает деструктор и потом free
 
  • Нравится
Реакции: Roger571