MasterGH Опубликовано 7 января, 2016 Поделиться Опубликовано 7 января, 2016 Результат Зачем это надо? С помощью примера Lua скрипта (выше) есть возможность получить адреса строк и получить адреса инструкций работающих со строками. Т.е. есть программный доступ к этим "штукам". Ну, вот, а что делать дальше нужно решить самому. Примерно можно думать о следующем. Очень часто в строках (не зашифрованных) находится описание параметра какой-то настройки. Это может быть все что угодно. Например, текущее количество вещей в инвентаре. В теории если найти инструкцию работающую с определенными вещами в инвентаре, то можно сделать инъекцию записывающие все вещи. Когда будет обращение к этой инструкции, например, при каждой загрузке уровня, то могут записаться вещи с максимальным количеством, которое поставили. Т.е. если поставили 9999999 и открыли все вещи, то какой смысл их ломать в игре? Когда их так много, что можно играть с ними очень долго.-- 1. Поиск адресов строк и ссылок на них-- 2. Вывод результата на консольprocessName = 'test.exe' -- подключенный заранее процесс (у вас другой)function convert(T) local tmp={} for k,v in pairs(T) do tmp[#tmp+1]={k,v} end table.sort(tmp,function (a, return a[1]<b[1] end) return tmpendif (dissectCode == nil) then dissectCode = getDissectCode()enddissectCode.clear()dissectCode.dissect(processName)-- Получить таблицу адресов строкreferencedStrings = dissectCode.getReferencedStrings() referencedStringsConv = convert(referencedStrings)local is64Bit = targetIs64Bit()stringlist = createStringlist()for i = 1, #referencedStringsConv do if(referencedStringsConv[i][1] ~= '') then -- Выводим адрес строки if(is64Bit) then stringlist.add(string.format('%016X:', referencedStringsConv[i][1])) else stringlist.add(string.format('%08X:', referencedStringsConv[i][1])) end -- Значение строки (первые 120 символов без поиска символа конца строки и для одной кодировки без widechar) stringlist.add(string.format(' %s', readString(referencedStringsConv[i][1],120))) -- Теперь ищем адреса ссылки на строку выше tableRefData = dissectCode.getReferences(referencedStringsConv[i][1]) referencesConv = convert(tableRefData) -- Выводим адреса инструкций, которые ссылаются на адрес функции for j=1,#referencesConv do local ref = referencesConv[j][1] --local refhex = string.format('%X', ref) local type = referencesConv[j][2] -- type = 0 - jtCall -- type = 1 - jtUnconditional (jmp dword ptr [00458014], jmp 00402DDC ...) -- type = 2 - jtConditional (je 0041F2D4, jae 00414B48, jl 00414428...) -- type = 3 - jtMemory ( mov [esi+30],00422950, mov eax,0040FD4C...) stringlist.add(string.format(' %s, type : %d', disassemble(ref), type)) end end endstringlist.add('')stringlist.add(string.format('Найдено адресов строк : %d', #referencedStringsConv))print(stringlist.Text)stringlist.destroy() Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения