|
lua, readmem, unicode, Считать из памяти строку в формате UTF-16 |
|
|
фонарик |
19.2.2024, 14:37
|
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.
|
|
|
|
|
|
Ответов
DarkMaster |
19.2.2024, 16:36
|
Модератор 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____
|
|
|
|
Сообщений в этой теме
фонарик 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
|
|