MasterGH Опубликовано 21 января, 2015 Поделиться Опубликовано 21 января, 2015 Название формы: "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. Поставить брейкпоинты на все адреса первой или второй колонки Скрытый текст Пример результата установки бряков на вторую коонку (окно открыть из дизассемблера): --Установка брейкпоинтов 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() Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Если не сложно, хотя бы парой слов, можешь объяснить, что за UltiMap?По названию понятно, что это карта чего-то, но вот чего? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Оно отслеживает ветки кода, которые выполнились или не выполнились за определенный промежуток времени. Как сканер адресов, только для call-ов. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Весьма интересно, как это делается) Неужели, на все найденные функции элементарно ставятся бряки? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 января, 2015 Поделиться Опубликовано 22 января, 2015 Так исходники-то есть - скачай да посмотри. (: Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 января, 2015 Автор Поделиться Опубликовано 22 января, 2015 Если не сложно, хотя бы парой слов, можешь объяснить, что за UltiMap? По названию понятно, что это карта чего-то, но вот чего? Лучше сюды писать, ultimap-тема там Ultimap парой слов можно попробовать объяснить. Если ты взял с земли шесть раз предмет, то можно найти call-ы, которые ровно 6 раз вызывались. Если поставить все бряки на адреса второй колонки, то первый бряк и предположительно нужно исследовать. Это будет первый call, от которого начинается ветвь кода, в которой начинается поднятие оружия. Остальные бряки желательно сразу отключить. Чтобы это сделать разом я напишут еще скрипт. Где-то выше этого call-а есть условие, которое как спусковой крючок запускает поднятие оружия по горячей клавише. Надо либо это условие менять, либо вызывать call-ы потоком игры.... ...В теории можно получить оружие, которого у тебя не было. Пока на практике это не удалось сделать. Ну, времени мало... куча работы. На выходных скорее всего. Оно отслеживает ветки кода, которые выполнились или не выполнились за определенный промежуток времени. Как сканер адресов, только для call-ов. Ну, если образно выразиться. Скорее части ветвей отладочного кода. Трейс лог более полно может показать ветвь кода как раз при установке на "верхний call" Весьма интересно, как это делается) Неужели, на все найденные функции элементарно ставятся бряки? На все, которые находятся в определенной колонке. Проверено. Потом задолбаешся их снимать удерживая Del Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 января, 2015 Автор Поделиться Опубликовано 23 января, 2015 Добавлены пункты:4 - сохранение списка адресов из колонки Ultimap в файл *.address через диалог сохранения5 - установка бряков "на выполнение" из файла-списка*.address Пункт 4 позволит сохранить найденные адреса в файл во время зависания игры. У меня игра частенько виснет, если что-то долго искать. Чтобы результат не пропадал очень пригодится, чтобы не делать повторный поиск.В файле *.address можно удалить или добавить адреса, а затем поставить махом на них бряки "на выполнение". Когда в игре бряки выполняются, а желаемое действие мы еще не делали, то эти бряки не подходят. Их надо удалять, а бряки которые срабатывают во время желаемого действия нужно сохранять. Хотя, если сканировали Ultimap правильно фильтруя не десвующие и действующие адреса, то бряки вручную удалять из файла не надо будет. Кстати это и пример того как сохранять и загружать текст используя диалоги. Может пригодиться, если нужно сохранять логи. Анализировать их например сторонней программой на любимом языке программирования. -----К сожалению не работает функция:debug_getBreakpointList(): Returns a lua table containing all the breakpoint addressesОна должна будет работать в новых версиях CE судя по логам исправлений на офиц. сайте CE. Надо будет сделать кнопку в окне бряков, которая удалит все брейкпоинты. Уже запарило чистить. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 января, 2015 Автор Поделиться Опубликовано 25 января, 2015 Репозиторий Появились продвижения по вызову функций. Я готовлю новый плагин "Repeater", который позволит вызывать если не любые функции, то большинство из них. Если найти адрес в Ultimap, то сделать повтор действия в игре будет очень просто через плагин. При тестах удалось вызывать пока функцию дельфи, которую нажимала кнопка На скрине видно окно плагина и две кнопки. Обе они визуально увеличивают число на 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 Эмм... Поправочка небольшая - правильно пишется Plugin )) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 января, 2015 Автор Поделиться Опубликовано 26 января, 2015 Спасибо. Как найду время исправлю описания плагинов и скрины. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость lqn Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 В 26.01.2015 в 10:38, MasterGH сказал: Спасибо. Как найду время исправлю описания плагинов и скрины. Привет У тебя остался этот плагин для Ultimap? На установку брекпойнтов на все адреса, и сохранение адресов в лист Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 5 минут назад, lqn сказал: У тебя остался этот плагин для Ultimap? А читать внимательнее когда начнем? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 18 минут назад, lqn сказал: Привет Если непонятно из скрина, нажми на Репозиторий. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость lqn Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 40 минут назад, Garik66 сказал: А читать внимательнее когда начнем? Я не нашел там репу для ультимапа, если она там есть, ткните носом Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 14 минут назад, lqn сказал: Я не нашел там репу для ультимапа, если она там есть, ткните носом А в самом СЕ разве не ультимап? Спойлер Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость lqn Опубликовано 12 ноября, 2019 Поделиться Опубликовано 12 ноября, 2019 2 часа назад, Garik66 сказал: А в самом СЕ разве не ультимап? Показать контент Сам СЕ тут причем? Я прошу плагин, который описан в первом посте темы ТСом Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 13 ноября, 2019 Поделиться Опубликовано 13 ноября, 2019 В первом посте темы нет никакого плагина. Есть набор LUA скриптов, который ты можешь запускать через СЕ, и все. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения