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

Установка бряков по адресам Ultimap (Заготовка)


MasterGH

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

post-3-0-94555100-1421810983_thumb.png

Название формы: "frmUltimap"

Название поля: "ListView1"

 

Цели:

1. Вывести текст всей таблицы в консоль

Скрытый текст

 


-- Вывод колонки 1

function FindFrom(formName)	  
	local formCount = getFormCount()
	for i=0, formCount-1 do if(getForm(i).Name == formName) then return getForm(i) end end
end

function PrintListView(argListView)

	local items1 = argListView.Items
	local linesCount = items1.getCount()
	local line = ''
	
	for i=0, linesCount-1 do
		local item = items1.getItem(i)
		line = item.Caption
		local subItems = item.SubItems
		itemCount = subItems.getCount()

		for j=0, itemCount-1 do	line = line..'      '..subItems[j] end
		print(line)
	end
end	
		
		
local frmUltimap = FindFrom('frmUltimap')
local ultimapListView1 = frmUltimap.findComponentByName('ListView1')
PrintListView(ultimapListView1)

 

Пример результата:


test.exe+2F4C test.exe+2E8A 10
test.exe+2F51 test.exe+2E8A 10
test.exe+4AE1 test.exe+4A87 10
test.exe+6A98 test.exe+26CD4 10
test.exe+6C00 test.exe+368BC 10
test.exe+6D00 test.exe+26D1E 10
test.exe+844C test.exe+8529 10
test.exe+8480 test.exe+845C 10
test.exe+84CA test.exe+84A1 10
test.exe+8516 test.exe+8504 10
test.exe+8518 test.exe+5465C 10
test.exe+852E test.exe+8516 10
test.exe+8536 test.exe+4765 10
test.exe+8A74 test.exe+8CB2 10
test.exe+8A7D test.exe+2F5B 10

 

 

2. Вывести текст определенной колонки

Скрытый текст

 


-- Вывод колонки2
function FindFrom(formName)	
	local formCount = getFormCount()
	for i=0, formCount-1 do     
		if(getForm(i).Name == formName) then return getForm(i) end
	end
end 

function PrintColumn(argListView, columnNumber)
	local items1 = argListView.Items
	local linesCount = items1.getCount()
	local line = ''
	for i=0, linesCount-1 do
		local item = items1.getItem(i)
		if(columnNumber == 1) then
			print(item.Caption)
		else 
			local subItems = item.subItems 
			local itemCount = subItems.getCount() 
			if(columnNumber == 2) then print(subItems[columnNumber-2]) end 
		end
	end
end

local frmUltimap = FindFrom('frmUltimap')
local ultimapListView1 = frmUltimap.findComponentByName('ListView1')
PrintColumn(ultimapListView1, 2)

 

Пример результата:

 

Скрытый текст


test.exe+2E8A
test.exe+2E8A
test.exe+4A87
test.exe+26CD4
test.exe+368BC
test.exe+26D1E
test.exe+8529
test.exe+845C
test.exe+84A1
test.exe+8504
test.exe+5465C
test.exe+8516
test.exe+4765
test.exe+8CB2
test.exe+2F5B
test.exe+8CA9
test.exe+2C9A

 

 

 

3. Поставить брейкпоинты на все адреса первой или второй колонки

 

Скрытый текст

 

Пример результата установки бряков на вторую коонку (окно открыть из дизассемблера):

post-3-0-99984200-1421811688_thumb.png

 


--Установка брейкпоинтов

function FindFrom(formName)
	local formCount = getFormCount()
	for i=0, formCount-1 do if(getForm(i).Name == formName) then return getForm(i) end end
end 

function SetBreakPoints(argListView, columnNumber)
	local items1 = argListView.Items
	local linesCount = items1.getCount()
	local line = ''
	for i=0, linesCount-1 do
		local item = items1.getItem(i)
		if(columnNumber == 1) then 
			debug_setBreakpoint(item.Caption, 1, bptExecute)
		else
			local subItems = item.subItems
			local itemCount = subItems.getCount()
			if(columnNumber == 2) then debug_setBreakpoint(subItems[columnNumber-2], 1, bptExecute) end 
		end
	end
end

local frmUltimap = FindFrom('frmUltimap')
local ultimapListView1 = frmUltimap.findComponentByName('ListView1')
SetBreakPoints(ultimapListView1, 2) -- номер колонки 2, можно указать и номер 1

local columnNumber = 1 -- первая или "2" вторая колонка
frmSaveDialog = nil

 

 

4. Сохранить выбранную колонку с адресами в файл *.address

Скрытый текст

-- Сохранение в файл и вывод в консоль

columnNumber = 1 -- первая или "2" вторая колонка
frmSaveDialog = nil

function FindFrom(formName)
	local formCount = getFormCount()
	for i=0, formCount-1 do	if(getForm(i).Name == formName) then return getForm(i) end end
end

function SaveToAdressesList(path)
	local frmUltimap = FindFrom('frmUltimap')
	local ultimapListView = frmUltimap.findComponentByName('ListView1')
	local items1 = ultimapListView.Items
	local linesCount = items1.getCount()
	local stringList = createStringlist()

	if(columnNumber == 1) then
		for i=0, linesCount-1 do 
			print(items1.getItem(i).Caption)
			stringList.add(items1.getItem(i).Caption) 
		end
	else
		if(columnNumber == 2) then
			for i=0, linesCount-1 do
				local subItems = items1.getItem(i).subItems	
				local itemCount = subItems.getCount()
				print(subItems[0])
				stringList.add(subItems[0])
			end
		end
	end
	stringList.saveToFile(path)
	stringList.destroy()
end

function OnCloseSaveDialog(argFrmSaveDialog)
	local path = argFrmSaveDialog.FileName
	SaveToAdressesList(path)
end

if(frmSaveDialog == nil) then
	frmSaveDialog = createSaveDialog(nil)
end

frmSaveDialog.DefaultExt = '.address'

frmSaveDialog.FileName = fileName
frmSaveDialog.Filter = '*.address'
frmSaveDialog.FilterIndex = -1
frmSaveDialog.OnClose = OnCloseSaveDialog
frmSaveDialog.Execute()

 

 

5. Установить брейкпоинты из файла *.adresses

 

Скрытый текст

 


-- Загрузка из в файла и вывод в консоль

function SetBreakPointsFromFile(path)
	local stringList = createStringlist()
	stringList.loadFromFile(path)
	local linesCount = stringList.Count
	for i=0, linesCount-1 do
		debug_setBreakpoint(stringList, 1, bptExecute) 
		print(stringList)
	end
	stringList.destroy()
end

function OnCloseOpenDialog(argFrmOpenDialog)
	local path = argFrmOpenDialog.FileName
	SetBreakPointsFromFile(path)
end

if(frmOpenDialog == nil) then
	frmOpenDialog = createOpenDialog(nil)
end

local columnNumber = 1 -- первая или "2" вторая колонка

frmOpenDialog.DefaultExt = '.address'
frmOpenDialog.FileName = fileName
frmOpenDialog.Filter = '*.address'
frmOpenDialog.FilterIndex = -1
frmOpenDialog.OnClose = OnCloseOpenDialog
frmOpenDialog.Execute()

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Оно отслеживает ветки кода, которые выполнились или не выполнились за определенный промежуток времени. Как сканер адресов, только для call-ов.

Ссылка на комментарий
Поделиться на другие сайты

Если не сложно, хотя бы парой слов, можешь объяснить, что за UltiMap?

По названию понятно, что это карта чего-то, но вот чего?

 Лучше сюды писать, ultimap-тема там

 

Ultimap парой слов можно попробовать объяснить. Если ты взял с земли шесть раз предмет, то можно найти call-ы, которые ровно 6 раз вызывались. 

 

Если поставить все бряки на адреса второй колонки, то первый бряк и предположительно нужно исследовать. Это будет первый call, от которого начинается ветвь кода, в которой начинается поднятие оружия. Остальные бряки желательно сразу отключить. Чтобы это сделать разом я напишут еще скрипт. Где-то выше этого call-а есть условие, которое как спусковой крючок запускает поднятие оружия по горячей клавише. Надо либо это условие менять, либо вызывать call-ы потоком игры....

 

 

...В теории можно получить оружие, которого у тебя не было. Пока на практике это не удалось сделать. Ну, времени мало... куча работы. На выходных скорее всего.

 

Оно отслеживает ветки кода, которые выполнились или не выполнились за определенный промежуток времени. Как сканер адресов, только для call-ов.

Ну, если образно выразиться. Скорее части ветвей отладочного кода. Трейс лог более полно может показать ветвь кода как раз при установке на "верхний call"

 

 

Весьма интересно, как это делается) Неужели, на все найденные функции элементарно ставятся бряки?

На все, которые находятся в определенной колонке. Проверено. Потом задолбаешся их снимать удерживая Del

Ссылка на комментарий
Поделиться на другие сайты

Добавлены пункты:

4 - сохранение списка адресов из колонки Ultimap в файл *.address через диалог сохранения

5 - установка бряков "на выполнение" из файла-списка*.address

 

Пункт 4 позволит сохранить найденные адреса в файл во время зависания игры. У меня игра частенько виснет, если что-то долго искать. Чтобы результат не пропадал очень пригодится, чтобы не делать повторный поиск.

В файле *.address можно удалить или добавить адреса, а затем поставить махом на них бряки "на выполнение".

 

Когда в игре бряки выполняются, а желаемое действие мы еще не делали, то эти бряки не подходят. Их надо удалять, а бряки которые срабатывают во время желаемого действия нужно сохранять. Хотя, если сканировали Ultimap правильно фильтруя не десвующие и действующие адреса, то бряки вручную удалять из файла не надо будет.

 

Кстати это и пример того как сохранять и загружать текст используя диалоги. Может пригодиться, если нужно сохранять логи. Анализировать их например сторонней программой на любимом языке программирования.

 

-----

К сожалению не работает функция:

debug_getBreakpointList(): Returns a lua table containing all the breakpoint addresses

Она должна будет работать в новых версиях CE судя по логам исправлений на офиц. сайте CE.

 

Надо будет сделать кнопку в окне бряков, которая удалит все брейкпоинты. Уже запарило чистить.

Ссылка на комментарий
Поделиться на другие сайты

Репозиторий

 

Появились продвижения по вызову функций. Я готовлю новый плагин "Repeater", который позволит вызывать если не любые функции, то большинство из них. Если найти адрес в Ultimap, то сделать повтор действия в игре будет очень просто через плагин.

 

При тестах удалось вызывать пока функцию дельфи, которую нажимала кнопка

 

post-3-0-55869700-1422211410_thumb.png

 

На скрине видно окно плагина и две кнопки. Обе они визуально увеличивают число на 1 ед.

 

Плагин тем не менее не доделан. Подмена ESP на другой регион памяти с копией стека вызывает вылет приложения ибо регион памяти не имеет нужных прав. Здесь два выхода не менять esp и заполнить его или же менять esp и менять права региона памяти.

 

Технология следующая.

Читер находит верхний call из Ultimap

Открывает плагин. Вводит адрес этого call и называет Событие каким-нибудь именем. Создает событие и появляется кнопка. Событий можно сделать не больше 10. Т.е. 10 кнопок может появиться. Кликая на них в игре будет повторяться действие.

 

Что происходит за кулисами?

За кулисами происходит установка бряка на call и создается кнопка отключенная.

Игрок идет в игру, совершает действие.

Происходит бряк

Затем Луа код плагина бряк снимает

Снятие дампа стека

Немного дизаасемблирования, ассемблирования и прочая хренотень для вызова функции по копии дампа стека и по копии данных регистров

Кнопка становится активной

Процесс игры отпускается

Все... теперь нажимая на кнопку в окне Repeater действие в игре повторяется по копии данных стека и регистров снятых от предыдущего действия

 

Пока копия стека не используется из-за ошибки, т.к. нарушение прав региона памяти при подмене esp.

 

Как решу проблему с ESP, как проверю работу на игре, то будет плагин.

 

Пока код такой без формы, для интересующихся (форму не даю, т.к. плагин не рабочий пока):

 

Скрытый текст

 

--Author: MasterGH, 26.01.2015, Gamehacklab[RU] (http://gamehacklab.ru)frmRepeater  = createFormFromFile(getCheatEngineDir().."\\autorun\\frmRepeater.xml")if(frmRepeater == nil) then	messageDialog('Can not find frmRepeater', mtError, mbOK)	returnendfunction OnClickMenuItemRepeater()	frmRepeater.Show()endfunction DEC_HEX( IN )      return string.format( '%x', IN )end function HEX_DEC( IN )      return tonumber(IN, 16)end local menuItems = getMemoryViewForm().findComponentByName('MainMenu1').Itemslocal count = menuItems.Count - 1for i = 0, count-1 do   local item = menuItems.getItem(i)   if(item.Caption == 'Tools') then      local mi = createMenuItem(popupmenu)      menuItem_setCaption(mi, '*Repeater [Plugin]')      menuItem_onClick(mi, OnClickMenuItemRepeater)      item.add(mi)      break   endendlocal countLine = 1tableBtn = {}frmRepeater.CEEdit1.Text = 'Action1'frmRepeater.CEEdit2.Text = '00454690' --'00000000'frmRepeater.Caption = 'Repeater [CE Lua Plugin, ver 1.0]'function OnClickBtnCaller(sender)    for i,v in ipairs(tableBtn) do	  if(tableBtn[i].btnCall == sender) then		autoAssemble(tableBtn[i].AACallThread)	  end    endendfunction OnClickCreateLine(sender)	if (countLine > 10) then		print('Records > 15')		return	end		local labelName = frmRepeater.CEEdit1.Text	local addressCode = frmRepeater.CEEdit2.Text		if (labelName == '') then		messageDialog('Label is empty', mtError, mbOK)		return	end		if (addressCode == '') then		messageDialog('AddressCode is empty', mtError, mbOK)		return	end	    for i,v in ipairs(tableBtn) do	  if(tableBtn[i].userLabel == labelName) then		print('Name "'..labelName..'" is not unical')		return	  end	  if(tableBtn[i].addressCall == addressCode) then		print('AddressCode "'..addressCode..'" is not unical')		return	  end    end		local btnCall = createButton(frmRepeater)	btnCall.Caption = labelName..' (Do action in the game!)'	btnCall.Top = (countLine - 1) * 50 + 10	btnCall.Width = 300	btnCall.Left = 80 	btnCall.OnClick = OnClickBtnCaller	btnCall.Enabled = false		tableBtn[countLine] = {}	tableBtn[countLine].btnCall = btnCall	tableBtn[countLine].userLabel = labelName	tableBtn[countLine].addressCall = addressCode	tableBtn[countLine].addressCallNumber = HEX_DEC(addressCode)	tableBtn[countLine].StackDump = false	tableBtn[countLine].addressStack = 'StackMemRepeatCall'..countLine	tableBtn[countLine].addressMemThread = 'ThreadMemRepeatCall'..countLine	tableBtn[countLine].AACallThread = ''		debug_setBreakpoint(addressCode, 1, bptExecute)		frmRepeater.CEEdit1.Text = 'Action1'	frmRepeater.CEEdit2.Text = '00000000'	frmRepeater.CEPanel1.Top = countLine * 50		countLine = countLine + 1endfunction CallAction(itemTable)	debug_removeBreakpoint(itemTable.addressCall)		if (getOpenedProcessID() == 0) then	 messageDialog('No target any process', mtError, mbOK)	 return	end		autoAssemble([[	alloc(]]..itemTable.addressStack..[[,4096)registersymbol(]]..itemTable.addressStack..[[)]]..itemTable.addressStack..[[:readmem(]]..DEC_HEX(ESP)..[[, 3000)]])		itemTable.StackDump = true--EFLAGS--32-bit: EAX, EBX, ECX, EDX, EDI, ESP, EBP, ESP, EIP--64-bit: RAX, EBX, RBX, RDX, RDI, RSP, RBP, RSP, RIP, R8, R9, R10, R11, R12, R13, R14, R15 : The value of the register	local lineDissassemble = disassemble(itemTable.addressCall)	extrafield, opcode, bytes, adressReturnHere = splitDisassembledString(lineDissassemble)	local _ebp = DEC_HEX(getAddress(DEC_HEX(EBP)..'-'..DEC_HEX(ESP)..'+'..itemTable.addressStack, false))	local _esp = DEC_HEX(getAddress(itemTable.addressStack))	local scriptAA0 = string.format([[alloc(%s,1024)registersymbol(%s)%s:mov eax,%xmov ebx,%xmov ecx,%xmov edx,%xmov esi,%xmov edi,%xmov esp,%smov ebp,%s%sret]], itemTable.addressMemThread, itemTable.addressMemThread, itemTable.addressMemThread, EAX, EBX, ECX, EDX, ESI, EDI, _esp, _ebp, opcode)	autoAssemble(scriptAA0)	itemTable.AACallThread = [[createthread(]]..itemTable.addressMemThread..[[)]]	itemTable.btnCall.Enabled = trueendfunction debugger_onBreakpoint()    for i,v in ipairs(tableBtn) do	  if(tableBtn[i].addressCallNumber == EIP) then		CallAction(tableBtn[i])		return 1	  end    end	return 0endfrmRepeater.CEButton2.OnClick = OnClickCreateLine
Ссылка на комментарий
Поделиться на другие сайты

  • 4 года спустя...
В 26.01.2015 в 10:38, MasterGH сказал:

Спасибо. Как найду время исправлю описания плагинов и скрины.

Привет

У тебя остался этот плагин для Ultimap?

На установку брекпойнтов на все адреса, и сохранение адресов в лист

Ссылка на комментарий
Поделиться на другие сайты

40 минут назад, Garik66 сказал:

А читать внимательнее когда начнем?

Я не нашел там репу для ультимапа, если она там есть, ткните носом

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, lqn сказал:

Я не нашел там репу для ультимапа, если она там есть, ткните носом

А в самом СЕ разве не ультимап?

Спойлер

image.thumb.png.f64bfc6debc87006c042c3a3a35cd246.png

 

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Garik66 сказал:

А в самом СЕ разве не ультимап?

  Показать контент

image.thumb.png.f64bfc6debc87006c042c3a3a35cd246.png

 

Сам СЕ тут причем?

Я прошу плагин, который описан в первом посте темы ТСом

Ссылка на комментарий
Поделиться на другие сайты

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

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

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