Можно в редакторе сделать автозавершение инструкци для CE Lua и даже для CE Autoassembler.
Накидал пример, может быть, кому интересно будет для других языков.
Установка. Поместить файл в директорию на скриншоте
lua.xml

MasterGH
Сообщения
-
Notepad++ и CE Lua. Автозавершение строк -
Задачка по IDA и Python (старое)Пост принадлежит автору partoftheworlD, GamehackLab[RU]. (ref)
Подключение к питону происходит с помощью:
import idc import idautils import idaapi
У меня есть наработки некоторые, возможно что-то пригодится.
import idc import idaapi class Func(object): def __init__(self): self.reg_value = re.compile(r'') self.stack_view = [] self.level = 1 def range_reverse(self, start, stop): for i in FuncItems(stop): if start > i >= stop: yield i def run(self): if self.stack_view: for j in self.stack_view: current_function = idaapi.get_func(j) level = "-" * self.level print("{} Jump into -> 0x{}".format(level, hex(current_function.startEA)[2:].replace("L", "").upper())) for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: print("{} 0x{} -- {}".format(level, hex(j)[2:].replace("L", "").upper(), idc.GetDisasm(j))) self.level += 1 else: print "Please input addresses to stack view buffer" pass if __name__ == '__main__': f = Func() f.stack_view = [0x214FE, 0x20F30, 0x214E0, 0x13F00] f.run()
В выводе получим
\- Jump into -> 0x214E0 \- 0x214E0 -- push ebp \- 0x214E1 -- mov ebp, esp \- 0x214E3 -- lea esp, [esp-10h] \- 0x214E7 -- mov [ebp+var_C], eax \- 0x214EA -- mov [ebp+var_4], edx \- 0x214ED -- mov [ebp+var_8], ecx \- 0x214F0 -- mov eax, [ebp+arg_0] \- 0x214F3 -- test eax, eax \- 0x214F5 -- jnz locret_21589 \- 0x214FB -- mov eax, [ebp+var_8] \- 0x214FE -- cmp word ptr [eax], 1Bh \- 0x21503 -- jnz locret_21589 \- 0x21509 -- push 0 \- 0x2150B -- mov eax, [ebp+var_8] \- 0x2150E -- movzx ecx, word ptr [eax] \- 0x21511 -- mov eax, [ebp+var_4] \- 0x21514 -- mov edx, 0B01Eh \- 0x21519 -- call sub_8E870 \- 0x2151E -- test eax, eax \- 0x21520 -- jnz short locret_21589 \- 0x21522 -- push 0 \- 0x21524 -- mov eax, [ebp+var_4] \- 0x21527 -- mov ecx, 0 \- 0x2152C -- mov edx, 87h ; '‡' \- 0x21531 -- call sub_8E870 \- 0x21536 -- and eax, 4 \- 0x21539 -- jnz short locret_21589 \- 0x2153B -- mov eax, [ebp+var_C] \- 0x2153E -- test dword ptr [eax+160h], 4 \- 0x21548 -- jz short locret_21589 \- 0x2154A -- mov eax, [ebp+var_4] \- 0x2154D -- mov dl, 1 \- 0x2154F -- call sub_13F00 \- 0x21554 -- mov [ebp+var_10], eax \- 0x21557 -- test eax, eax \- 0x21559 -- jz short locret_21589 \- 0x2155B -- mov eax, [ebp+var_10] \- 0x2155E -- cmp dword ptr [eax+378h], 0 \- 0x21565 -- jz short locret_21589 \- 0x21567 -- mov eax, [ebp+var_10] \- 0x2156A -- mov eax, [eax+378h] \- 0x21570 -- mov edx, [ebp+var_10] \- 0x21573 -- mov edx, [edx+378h] \- 0x21579 -- mov edx, [edx] \- 0x2157B -- call dword ptr [edx+2E8h] \- 0x21581 -- mov eax, [ebp+var_8] \- 0x21584 -- mov word ptr [eax], 0 \- 0x21589 -- leave \- 0x2158A -- retn 4 \-- Jump into -> 0x20F30 \-- 0x20F30 -- push ebp \-- 0x20F31 -- mov ebp, esp \-- 0x20F33 -- lea esp, [esp-10h] \-- 0x20F37 -- mov [ebp+var_C], eax \-- 0x20F3A -- mov [ebp+var_4], edx \-- 0x20F3D -- mov [ebp+var_8], ecx \-- 0x20F40 -- mov eax, [ebp+var_8] \-- 0x20F43 -- cmp word ptr [eax], 0 \-- 0x20F48 -- jz locret_20FCF \-- 0x20F4E -- mov edx, [ebp+var_4] \-- 0x20F51 -- mov eax, 5C29B4h \-- 0x20F56 -- call sub_C910 \-- 0x20F5B -- test al, al \-- 0x20F5D -- jz short loc_20FC3 \-- 0x20F5F -- mov eax, [ebp+var_4] \-- 0x20F62 -- mov [ebp+var_10], eax \-- 0x20F65 -- mov eax, [ebp+var_C] \-- 0x20F68 -- cmp word ptr [eax+150h], 0 \-- 0x20F71 -- jz short locret_20FCF \-- 0x20F73 -- mov eax, [ebp+var_C] \-- 0x20F76 -- mov edx, [ebp+var_8] \-- 0x20F79 -- mov ax, [eax+150h] \-- 0x20F80 -- cmp ax, [edx] \-- 0x20F83 -- jnz short locret_20FCF \-- 0x20F85 -- mov eax, [ebp+var_C] \-- 0x20F88 -- mov eax, [eax+154h] \-- 0x20F8E -- cmp eax, [ebp+arg_0] \-- 0x20F91 -- jnz short locret_20FCF \-- 0x20F93 -- mov eax, [ebp+var_C] \-- 0x20F96 -- mov eax, [eax+14Ch] \-- 0x20F9C -- cmp eax, [ebp+var_10] \-- 0x20F9F -- jnz short locret_20FCF \-- 0x20FA1 -- push [ebp+arg_0] \-- 0x20FA4 -- mov ecx, [ebp+var_8] \-- 0x20FA7 -- mov edx, [ebp+var_10] \-- 0x20FAA -- mov eax, [ebp+var_C] \-- 0x20FAD -- call sub_21590 \-- 0x20FB2 -- push [ebp+arg_0] \-- 0x20FB5 -- mov ecx, [ebp+var_8] \-- 0x20FB8 -- mov edx, [ebp+var_10] \-- 0x20FBB -- mov eax, [ebp+var_C] \-- 0x20FBE -- call sub_214E0 \-- 0x20FC3 -- mov eax, [ebp+var_C] \-- 0x20FC6 -- mov word ptr [eax+150h], 0 \-- 0x20FCF -- leave \-- 0x20FD0 -- retn 4 \--- Jump into -> 0x214E0 \--- 0x214E0 -- push ebp \--- 0x214E1 -- mov ebp, esp \--- 0x214E3 -- lea esp, [esp-10h] \--- 0x214E7 -- mov [ebp+var_C], eax \--- 0x214EA -- mov [ebp+var_4], edx \--- 0x214ED -- mov [ebp+var_8], ecx \--- 0x214F0 -- mov eax, [ebp+arg_0] \--- 0x214F3 -- test eax, eax \--- 0x214F5 -- jnz locret_21589 \--- 0x214FB -- mov eax, [ebp+var_8] \--- 0x214FE -- cmp word ptr [eax], 1Bh \--- 0x21503 -- jnz locret_21589 \--- 0x21509 -- push 0 \--- 0x2150B -- mov eax, [ebp+var_8] \--- 0x2150E -- movzx ecx, word ptr [eax] \--- 0x21511 -- mov eax, [ebp+var_4] \--- 0x21514 -- mov edx, 0B01Eh \--- 0x21519 -- call sub_8E870 \--- 0x2151E -- test eax, eax \--- 0x21520 -- jnz short locret_21589 \--- 0x21522 -- push 0 \--- 0x21524 -- mov eax, [ebp+var_4] \--- 0x21527 -- mov ecx, 0 \--- 0x2152C -- mov edx, 87h ; '‡' \--- 0x21531 -- call sub_8E870 \--- 0x21536 -- and eax, 4 \--- 0x21539 -- jnz short locret_21589 \--- 0x2153B -- mov eax, [ebp+var_C] \--- 0x2153E -- test dword ptr [eax+160h], 4 \--- 0x21548 -- jz short locret_21589 \--- 0x2154A -- mov eax, [ebp+var_4] \--- 0x2154D -- mov dl, 1 \--- 0x2154F -- call sub_13F00 \--- 0x21554 -- mov [ebp+var_10], eax \--- 0x21557 -- test eax, eax \--- 0x21559 -- jz short locret_21589 \--- 0x2155B -- mov eax, [ebp+var_10] \--- 0x2155E -- cmp dword ptr [eax+378h], 0 \--- 0x21565 -- jz short locret_21589 \--- 0x21567 -- mov eax, [ebp+var_10] \--- 0x2156A -- mov eax, [eax+378h] \--- 0x21570 -- mov edx, [ebp+var_10] \--- 0x21573 -- mov edx, [edx+378h] \--- 0x21579 -- mov edx, [edx] \--- 0x2157B -- call dword ptr [edx+2E8h] \--- 0x21581 -- mov eax, [ebp+var_8] \--- 0x21584 -- mov word ptr [eax], 0 \--- 0x21589 -- leave \--- 0x2158A -- retn 4 \---- Jump into -> 0x13F00 \---- 0x13F00 -- push ebp \---- 0x13F01 -- mov ebp, esp \---- 0x13F03 -- lea esp, [esp-0Ch] \---- 0x13F07 -- mov [ebp+var_4], eax \---- 0x13F0A -- mov [ebp+var_8], dl \---- 0x13F0D -- jmp short loc_13F33 \---- 0x13F10 -- cmp [ebp+var_8], 0 \---- 0x13F14 -- jnz short loc_13F27 \---- 0x13F16 -- mov edx, [ebp+var_4] \---- 0x13F19 -- mov eax, 59ECF0h \---- 0x13F1E -- call sub_C910 \---- 0x13F23 -- test al, al \---- 0x13F25 -- jnz short loc_13F45 \---- 0x13F27 -- mov eax, [ebp+var_4] \---- 0x13F2A -- mov eax, [eax+1F8h] \---- 0x13F30 -- mov [ebp+var_4], eax \---- 0x13F33 -- cmp [ebp+var_4], 0 \---- 0x13F37 -- jz short loc_13F45 \---- 0x13F39 -- mov eax, [ebp+var_4] \---- 0x13F3C -- cmp dword ptr [eax+1F8h], 0 \---- 0x13F43 -- jnz short loc_13F10 \---- 0x13F45 -- mov edx, [ebp+var_4] \---- 0x13F48 -- mov eax, 59ECF0h \---- 0x13F4D -- call sub_C910 \---- 0x13F52 -- test al, al \---- 0x13F54 -- jz short loc_13F5E \---- 0x13F56 -- mov eax, [ebp+var_4] \---- 0x13F59 -- mov [ebp+var_C], eax \---- 0x13F5C -- jmp short loc_13F65 \---- 0x13F5E -- mov [ebp+var_C], 0 \---- 0x13F65 -- mov eax, [ebp+var_C] \---- 0x13F68 -- leave \---- 0x13F69 -- retn
Надо будет поправить пару строк, чтобы выводилась не функция целиком, а как при трассировке:
for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]:
-
Задачка по IDA и Python (старое)Вдохновение появилось после просмотра видео по Ultimap
Когда в Ultimap появляются Nx адресов с одним счетчиком, то хочется увидеть эти связи на графиках IDA. Появилась идея загуглить как в IDA через IDC скрипт отрисовать ветвь кода или ветви кода, на которых эти самые адреса связаны между собой, а все вложенные другие скрывать. Пока из подсказок я нашел это и это
Допустим для тренировки даны два адреса из одной ветви кода (это я точно знаю, т.к. получен не из ultimap, а из tracelog)
Адрес1 - Tutorial-i386.exe+2578F - 29 83 AC040000 - sub [ebx+000004AC],eax" или адрес 0x00402B77
Адрес2 - Tutorial-i386.exe+16DBED - 89 45 FC - mov [ebp-04],eax или адрес 0x0056DBEDИ вот думаю, как скрипт ниже переделать, чтобы сначала вывести текстовый маршрут, а потом и хотя бы одну ветвь кода. Т.е. поднимаясь вверх по иерархии вызовов нужно остановиться до Адреса2.
#include <idc.idc> static main() { auto ea, func, ref; // получаем текущий адрес курсора ea = 0x00402B77; // в цикле от начала (SegStart) до конца (SegEND) текущего сегмента for (func = SegStart(ea); func != BADADDR && func < SegEnd(ea); func = NextFunction(func)) { // если текущий адрес является адресом функции if (GetFunctionFlags(func) != -1) { Message("Function %s at 0x%x\n", GetFunctionName(func), func); // находим все ссылки на данную функцию и выводим for (ref = RfirstB(func); ref != BADADDR; ref = RnextB(func, ref)) { Message(" called from %s(0x%x)\n", GetFunctionName(ref), ref); } } } }
Пока просто вывод от стартовой функции без условий
Как будет время попробую доделать...
p.s. Ну ничего так idc скрипты. Много всего, но смысл тот же, что и в CE Lua у некоторых функций. Еще не разобрался как Python подключить к IDA, пока на idc скриптах.
Будет интересно еще посмотреть эту же задачу на Hydra и Radare, ну и в CE (в новой версии появилось окно диаграмм)
-
Unity API (игровой движок)API
-
Panda3D API (игровой движок) -
Frostbite API (игровой движок) -
CryEngine API (игрвой движок)https://docs.cryengine.com/display/CEPROG/CRYENGINE+API+Reference
Изучив API, можно управлять иерархией сущностей, сценами, физикой и т.п. в играх созданных на этом движке.
Игровой бинарный код будет состоять из функций игрового движка и функций разработчиков игры. Можно управлять сущностями на основе API движка или же функциями разработчиков.
-
UnrealEngine API (игровой движок)UnrealEngine - популярный игровой движок с открытым API.
Открытое API должно позволить управлять иерархией сущностей (акторы). Т.е. создать сущности, удалять, менять положение в иерархии. Управлять сценами с этими сущностями, физикой, Meshes, эффектами, звуками...
Единственное нужно разобраться в этом API, собрать dll модуль на языке программирования и загрузить его в игру... ну, и возможно, управлять этим модулем извне.
-
Windows APIAPI Windows - это пользовательские функции для работы с процессами и памятью. Все программы, приложения, сервисы, в том числе и программа CE используют эти функции и даже игры. Функции что-то делают, что-то вызывают, какие-то результаты возвращают. Смотрим справки
Win32.chm - справочник
Другие ресурсы:
Софт для работы с API:
Книги:
Книга "[RU] Джефри Рихтер Windows для профессионалов. 4 издание.pdf" -
ASM APIОпкоды из Intel-ловской документации
Instruction_Set_Reference.pdf
64-ia-32-architectures-software-developer-vol-2a-manual.pdf
64-ia-32-architectures-software-developer-vol-2b-manual.pdf -
CE Auto Assembler APIAuto Assembler
(описание команд Autoassebler c примерами).
Там же вставки C-языка
{$CCODE playerbase=RCX newhealth=RBX} int isplayer=*(*int)(playerbase+0xb8); if (isplayer) newhealth=100000; else newhealth=0; {$ASM}
Руководство по C языку (https://www.geeksforgeeks.org/c-programming-language/)
Там же вставки Lua языка
{$LUACODE playerbase=RCX newhealth=RBX} if readInteger(playerbase+0xb8)==1 then newhealth=100000 else newhealth=0 end {$ASM}
Руководство по Lua (https://www.lua.org/manual/5.4/)
Lua классы в CE (https://wiki.cheatengine.org/index.php?title=Cheat_Engine:Lua) -
CE Lua APICE 7.5.0.7431
Wiki:
(содержит более полное описание классов с примерами)
-
Рубрика "Lua код сегодня" №6 (проверка по md5)- Получить md5 открытого процесса и записать его в
MD5_CHEKING
вручную
\-- Функция для ручного вывода md5 ранее подключенного процесcа. Для установки MD5_CHEKING PrintMd5CurrentProcess()
- Пример проверки md5
function onOpenProcess(processid) reinitializeSymbolhandler() local md5Process = GetMd5Process(processid) PrintMd5Process(process, md5Process) local isSupportedVersion = CheckingMd5CurrentProcess(md5Process) local lineResult = isSupportedVersion and 'Is supported version.' or 'Is not supported version.' if not isSupportedVersion then speakEnglish(lineResult, false) messageDialog('Error', lineResult, mtError, mbClose) end end
ce_md5.lua
md5 - это алгоритм некоторой суммы байтов exe-шника. Позволит точно идентифицировать exe-шник, для которого будет сделана .CT таблица с указателями или сигнатурами.
В случае несоответствия будет показан диалог сообщения и звуковое оповещение проговаривания текста ошибки.Будет необходимо проверять md5, чтобы смещения у структур точно не поменялись.
- Получить md5 открытого процесса и записать его в
-
С чего начатьВозникают вопросы "с чего начать?", "в каком направлении следовать?", "каких целей и результатов добиться?". Каждый выбирает, что ему ближе. Как я вижу есть несколько направлений:
Цель - ознакомление с gamehacking, чтобы понять интересно это или нет и сразу вторая цель - определить способ мотивировать себя в изучении программирования. Ведь gamehacking - это самый интересный способ начать программировать от ручных операций до автоматизации. Каждый раз можно вспоминать эти цели, чтобы понять добились ли мы поставленных целей и нужно ли начать заново с новой игрой или начать заново чтобы улучшить предыдущий результат, например, через новые приемы или создавая новые типы читов. Вновь и вновь можно что-то новое и интересное реализовать.
Я разделил путь на два пункта: ознакомление и продолжение.
- Ознакомление можно начать с поиска и заморозки адресов игровых значений в CE и создание .CT таблиц, чтобы ими пользоваться. Затем узнать, что в большинстве случаев требуются правильные указатели в CE, чтобы не искать адреса при запуске игры заново. Для этого требуется разобраться, как искать указатели. Если нет игры под рукой можно взять программу тренировки, которая находится рядом с exe-шником CE. Там на английском написано, что и как требуется для поиска указателей. Если что не понятно, то можно найти видео о том, как проходить эти туториалы.
В принципе для ознакомления с gamehacking заморозки значений по указателям и создания .CT таблиц в CE будет достаточно. Стоит не забывать указывать версию игры для, которой .CT таблица работает.
- Все, что идет за рамками ознакомления - это путь творческий. Здесь мы можем штамповать .CT таблицы с огромным количеством чит-опций, генерировать трейнеры на CE. Или отказаться от CE и программировать на языках программирования. Где конкретно больше пользы или что будет более вдохновлять можно определить в процессе. Программирование в принципе может быть довольно сложным как с CE (aa-, lua-, c- скрипты), так и без CE - любой язык программирования. Пользование CE может быть источником вдохновения, а использование языка программирования будет пользой для обучения программированию. Это безусловно будет помощью и мотивацией в учебе и даже в выборе специальности.
Рано или поздно будет складываться общая картина. Вероятно, постепенно придем к тому, что сможем понимать и менять любой игровой функционал от мелких изменений до очень сложных модов и патчей.
Что же мы хотим? Получить мотивацию, опыт? Я бы предложил получать и то и другое. В качестве опыта - выбирать направление и инструментарий самому. Например, мне было бы интересно работать с отладкой, графами, структурами, CT-таблицами, базами данных, встроенной консолью для команд, а также решением задач с нейронными сетями с PyTorch ( классификации, предсказания, выбора лучших решений, обучения и прочего). Фактически игровой процесс - набор новых правил и целей. Единственное не потерять кучу времени впустую, всегда нужно искать пользу. Хотя бы в мотивации, изучении технологий, которые можно применить с пользой.
-
Правила форумаПравила форума для пользователей
Предлагаю ознакомиться с существующими правилами форума. Правила могут меняться (в этой же теме).
Вы соглашаетесь не публиковать оскорбительные, непристойные, вульгарные, клеветнические, ненавистнические, угрожающие или любые другие материалы, которые могут нарушать какие-либо применимые законы. Это может привести к тому, что вы будете заблокированы (и ваш поставщик услуг будет проинформирован). IP-адреса всех сообщений записываются для обеспечения соблюдения этих условий.
Вы соглашаетесь с тем, что администратор и модераторы этого форума имеют право удалять, редактировать, перемещать или закрывать любую тему в любое время по своему усмотрению. Как пользователь, вы соглашаетесь с тем, что любая информация, которую вы ввели выше, будет храниться в базе данных и будет доступна поисковым службам в Интернете в открытом доступе. Хотя на форуме возможны скрытые темы для определенных групп пользователей.
Система форума использует файлы cookie для хранения информации на вашем локальном компьютере. Файлы cookie служат для улучшения просмотра. Адрес электронной почты скрыт, используется для подтверждения ваших регистрационных данных и пароля (и для отправки новых паролей, если вы забыли свой текущий), а также для новостной рассылки. На форуме работает система Google аналитики. Аналитика используется для улучшения индексации и качества предоставляемой информации, а именно создания лучших тегов и для установки приоритетов наиболее интересным темам.
Удаление учетной записи не приведет к автоматическому удалению ваших сообщений, а только вашего доступа к ним.Нажимая «Зарегистрироваться» вы соглашаетесь соблюдать эти условия.
Рекомендуется :
- большие файлы публиковать в виде ссылок (более 10 Мб) и хранить у себя в облаке (яндекс диск, google диск и т.п.);
- хранить копию файлов у себя на всякий случай, потому что он может быть удален по разным причинам. Также это касается статей и постов, которые имеют особую ценность;
- не обязательно, но рекомендуется публиковать ссылки на репозитории с исходниками;
- рекомендуется публиковать обучающие материалы и оказывать помощь в вопросах.
Todo: разместить в пользовательском соглашении
-
Заполнение разделов старыми постамиПо плану перенести свои старые плагины CE с ссылками на репозитории. В том числе три преспектинвых плагина по большому брейкпоинту, дизассемблированию, и трейслогу с маркерами.
Много планов по развитию форума. По различным фишкам и приемам. -
Ваши группы пользователейПопробуйте сами себя добавить в группы.
Можно написать здесь для создания новой группы -
Доступны смайлики
-
CE Lua ColorPicker (скрытый компонент)Можно сравнить два проекта lazarus новый и старый через программу контроля версий. Их много. Затем изменения перенести в новые исходники по тому же принципу
-
Обзор игры STELLARISТы можешь через CE
- ставить брейкпоинт. Читать регистр. Писать в него. Отпускать отладку. Память не будет меняться/палится. Но можно,скорее в его,запалить точеи останова.
- Перезаписывать память кода и данных через драйвер ce разово или по таймеру. В этом случае память может палиться. Тогда пробовать через CE сделать хуки на чтение памяти и возвращать оригинальные байты.
- погуглить про скрытие процессов, секций памяти, модулей, хуки на функции (чтение памяти, получение списка процессов...). Хук позволит функцию перенаправить на свою, изменить результат и вернуть его.
- посмотреть про обработку исключений в исхолниках на примере stealthmode плагина в ce