Здравствуйте, гость ( Вход | Регистрация )

> lua, readmem, unicode, Считать из памяти строку в формате UTF-16
фонарик
сообщение 19.2.2024, 14:37
Сообщение #21


****

Apprentice
Сообщений: 148
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 3
Пользователь №: 14.305



Здравствуйте. Не знаю правильно ли я думаю, но пилот не умеет понимать строку в юникоде. Из интернетов были добыты эльфийские инструменты плагины, которые (если судить по светящимся надписям на них) как раз созданы магами-чародеями программистами для таких задач. Но тут вспоминается басня Крылова "Мартышка и очки". На рабочем столе уже не осталось места для размещения очередного артефакта. И вот в печалях, в довлеющем ощущении тяжести и бренности бытия, спешу я снова к вам в лавку алхимиков на форум за советами и помощью.

Вот, например, у одного человека, создаваемый велосипед заканчивается чтением памяти:
Код
Name = readmem ("0x07CCFFD8", "S", 16)
В Name записывется какое-то нечто, вообще не связанное с реальностью. По данному адресу находится:
Код
1D 04 30 04 31 04 3E 04 40 04
что в переводе с древнего наречья с UTF-16 читается как слово "Набор".

То ли я где-то прочёл, то ли кто-то сказал, но я почему-то знаю что необходимо обзавестись синей изолентой плагином, который нужно правильно причесать, положить в правильное место и создать заклинание на ассемблере правильную функцию, которая и считает из памяти всё в правильном виде. Но без вашей помощи мне не справится, я вообще даже не понимаю, правильно ли я в Воронеж ехал сделал ли я хоть что-то правильное в своих попытках. Пожалуйста, поделитесь советом, как же всё-таки данные из памяти правильно приготовить? Легенды гласят, доподлинно известно, что это строка в кодировке UTF-16.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 19.2.2024, 16:36
Сообщение #22


***********

Модератор UOPilot
Сообщений: 9.495
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 28053
Пользователь №: 11.279



Код

--lua
log"clear"

local ffi = require("ffi")
local C = ffi.C
local user = ffi.load('User32')

--bind WINAPI
ffi.cdef
[[
    typedef int            BOOL;
    typedef unsigned char  BYTE;
    typedef unsigned short WORD;
    typedef unsigned long  DWORD;
    typedef void *         LPVOID;
    typedef const void *   LPCVOID;
    typedef DWORD *        LPDWORD;
    typedef void *         PVOID;
    typedef PVOID          HANDLE;
    typedef HANDLE         HWND;
    typedef long           LONG_PTR;
    typedef LONG_PTR       SIZE_T;


    void *malloc(size_t size);
    void free(void *ptr);

    DWORD GetWindowThreadProcessId(DWORD hWnd, LPDWORD lpdwProcessId);
    DWORD OpenProcess(DWORD dwDesiredAccess, BOOL  bInheritHandle, DWORD dwProcessId);
    BOOL  CloseHandle(DWORD hObject);

    int __stdcall MultiByteToWideChar(int cp, int flag, const char* src, int
        srclen, wchar_t* dst, int dstlen);
    int __stdcall WideCharToMultiByte(int cp, int flag, wchar_t *src, int
        srclen, char* dst, int dstlen, const char* defchar, int* used);
    int __stdcall WriteProcessMemory( void *hProcess,void *lpBaseAddress,void
        *lpBuffer,size_t nSize,size_t *lpNumberOfBytesWritten);

    BOOL ReadProcessMemory(
        DWORD  hProcess,
        DWORD  lpBaseAddress,
        LPVOID  lpBuffer,
        SIZE_T  nSize,
        SIZE_T  *lpNumberOfBytesRead
    );
]]

local PROCESS_VM_READ = 0x0010

local export = {}
export.set_buffer_size = function(size)
    export.buffer_raw = nil
    collectgarbage()
    export.buffer_raw = ffi.gc(C.malloc(size), C.free)
    export.buffer_size = size
end
export.set_buffer_size(128)

local ReadMemory = function (address, size) end
do
    local PID = ffi.new('DWORD[1]')
    ReadMemory = function (address, size)
        if size > export.buffer_size then
            export.set_buffer_size(size)
        end

        user.GetWindowThreadProcessId(workwindow(), PID)
log("PID[0]: " .. PID[0])
        local process = C.OpenProcess(PROCESS_VM_READ,true, PID[0]);

        if process > 0 then
            local result = C.ReadProcessMemory(-1, address, export.buffer_raw, size, nil)
            C.CloseHandle(process)
            if result ~= 0  then
                return true
            end
        end
        log('Process not opened') return nil, -2
    end
end

export.char = function (address, lenght)
    if ReadMemory(address, lenght) then
        export.buffer = ffi.cast("char *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.byte = function (address, lenght)
    if ReadMemory(address, lenght) then
        export.buffer = ffi.cast("BYTE *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.short = function (address, lenght)
    if ReadMemory(address, lenght*2) then
        export.buffer = ffi.cast("short *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.word = function (address, lenght)
    if ReadMemory(address, lenght*2) then
        export.buffer = ffi.cast("WORD *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.int = function (address, lenght)
    if ReadMemory(address, lenght*4) then
        export.buffer = ffi.cast("int *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.dword = function (address, lenght)
    if ReadMemory(address, lenght*4) then
        export.buffer = ffi.cast("DWORD *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.float = function (address, lenght)
    if ReadMemory(address, lenght*4) then
        export.buffer = ffi.cast("float *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.double = function (address, lenght)
    if ReadMemory(address, lenght*8) then
        export.buffer = ffi.cast("double *", export.buffer_raw)
        return export.buffer[0]
    end
    return nil
end

export.string = function (address, lenght)
    if ReadMemory(address, lenght) then
        export.buffer = ffi.cast("char *", export.buffer_raw)
        return ffi.string(export.buffer, lenght)
    end
    return nil
end

--unicode to ansistring
function w2astring (wString)

end

export.unicode = function (address, lenght)
    if export.string(address, lenght) then
        local wString = ffi.cast("short *", export.buffer_raw)
        local len = ffi.C.WideCharToMultiByte(0, 0, wString, -1, nil, 0, nil, nil)
        local aString = ffi.new("char[?]",len)
        ffi.C.WideCharToMultiByte(0, 0, wString, -1, aString, lenght, nil, nil)
        return ffi.string(aString)
    end
    return nil
end



что в логе теперь?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
фонарик   lua, readmem, unicode   19.2.2024, 14:37
DarkMaster   Задача именно работать с юникодом или просто счита...   19.2.2024, 15:37
фонарик   Задача именно работать с юникодом или просто счит...   19.2.2024, 15:43
DarkMaster   --lua log"clear" local ffi = require...   19.2.2024, 16:01
фонарик   Тебя интересует функция export.unicode(address, le...   19.2.2024, 16:22
DarkMaster   никаких кавычек. значения переданы верно. рабочее ...   19.2.2024, 16:25
фонарик   никаких кавычек. значения переданы верно. рабочее ...   19.2.2024, 16:27
DarkMaster   считай как string. есть зябрики?   19.2.2024, 16:29
фонарик   А еще в логе перед строкой с nil есть строка с соо...   19.2.2024, 16:30
фонарик   что в логе теперь? 16:37:50 70 (, 0...   19.2.2024, 16:38
DarkMaster   --lua log"clear" local ffi = require...   19.2.2024, 16:42
фонарик   Пробуй. Там читалось окно пилота =) я тестил то на...   19.2.2024, 16:48
DarkMaster   Это больше спасибо cirus и Cockney, которых я сего...   19.2.2024, 16:50
фонарик   Это больше спасибо cirus и Cockney, которых я сего...   19.2.2024, 17:05
DarkMaster   естественно просмотрел. добавьте в конце моего скр...   19.2.2024, 17:26
фонарик   Ну вот, вообще теперь красота :lol: Здоровья и мир...   19.2.2024, 17:42
DarkMaster   А теперь немного о быдло коде =) Меня очень сильно...   19.2.2024, 18:52
Cockney   Так какой вопрос то ?) Тут поинт в том, что два...   19.2.2024, 19:25
DarkMaster   Ну вроде как да, по логике... Но проверка идет то...   19.2.2024, 19:31
Cockney   В общем случае думаю что не прокатит, т.к. там не ...   19.2.2024, 20:02
Aqualon   Если вам просто надо спарсить utf8 строку из памят...   20.2.2024, 2:34
DarkMaster   Можно этот момент поподробнее? Там есть какие-то ...   22.2.2024, 16:42
Cockney   Ну, а какие там стандарты...из описания функция ...   22.2.2024, 20:40
DarkMaster   имелось ввиду возможность прочитать объявленный п...   12.3.2024, 18:44
Cockney   тут лучше на примерах, задача то какая ? пока я то...   12.3.2024, 22:21
DarkMaster   опыт с финдимиджем показал, что malloc столько жр...   13.3.2024, 18:12
Cockney   короче как я понял ты костылишь сериализатор/десер...   15.3.2024, 21:20


Ответить в эту темуОткрыть новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 13.6.2024, 14:35
Designed by Nickostyle