Перейти к содержанию

CE Lua. Поиск адресов функций и инструкций работающих с адресами функций


MasterGH

Рекомендуемые сообщения

Результат

post-3-0-36206800-1452207462_thumb.png

 

В CE появилась новая функция в классе DessectCode, которая позволяет получить список функций.

DissectCode class: (Inheritance: Object)

getDissectCode() : Creates or returns the current code DissectCode object

properties:

methods:

clear() : Clears all data

dissect(modulename) : Dissects the memory of a module

dissect(base,size) : Dissect the specified memory region

addReference(fromAddress, ToAddress, type, OPTIONAL isstring):

Adds a reference. Type can be jtCall, jtUnconditional, jtConditional, jtMemory

In case of jtMemory setting isstring to true will add it to the referenced strings list

deleteReference(fromAddress, ToAddress)

getReferences(address) : Returns a table containing the addresses that reference this address and the type

getReferencedStrings(): Returns a table of addresses and their strings that have been referenced. Use getReferences to find out which addresses that are

getReferencedFunctions(): Returns a table of functions that have been referenced. Use getReferences to find out which callers that are

saveToFile(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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.