MasterGH Опубликовано 7 января, 2016 Поделиться Опубликовано 7 января, 2016 Результат В CE появилась новая функция в классе DessectCode, которая позволяет получить список функций.DissectCode class: (Inheritance: Object)getDissectCode() : Creates or returns the current code DissectCode objectproperties:methods:clear() : Clears all datadissect(modulename) : Dissects the memory of a moduledissect(base,size) : Dissect the specified memory regionaddReference(fromAddress, ToAddress, type, OPTIONAL isstring):Adds a reference. Type can be jtCall, jtUnconditional, jtConditional, jtMemoryIn case of jtMemory setting isstring to true will add it to the referenced strings listdeleteReference(fromAddress, ToAddress)getReferences(address) : Returns a table containing the addresses that reference this address and the typegetReferencedStrings(): Returns a table of addresses and their strings that have been referenced. Use getReferences to find out which addresses that aregetReferencedFunctions(): Returns a table of functions that have been referenced. Use getReferences to find out which callers that aresaveToFile(filename)loadFromFile(filename) Зачем это надо? С помощью CE Lua скрипта (выше) имеется программный доступ адресам функций и к адресам инструкций, которые работают с адресами функций. Что делать дальше нужно решить самому. Могут находиться не все функции, могут быть и неправильно определенные функции, надо все это проверять с IDA. IDA мне находил call функции, я сохранял их в текстовый файл. Затем с помощью CE Lua правил call-ы, размер которых больше пяти байт на прыжки с inc dword счетчиком. Все эти счетчики я сканировал CE и видел какие функции вызывались по определенным правилам. Например, если я пять раз поднял оружие с земли, то я найду счетчики, а по ним через бряк выйду на функцию, которая вызывалась. Это гораздо быстрее чем работает Ultimap. Теперь когда в CE есть доступ к массиву функций, то IDA можно не юзать. Есть тема с подробностями "Узнаем кол-во срабатываний call-ов на участке кода (CE Lua)"-- 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)-- Получить таблицу адресов функцийtableReferencedFunctions = dissectCode.getReferencedFunctions()local is64Bit = targetIs64Bit()stringlist = createStringlist()for i = 1, #tableReferencedFunctions do -- Выводим адрес функции if(is64Bit) then stringlist.add(string.format('%016X:', tableReferencedFunctions[i])) else stringlist.add(string.format('%08X:', tableReferencedFunctions[i])) end tableRefData = dissectCode.getReferences(tableReferencedFunctions[i]) 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 endstringlist.add('')stringlist.add(string.format('Найдено функций : %d', #tableReferencedFunctions))print(stringlist.Text)stringlist.destroy() 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения