MasterGH Опубликовано 3 мая, 2012 Поделиться Опубликовано 3 мая, 2012 Внимание! Новые версии плагина искать в конце темы Последняя версия плагина - здесь Видео инструкция для новичков - здесь Версия плагина 1.0 Plagin_MenuDisassembler_GenericAA.rar 1. Создаёт АА-код аналогично шаблону Дарк Байта 2. Без комментариев 3. Без часто лишней метки Exit 4. Высвобождение памяти помещено в самый низ. 5. Можно выделить строку в дизассемблере и нажать на горячие клавиши "CTRL+SHIFT+A". Тут же увидите новую запись в главной таблице CE. 6. Для тех кто не хочет запоминать горячие клавиши функцию создания АА я разместил в контекстном меню с названием "* Create AA" К сожалению редактор АА-скрипта автоматически открыть через Lua нельзя. Но я написал об этой проблеме Дакр Байту, возможно он добавит эту поддержку. Как пользоваться скриптом Скрытый текст Скрипт кладём в папку Autorun находящуюся в директории CE. Я тестировал его на CE 6.2 Beta 6.Если у вас нет этой версии, то ссылку на неё можно поискать на нашем форуме или дождаться официального реализа. Далее. Ищем инструкцию которая нам нужна. Выделяем её в дизассемблере и нажимаем горячие клавиши "CTRL+SHIFT+A". Тут же добавится новая запись в главную таблицу. Переименовываем эту запись. Открываем скрипт и в пустую область пишем свою инъекцию кода. Далее всё как обычно. Как пользоваться шаблоном. Внимание! Скрытый текст У вас есть супер возможность поменять шаблон АА-скрипта под свои предпочтения. Давайте рассмотрим этот шаблон открыв файл *.lua текстовым редактором. [ENABLE] alloc(newMem, 2048) label(returnHere) newMem: ->>cheatCode ->>originalCode jmp returnHere ->>address: jmp newMem ->>nops returnHere: [DISABLE] ->>address: ->>originalCode dealloc(newMem) ]] AACodeTemplate = [[ 1) Мы можем поменять отступы задавая новые строки 2) Можно поменять отступы от левого края 3) Можно добавить свои метки и регистрацию своих символов и снятие этой регистрации 4) Можно изменить текущие надписи меток и символов 5) Можно добавить свои копирайты или иную форму авторства 6) Можно добавить информацию о версии CE, на которой был написан текущий скрипт (cм. документацию по CE Lua) 7) Можно добавить дату создания скрипта (см. руководства по Lua) Если вы нашли ошибку в скрипте, то вы можете сообщить о ней здесь. Тоже самое касается пожеланий по новым возможностям или исправлениям. Ссылка на комментарий Поделиться на другие сайты Поделиться
JIeXA Опубликовано 4 мая, 2012 Поделиться Опубликовано 4 мая, 2012 А что за кнопка Get signature Ссылка на комментарий Поделиться на другие сайты Поделиться
SER[G]ANT Опубликовано 4 мая, 2012 Поделиться Опубликовано 4 мая, 2012 Получить сигнатуру. Т.е. байт-код "FF 05 A4 B5 45 00..." Ссылка на комментарий Поделиться на другие сайты Поделиться
JIeXA Опубликовано 4 мая, 2012 Поделиться Опубликовано 4 мая, 2012 сделал бы кто плагин чтоб формировался АА скрипт с проверочными байтами Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 4 мая, 2012 Автор Поделиться Опубликовано 4 мая, 2012 >> сделал бы кто плагин чтоб формировался АА скрипт с проверочными байтамиЭта поддержка скоро появится. Возможно сегодня.Чтобы в скрипте вы видели базовый адрес как символьное имя например"game.exe + смещение:"В CE зайдите в дизассемблер и нажмите на Ctrl+M или через меню View->Show Module Addresses.После этого в ваших скриптах вы смоежете понять в dll-ке ваш код или нет.Настоятельно рекоммендую поставить эту опцию и больше её не снимать. Только в крайних случаях, когда вам нужно знать только адрес. Ссылка на комментарий Поделиться на другие сайты Поделиться
ARM4ND0 Опубликовано 4 мая, 2012 Поделиться Опубликовано 4 мая, 2012 Show Module Addresses отличная вещь. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 4 мая, 2012 Автор Поделиться Опубликовано 4 мая, 2012 Версия плагина 1.1Plagin_MenuDisassembler_GenericAA.rarДобавлены:1) Добавлена функция * Get signature info2) Добавлена функция * Create AA-aobsan (без пропускающих байтов 'xx', сработает только, если выбранная сигнатура уникальна)См. скриншот.3) В шаблон сканирования сигнатуры добавлены маркеры->>comment - комментарии вида 00454658 = Test.exe+54658. Не забудьте включить модульную адресацию в дизассемблере (об этом я уже писал). Иначе получите только00454658 = 00454658->>NscriptCount - маркер текущего номера созданного скрипта. Это инкрементирующее значение при добавлении нового сгенерированного скрипта. Для сканирования сигнатур, чтобы оно не повторялось пришлось ввести этот маркер. Кажется Дарк Байт ввёл новые ограничения в АА-скрипты, поэтому без регистрации уникальный меток с автоинкрементным символьным присоединяемым значением не обойтись.Сам дополнительный шаблон:[ENABLE]AOBSCAN(signatureAddress, ->>arrayOfbyte)alloc(newMem, 2048)label(returnHere)label(address->>NscriptCount)registersymbol(address->>NscriptCount)newMem:->>cheatCode->>originalCodejmp returnHeresignatureAddress: //->>commentaddress->>NscriptCount:jmp newMem->>nopsreturnHere:[DISABLE]address->>NscriptCount:->>originalCodedealloc(newMem)unregistersymbol(address->>NscriptCount)]]AOBSCANCodeTemplate = [[Как пользоваться?1. Находим нужную инструкцию в дизассемблере;2. Выделяем эту инструкцию и несколько нижних, и по нижней правым кликом вызываем контестное меню и далее Create AA-aobsan3. Если скрипт добавился, значит вы выделили инструкции с уникальной сигнатурой.4. Если скрипт не добавился или мы хотим посмотреть уникальна или нет сигнатура, то вызываем "Get signature info". Тем самым мы получаем информацию, о том уникальна ли сигнатура или нет, сколько раз она повторяется. Если не уникальная, то выделяем ещё инструкцию ниже или несколько инструкций. Опять узнаём, уникальна она или нет вызывая * Get signature infoДополнительная информацияСигнатура кода для этой версии плагина берётся без пропускающих байтов "xx". В другой версии плагина будет и новая функция с пропускающими байтами. Но это уже будет не для AA, а для Lua+AA для более опытных пользователей.Хочу так же напомнить и специально обратить внимание. Что сигнатура кода не даст Вам 100% результат работы читов на патчах.Сигнатуру нужно уметь составлять. Как минимум стараться чтобы в коде инъекции и оригинальном коде не было статических адресов вида mov eax,[адрес]Как я уже писал в новой версии плагина я включу пропускающие байты в сигнатуру и технологию автогенерации инъекции кода по дизассемблерному на адресе инструкции, которую мы не знаем в данный момент, но знаем адрес этой инструкции по сигнатуре с пропускающими байтами.Некоторый код уже готов, осталось его вытащить из двухтысячного луа кода в этот плагин. Пока я не хочу выделять на это время. На работе очень сложная задача по импорту fbx файлов - выжимает из меня все силы. Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 8 октября, 2012 Поделиться Опубликовано 8 октября, 2012 небольшую поправку нужно написать, чтоб при ошибке не создавался скрипт:function OnItemMenuGenerateAAWithAOBSCANClick(sender)local script = GetScriptAOBSCAN()if (script ~= nil) then local newTableEntry = AddAARecord(script, 'New AOBSCAN-Script ') OpenAAEditor(newTableEntry)endendЯ хочу дополнить шаблоном для быстрого нопа выделенных функций:NopCodeTemplate = [[[ENABLE]->>address:->>nops[DISABLE]->>address:->>originalCode//->>comment]]function GetNops(strAddress, length) -- return originalCodeString, originalBytesString, nopsStringlocal sumBytes = 0local originalCodeString = ""local originalBytesString = ""local address = strAddresslocal countBytes = 0repeat countBytes = getInstructionSize(address) lineDissassemble = disassemble(address) extrafield, opcode, bytes, address = splitDisassembledString(lineDissassemble) sumBytes = sumBytes + countBytes address = address..'+'..countBytes originalCodeString = originalCodeString..opcode.."\r\n" originalBytesString = originalBytesString..bytesuntil (sumBytes >= length)---------------nops-----------------local nopsString = "db "local nopsCount = lengthif (nopsCount>0) then for i = 1, nopsCount do if i == nopsCount then nopsString = nopsString.."90" else nopsString = nopsString.."90 " end endendreturn originalCodeString, originalBytesString, nopsStringendfunction GetScriptAANop()local script = NopCodeTemplatelocal originalCode = ''local originalBytes = ''local extra = ''local nops = ''local address = math.min(dv_address1, dv_address2)local stop = math.max(dv_address1, dv_address2)local length = stop + getInstructionSize(stop) - addresslocal strSignature = GetFullSignature(address, length)originalCode, originalBytes, nops = GetNops(address, length)local baseAddress = getNameFromAddress(address)script = string.gsub(script,"->>address", baseAddress)script = string.gsub(script,"->>originalCode", originalCode)script = string.gsub(script,"->>comment", originalBytes)script = string.gsub(script,"->>nops", nops)script = string.gsub(script,"->>NscriptCount", scriptCount)return scriptendfunction OnItemMenuGenerateAANopClick(sender) local script = GetScriptAANop() local newTableEntry = AddAARecord(script,'New Script') OpenAAEditor(newTableEntry)endAddItemMenuInMemoryViewForm('* Create AA NOP', 'Ctrl+Shift+N', OnItemMenuGenerateAANopClick, OnSelectionTracker) 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 8 октября, 2012 Автор Поделиться Опубликовано 8 октября, 2012 Спасибо, товарищу SnedS91.Версия плагина 1.21) Проверка результата GetScriptAOBSCAN (автр. SnedS91)2) Добавлен Шаблон для nop-инъекции (автр. SnedS91)Plagin_MenuDisassembler_GenericAA.rarЖелающие могут протестировать. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 8 октября, 2012 Поделиться Опубликовано 8 октября, 2012 Все работает. Спасибо ребят. +100. Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Баг по создание АА кода с помощью плагина.Тока встречается этот баг когда касается командой CMP (Сравнение)[ENABLE]alloc(newMem, 2048)label(returnHere)newMem:cmp ecx,FCjne 007BE3A0jmp returnHerecheatengine-i386.exe+3BE394:jmp newMemreturnHere:[DISABLE]cheatengine-i386.exe+3BE394:cmp ecx,FCjne 007BE3A0dealloc(newMem)А эта обычным путем создание АА скрипта.[ENABLE]alloc(newmem,2048)label(returnhere)newmem:cmp ecx,FCjne cheatengine-i386.exe+3BE3A0"cheatengine-i386.exe"+3BE394:jmp newmemreturnhere:[DISABLE]"cheatengine-i386.exe"+3BE394:cmp ecx,FCjne cheatengine-i386.exe+3BE3A0dealloc(newmem)Разница видна? через плагин пишется орг. код cmp ecx,FCjne 007BE3A0. Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 14 октября, 2012 Поделиться Опубликовано 14 октября, 2012 Баг по создание АА кода с помощью плагина.Тока встречается этот баг когда касается командой CMP (Сравнение)[ENABLE]alloc(newMem, 2048)label(returnHere)newMem:cmp ecx,FCjne 007BE3A0jmp returnHerecheatengine-i386.exe+3BE394:jmp newMemreturnHere:[DISABLE]cheatengine-i386.exe+3BE394:cmp ecx,FCjne 007BE3A0dealloc(newMem)А эта обычным путем создание АА скрипта.[ENABLE]alloc(newmem,2048)label(returnhere)newmem:cmp ecx,FCjne cheatengine-i386.exe+3BE3A0"cheatengine-i386.exe"+3BE394:jmp newmemreturnhere:[DISABLE]"cheatengine-i386.exe"+3BE394:cmp ecx,FCjne cheatengine-i386.exe+3BE3A0dealloc(newmem)Разница видна? через плагин пишется орг. код cmp ecx,FCjne 007BE3A0.Да я тоже заметил такую ошибку, нужно в плагине поменять функцию GetInfoInjection на эту:function GetInfoInjection(strAddress) -- return addressReturnHere, originalCodeString, nopsStringlocal sumBytes = 0local originalCodeString = ""local addressReturnHere = strAddresslocal countBytes = 0repeat countBytes = getInstructionSize(addressReturnHere) lineDissassemble = disassemble(addressReturnHere) extrafield, opcode, bytes, addressReturnHere = splitDisassembledString(lineDissassemble) sumBytes = sumBytes + countBytes --addressReturnHere = string.format("%x", ("0x"..addressReturnHere) + countBytes) addressReturnHere = addressReturnHere..'+'..countBytes if sumBytes >= 5 then originalCodeString = originalCodeString..opcode else originalCodeString = originalCodeString..opcode.."\r\n" enduntil (sumBytes >= 5)local nopsString = ""local nopsCount = sumBytes - 5if (nopsCount>0) then for i = 1, nopsCount do if i == nopsCount then nopsString = nopsString.."nop" else nopsString = nopsString.."nop\r\n" end endendreturn addressReturnHere, originalCodeString, nopsStringend 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 15 октября, 2012 Автор Поделиться Опубликовано 15 октября, 2012 Версия 1.31) fix генерация АА-кода (авт. SnedS91)Plagin_MenuDisassembler_GenericAA.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 15 октября, 2012 Поделиться Опубликовано 15 октября, 2012 Решил дополнить AA-aobscan.Теперь, чтобы создать скрипт не нужно выделять код и искать уникальные байты, функция сделает все за нас, достаточно нажать по первой инструкции ПКМ (можно и выделить часть инструкций) и выбрать Create AA-aobscan Вот, собственно, и сама функция:function GetScriptAOBSCAN()local strSignature = ''local result = ''local count = -1local address = math.min(dv_address1, dv_address2)local stop = math.max(dv_address1, dv_address2)local length = stop + getInstructionSize(stop) - addresslocal countBytes = 0repeat length = length + countBytes stop = stop..'+'..countBytes countBytes = getInstructionSize(stop) lineDissassemble = disassemble(stop) extrafield, opcode, bytes, stop = splitDisassembledString(lineDissassemble) if length > 5 then strSignature = GetFullSignature(address, length) result = AOBScan(strSignature, "+X-C-W") else result = nil end if result ~= nil then count = strings_getCount(result) object_destroy(result) enduntil (count == 1)local strAddress = getNameFromAddress(address)local script = AOBSCANCodeTemplatelocal cheatCode = ""local originalCode = ''local nops = ''local addressReturnHere = 0addressReturnHere, originalCode, nops = GetInfoInjection(strAddress)script = string.gsub(script,"->>arrayOfbyte", strSignature)script = string.gsub(script,"->>cheatCode", cheatCode)script = string.gsub(script,"->>originalCode", originalCode)local comment = string.format('%08x = %s', address, getNameFromAddress(strAddress))script = string.gsub(script,"->>comment", comment) --// 00ADFCFD = GameDLL_x86.dll+50FCFDif nops=='' then script = string.gsub(script,"->>nops\n", nops) --\r\nelse script = string.gsub(script,"->>nops", nops)endscript = string.gsub(script,"->>NscriptCount", scriptCount)return scriptendи еще нужно исправить Create AA-aobsan на Create AA-aobscan =) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 16 октября, 2012 Поделиться Опубликовано 16 октября, 2012 Версия 1.41) Генерация AA-aobscan. (авт. SnedS91)Скачать:Plagin_MenuDisassembler_GenericAA.rarРешил дополнить AA-aobscan.Теперь, чтобы создать скрипт не нужно выделять код и искать уникальные байты, функция сделает все за нас, достаточно нажать по первой инструкции ПКМ (можно и выделить часть инструкций) и выбрать Create AA-aobscan Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 21 октября, 2012 Поделиться Опубликовано 21 октября, 2012 Версия 1.51) Добавлена функция GetAddressFromOpcode, которая анализирует все опкоды.Если находит в опкоде адрес, то меняет его на стандартное представление: База+смещение;2) Привел код в порядок, убрал ненужные переменные, немного изменил названия меню.Скачать плагин: Plagin_MenuDisassembler_GenericAA.7zP.S.: Теперь это вполне полностью работоспособный плагин! 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 октября, 2012 Автор Поделиться Опубликовано 22 октября, 2012 Теперь можно брать планку гораздо выше - автоматическое создание АА-кода под newMem. У меня пока катастрофически не хватает сил довести это (очень много работы)Анализирование инструкции и предложение пользователю какие параметры можно передать в функциюfunction CreateAdvancedCheat(cheatName, address, patternAsmCode, patternInjectAsmCode, stateOriginalCode)Пример передачи параметров в некотором законченом скрипте *.CETRAINERПолный код .CETRAINER:<?xml version="1.0" encoding="utf-8"?><CheatTable CheatEngineTableVersion="13"> <LuaScript>stringlist_add(getAutoAttachList(), 'test.exe') function onOpenProcess(processid) --... CreateAdvancedCheat("cheatName", "0045464a", "inc [x]", "mov [x], #100", false) --.... end control_setCaption(TrainerForm, 'Trainer (game is not found)') control_setCaption(CEMemoComments, [ [ CELua-Trainer +?, v?.? for game "????" [Eng] Authors: MasterGH Cheats: 1. Infinity value Run game and press hot-keys--------------------------Add your info with any language (edit *.CETRAINER in UTF-8 encoding with Notpad++)] ]) ShowAndUpdateTrainerForm()</LuaScript></CheatTable>]]--Видно что одна строка CreateAdvancedCheat("cheatName", "0045464a", "inc [x]", "mov [x], #100", false) что-то делает. А именно она в run time создаёт АА-скрипты по инструкции на адресе 0045464a где заведомо расположена инструкция mov и неизвестно, что в квадратных скобках при дизассемблированни в run-timeПример для наиболее распространённых инструкций.1) inc [x]2) mov reg, [x]3) mov [x], reg4) fld [x]5) fstp [x]function CreateAdvancedCheat(cheatName, address, patternAsmCode, patternInjectAsmCode, stateOriginalCode)local disassembledstring = disassemble(address)local _extrafield, opcode, _bytes, _address = splitDisassembledString(disassembledstring)local newCode = ''-- FOR PATTERNS--[[1) inc [x]2) mov reg, [x]3) mov [x], reg4) fld [x]5) fstp [x]]]---- FOR PATTERN "inc ..."-- opcode = "inc [0045B5A4]"-- patternAsmCode = "inc [x]"-- patternInjectAsmCode = "mov [x], #100"if string.find(opcode, "inc") ~= nil and string.find(patternAsmCode, "inc") ~= nil then-- FOR PATTERN "inc [x]"if string.find(patternAsmCode, "\[x\]") ~= nil thenlocal s, e, x = string.find(opcode, '%[(.*)%]')if x ~= nil thennewCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')--while string.find(newCode, '\[x\]') ~= nil do-- newCode = string.gsub(newCode,'\[x\]', '\['..x..'\]')--endendendend-------------------------------------Test.exe+54650 - A1 A4B54500 - mov eax,[Test.exe+5B5A4]-- FOR PATTERN "mov ..."-- opcode = "mov eax,[Test.exe+5B5A4]"-- patternAsmCode = "mov [x],"-- opcode = "mov [Test.exe+5B5A4],eax"-- patternAsmCode = "mov ,[x]"-- patternInjectAsmCode = "mov [x], #100"if string.find(opcode, "mov") ~= nil and string.find(patternAsmCode, "mov") ~= nil thenif string.find(patternAsmCode, "\[x\]") ~= nil thenlocal s, e, x = string.find(opcode, ',%[(.*)%]')if x ~= nil thennewCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')elselocal s, e, x = string.find(opcode, '%[(.*)%],')if x ~= nil thennewCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')elsenewCode = patternInjectAsmCodeendendendend-------------------------------------004F0249 - D9 86 A0000000 - fld dword ptr [esi+000000A0]-- FOR PATTERN "fld ..."-- opcode = "fld dword ptr [esi+000000A0]"-- patternAsmCode = "fld [x]"-- patternInjectAsmCode = 'mov [x],#1000\r\nfld [x]'if string.find(opcode, "fld") ~= nil and string.find(patternAsmCode, "fld") ~= nil thenif string.find(patternAsmCode, "\[x\]") ~= nil thenlocal s, e, x = string.find(opcode, '%[(.*)%]')if x ~= nil thennewCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')elsenewCode = patternInjectAsmCodeendendend----------------------------------------------------------------- FOR PATTERN "fstp [x]"-- opcode = "fstp dword ptr [esi+000000A0]"-- patternAsmCode = "fstp [x]"-- patternInjectAsmCode = "fstp [x]\\r\\nmov [x],#1000"if string.find(opcode, "fstp") ~= nil and string.find(patternAsmCode, "fstp") ~= nil thenif string.find(patternAsmCode, "\[x\]") ~= nil thenlocal s, e, x = string.find(opcode, '%[(.*)%]')if x ~= nil thennewCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')endendendif newCode == '' thenprintErrorForCreateAdvancedCheat(cheatName, address, patternAsmCode, patternInjectAsmCode, stateOriginalCode)elseCreateCheat(cheatName, address, newCode, stateOriginalCode)endendСледующий момент это подсказать пользователю как сформировать CreateAdvancedCheat функцию.-- Some guess about pattern injectionlocal disassembledstring = disassemble(address)local _extrafield, opcode, _bytes, _address = splitDisassembledString(disassembledstring)-- FOR PATTERN "inc ..."local pattern = nilif string.find(opcode, "inc") ~= nil and string.find(opcode, "%[") ~= nil then-- FOR PATTERN "inc [x]"-- opcode = "inc [0045B5A4]"patternAsmCode = "inc [x]"patternInjectAsmCode = "mov [x], #100"stateOriginalCode = 'false'pattern = string.format('CreateAdvancedCheat("cheatName", "%08x", "inc [x]", "mov [x], #100", false)', address)end-- FOR PATTERN "mov ,[x]"print("--->>>>>")print(opcode)if string.find(opcode, "mov") ~= nil and string.find(opcode, ",%[") ~= nil then-- opcode = "mov eax,[Test.exe+5B5A4]"patternAsmCode = "mov ,[x]"patternInjectAsmCode = "mov [x], #100"stateOriginalCode = 'true'pattern = string.format('CreateAdvancedCheat("cheatName", "%08x", "mov ,[x]", "mov [x], #100", true)', address)end-- FOR PATTERN "mov [x],"if string.find(opcode, "mov") ~= nil and string.find(opcode, "%],") ~= nil then-- opcode = "mov [Test.exe+5B5A4],eax"patternAsmCode = "mov [x],"patternInjectAsmCode = "mov REG, #100"stateOriginalCode = 'true'pattern = string.format('CreateAdvancedCheat("cheatName", "%08x", "mov [x],", "mov REG, #100", true)', address)end-- FOR PATTERN "fld [x]"if string.find(opcode, "fld") ~= nil and string.find(opcode, "%[") ~= nil then-- opcode = "fld dword ptr [esi+000000A0]"patternAsmCode = "fld [x]"patternInjectAsmCode = "mov [x],(float)1000"stateOriginalCode = 'true'pattern = string.format('CreateAdvancedCheat("cheatName", "%08x", "fld [x]", "mov [x],#1000", true)', address)end-- FOR PATTERN "fstp [x]"if string.find(opcode, "fstp") ~= nil and string.find(opcode, "%[") ~= nil then-- opcode = "fstp dword ptr [esi+000000A0]"patternAsmCode = "fstp [x]"patternInjectAsmCode = "fstp [x]\\r\\nmov [x],(float)1000"stateOriginalCode = 'false'pattern = string.format('CreateAdvancedCheat("cheatName", "%08x", "fstp [x]", "fstp [x]\\r\\nmov [x],(float)1000", false)', address)endprint(' ' .. string.format('CreateCheatWithSignature("cheatName","%s","+X-C-W", 0, "mov , #100", false)', str) )print(' OR')print(' ' .. string.format('FillnopsInstruction_AndAddInCETable("cheatName", "%08x")', address))print(' ' .. string.format('FillnopsInstructionWithSignature_AndAddInCETable("cheatName","%s","+X-C-W",0)', str) )print(' OR')if pattern~=nil thenprint(' '..pattern)print(' '..'Also You can use:')print(' CreateAdvancedCheatWithSignature(cheatName, signature, typeMem, signatureOffset, patternAsmCode, patternInjectAsmCode, stateOriginalCode)')print(' '..string.format('CreateAdvancedCheatWithSignature("cheatName", "%s", "+X-C-W", 0, "%s", "%s", %s)',str,patternAsmCode,patternInjectAsmCode,stateOriginalCode))elseprint('Advanced cheat is not supported for this instruction: '.. opcode)endprint('')print('--END--')Задача для желающих вытащить из архива нужный код и встроить в этот или в отдельных плагин.v00001_Base.rar Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 22 октября, 2012 Поделиться Опубликовано 22 октября, 2012 Я вечером еще доделаю aobscan, что то типа проверочных байтов. Можно ли убрать пункт Get signature? Она и так используется в новом aobscan'е.Как сделаю, возьмусь за новую задачу. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 октября, 2012 Автор Поделиться Опубликовано 22 октября, 2012 >>Можно ли убрать пункт Get signature?Да, конечно. Если посчитаешь что-то ненужным можешь поменять/удалить без вопросов. Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 24 октября, 2012 Поделиться Опубликовано 24 октября, 2012 Версия 1.61) Доработана функция GetAddressFromOpcode, теперь работает корректно со всеми типами инструкций (раньше не вычисляла адреса для трехоперандового imul);2) Изменения в aobscan:- оптимизирован алгоритм (теперь строка байтов ищется быстрее);- теперь поиск ведется с проверочными байтами (нужно для случая легкого патча, например), т.е. все статические адреса меняются на 'xxxxxxxx';3) Добавлена новая функция GetScriptDisableFunc (пункт меню:Disable CALL), позволяющая просто отключать/включать использование CALL'а (прописывается в начало функции оператор ret с нужным числом аргументов). Реализовано в виде скрипта.p.s.: Disable CALL следует нажимать именно на самой call-инструкции. 4) Убрал Get signature info, вернее просто закоментил. Кому нужно, знают что делать =)Вот сам плагин: Plagin_MenuDisassembler_GenericAA.7z 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 6 ноября, 2012 Поделиться Опубликовано 6 ноября, 2012 Итак, нашел свободное время и сделал таки задуманное!Версия 2.0.- Полностью переписан код с некоторой оптимизацией;- в меню оставил единственный пункт: Create Cheat;- добавил графический интерфейс:Теперь подробнее.Создание скрипта теперь производится интерактивно, т.е. пользователю предлагается выбрать тип чита (на данный момент это: Injection, Nops, AOBScan и Disable CALL). Также предлагается ввести имя чита в поле Cheat Name (необязательно). Если оставить поле пустым, то скрипт и имена (label(имя), registersymbol(имя)) в скрипте obscan'а будут сгенерированы автоматом.Далее, в алгоритм включен анализ выбранной инструкции, от результата которого зависит создание чит кода. Работает пока что только на инструкциях:inc [x]mov [x],regmov reg,[x]fld [x]fstp [x]Также в чите сохраняется тип операнда (byte, word, dword и т.д.)Сам чит выглядит так: mov [x],value где value - значение из соответствующего поля. Там же можно выбрать тип значения (Type of value) который избавит от необходимости конвертировать значение в какой либо тип.В общем тестируйте и сообщайте о багах Сам скрипт: Plagin_MenuDisassembler_GenericAA.7zВ архиве 2 файла, нужно извлечь оба в папку autorun.P.S. Кто не хочет, чтобы окошко закрывалось, то нужно в функции btnOkClick закоментить последнюю строку =)Удачного взлома! 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 11 ноября, 2012 Поделиться Опубликовано 11 ноября, 2012 Версия 2.1.- Множество мелких исправлений (например, при создании скрипта теперь не остаются лишние пустые строки);- более удобное меню;- улучшен сам вид формы чита;- вернул Get signature info отдельным пунктом меню;- более грамотный AOBScan. Есть возможность вкл/выкл режим поиска с проверочными байтами, а также можно выбрать тип их генерации: soft - применим для случаев с легкими патчами, hard - остаются только первые байты операторов, а так же убираются однобайтовые инструкции. По скорости, думаю, все очевидно: С выключенными проверочными байтами скрипт создается практически мгновенно, в случае "soft" может занять пару секунд, а вот "hard" секунд 5-10 (может и дольше).- горячие клавиши теперь действуют из предыдущих версий скриптов (найти их можно из меню Quick Cheat);- добавлена возможность выбрать тип получаемого оригинального кода в секции [disabled] - Original code in bytes.Если включено, то код будет генерироваться в виде: "db 11 22 33". В некоторых случаях это необходимо, т.к. при отключении скрипта, будут сгенерированы байты, отличные от оригинала. К примеру, на скриншоте выбрана инструкция с байтами A3 14FB4A01 и после применения и снятия скрипта (обычной инъекции или аобскана) инструкция останется та же, но байты будут другими: 89 05 14FB4A0. Видно что размер инструкции увеличился на байт, что недопустимо.О пункте Advanced Cheat можно думать как о настройках создания скрипта. В Quick Cheat будут использоваться выставленные значения и имена из окна Advanced Cheat.Сам скрипт с файлом формы: Plagin_MenuDisassembler_GenericAA.7zПока что всё. Пишите о багах и предложениях! Удачного взлома! 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 11 ноября, 2012 Поделиться Опубликовано 11 ноября, 2012 Спасибо SnedS91. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 13 ноября, 2012 Автор Поделиться Опубликовано 13 ноября, 2012 SnedS91, судя по описанию и скрину, то очень хорошо. Могу предложить сделать передышку в развитии плагина и заняться следующим, если будет, конечно, интерес и желание. Заняться такой важной вещью как название плагина и документированием. Чтобы все основания пользоваться этим Lua-плагином и его достоинства были понятны если не всем, то большому кругу пользователей. Чтобы можно было донести до Пользователя, что, вот мол, есть такой замечательный плагин, умеет делать-то и то, есть даже документация с примерами (может быть даже со скриншотами). Название плагина может быть и лучше, но я пока не думал над этим.Документацию можно оформить например в chm, pdf, rtf, html с такими пунктами.1) Версия плагина, дата последнего обновления, ссылка тех. поддержки (на эту тему)2) Краткое описание (для чего нужен, что умеет (кратко))3) Авторы плагина (можешь поставить себя на первое место, меня на второе , можно указать ссылки на профиль)4) Авторы составления документации5) Оглавление:5.1) Как устанавливать плагин5.2) Описание работы (каждой функции)5.3) Примеры (можно и на некоторой игре)Если это формат html+javasript можно всю информацию сделать на одной странице использовать спойлеры для больших пунктов. Если chm, то можно не скупиться на разветвлённую структуру документа. Если pdf или rtf, то придётся подстраиваться под лист. Наверно, лучше chm. Можно взять за пример оформления документации в chm для любой программы. Например для CE, Olly Debugger или другой.Проделанную работу будет не грех разместить на главном сайте. Это был бы не просто плагин (пользоваться которым скорее всего умеют немногие), а плагин с документом (или справочной информацией).Ну, а позже можно сделать краткое описание на Инглише (наверно я этим займусь) и лично попрошу Дарк Байта (разработчика CE) добавить плагин как включение по умолчанию для последующий версий CE и на текущий момент для версии CE на его официальный сайт. Я думаю ему эта идея понравится и он согласится. Ссылка на комментарий Поделиться на другие сайты Поделиться
SnedS91 Опубликовано 15 ноября, 2012 Поделиться Опубликовано 15 ноября, 2012 Хорошо, сделаем в ближайшее свободное время Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения