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

Plugin AA Maker (создание АА скриптов)


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

Внимание! Новые версии плагина искать в конце темы

 

Последняя версия плагина - здесь

Видео инструкция для новичков - здесь

 

Версия плагина 1.0

Plagin_MenuDisassembler_GenericAA.rar

1. Создаёт АА-код аналогично шаблону Дарк Байта

2. Без комментариев

3. Без часто лишней метки Exit

4. Высвобождение памяти помещено в самый низ.

5. Можно выделить строку в дизассемблере и нажать на горячие клавиши "CTRL+SHIFT+A". Тут же увидите новую запись в главной таблице CE.

6. Для тех кто не хочет запоминать горячие клавиши функцию создания АА я разместил в контекстном меню с названием "* Create AA"

post-3-0-56212000-1336056036_thumb.png

К сожалению редактор АА-скрипта автоматически открыть через 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)

 

Если вы нашли ошибку в скрипте, то вы можете сообщить о ней здесь. Тоже самое касается пожеланий по новым возможностям или исправлениям.

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

>> сделал бы кто плагин чтоб формировался АА скрипт с проверочными байтами

Эта поддержка скоро появится. Возможно сегодня.


Чтобы в скрипте вы видели базовый адрес как символьное имя например

"game.exe + смещение:"

В CE зайдите в дизассемблер и нажмите на Ctrl+M или через меню View->Show Module Addresses.

После этого в ваших скриптах вы смоежете понять в dll-ке ваш код или нет.

Настоятельно рекоммендую поставить эту опцию и больше её не снимать. Только в крайних случаях, когда вам нужно знать только адрес.

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

Версия плагина 1.1

Plagin_MenuDisassembler_GenericAA.rar

Добавлены:

1) Добавлена функция * Get signature info

2) Добавлена функция * Create AA-aobsan (без пропускающих байтов 'xx', сработает только, если выбранная сигнатура уникальна)

См. скриншот.

post-3-0-01662100-1336142937_thumb.png

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
->>originalCode
jmp returnHere
signatureAddress: //->>comment
address->>NscriptCount:
jmp newMem
->>nops
returnHere:
[DISABLE]
address->>NscriptCount:
->>originalCode
dealloc(newMem)
unregistersymbol(address->>NscriptCount)
]]
AOBSCANCodeTemplate = [[

Как пользоваться?

1. Находим нужную инструкцию в дизассемблере;

2. Выделяем эту инструкцию и несколько нижних, и по нижней правым кликом вызываем контестное меню и далее Create AA-aobsan

3. Если скрипт добавился, значит вы выделили инструкции с уникальной сигнатурой.

4. Если скрипт не добавился или мы хотим посмотреть уникальна или нет сигнатура, то вызываем "Get signature info". Тем самым мы получаем информацию, о том уникальна ли сигнатура или нет, сколько раз она повторяется. Если не уникальная, то выделяем ещё инструкцию ниже или несколько инструкций. Опять узнаём, уникальна она или нет вызывая * Get signature info

Дополнительная информация

Сигнатура кода для этой версии плагина берётся без пропускающих байтов "xx". В другой версии плагина будет и новая функция с пропускающими байтами. Но это уже будет не для AA, а для Lua+AA для более опытных пользователей.

Хочу так же напомнить и специально обратить внимание. Что сигнатура кода не даст Вам 100% результат работы читов на патчах.

Сигнатуру нужно уметь составлять. Как минимум стараться чтобы в коде инъекции и оригинальном коде не было статических адресов вида mov eax,[адрес]

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

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

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

  • 5 месяцев спустя...

небольшую поправку нужно написать, чтоб при ошибке не создавался скрипт:


function OnItemMenuGenerateAAWithAOBSCANClick(sender)
local script = GetScriptAOBSCAN()
if (script ~= nil) then
local newTableEntry = AddAARecord(script, 'New AOBSCAN-Script ')
OpenAAEditor(newTableEntry)
end
end

Я хочу дополнить шаблоном для быстрого нопа выделенных функций:


NopCodeTemplate = [[
[ENABLE]
->>address:
->>nops
[DISABLE]
->>address:
->>originalCode
//->>comment
]]


function GetNops(strAddress, length) -- return originalCodeString, originalBytesString, nopsString
local sumBytes = 0
local originalCodeString = ""
local originalBytesString = ""
local address = strAddress

local countBytes = 0
repeat
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..bytes
until (sumBytes >= length)
---------------nops-----------------
local nopsString = "db "
local nopsCount = length
if (nopsCount>0) then
for i = 1, nopsCount do
if i == nopsCount then
nopsString = nopsString.."90"
else
nopsString = nopsString.."90 "
end
end
end

return originalCodeString, originalBytesString, nopsString
end


function GetScriptAANop()
local script = NopCodeTemplate

local 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) - address

local 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 script
end


function OnItemMenuGenerateAANopClick(sender)
local script = GetScriptAANop()
local newTableEntry = AddAARecord(script,'New Script')
OpenAAEditor(newTableEntry)
end


AddItemMenuInMemoryViewForm('* Create AA NOP', 'Ctrl+Shift+N', OnItemMenuGenerateAANopClick, OnSelectionTracker)

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

Спасибо, товарищу SnedS91.

Версия плагина 1.2

1) Проверка результата GetScriptAOBSCAN (автр. SnedS91)

2) Добавлен Шаблон для nop-инъекции (автр. SnedS91)

Plagin_MenuDisassembler_GenericAA.rar

Желающие могут протестировать.

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

Баг по создание АА кода с помощью плагина.

Тока встречается этот баг когда касается командой CMP (Сравнение)


[ENABLE]
alloc(newMem, 2048)
label(returnHere)
newMem:
cmp ecx,FCjne 007BE3A0
jmp returnHere
cheatengine-i386.exe+3BE394:
jmp newMem
returnHere:
[DISABLE]
cheatengine-i386.exe+3BE394:
cmp ecx,FCjne 007BE3A0
dealloc(newMem)

А эта обычным путем создание АА скрипта.


[ENABLE]
alloc(newmem,2048)
label(returnhere)
newmem:
cmp ecx,FC
jne cheatengine-i386.exe+3BE3A0

"cheatengine-i386.exe"+3BE394:
jmp newmem
returnhere:
[DISABLE]
"cheatengine-i386.exe"+3BE394:
cmp ecx,FC
jne cheatengine-i386.exe+3BE3A0
dealloc(newmem)

Разница видна? через плагин пишется орг. код cmp ecx,FCjne 007BE3A0.

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

Баг по создание АА кода с помощью плагина.

Тока встречается этот баг когда касается командой CMP (Сравнение)


[ENABLE]
alloc(newMem, 2048)
label(returnHere)
newMem:
cmp ecx,FCjne 007BE3A0
jmp returnHere
cheatengine-i386.exe+3BE394:
jmp newMem
returnHere:
[DISABLE]
cheatengine-i386.exe+3BE394:
cmp ecx,FCjne 007BE3A0
dealloc(newMem)

А эта обычным путем создание АА скрипта.


[ENABLE]
alloc(newmem,2048)
label(returnhere)
newmem:
cmp ecx,FC
jne cheatengine-i386.exe+3BE3A0

"cheatengine-i386.exe"+3BE394:
jmp newmem
returnhere:
[DISABLE]
"cheatengine-i386.exe"+3BE394:
cmp ecx,FC
jne cheatengine-i386.exe+3BE3A0
dealloc(newmem)

Разница видна? через плагин пишется орг. код cmp ecx,FCjne 007BE3A0.

Да я тоже заметил такую ошибку, нужно в плагине поменять функцию GetInfoInjection на эту:


function GetInfoInjection(strAddress) -- return addressReturnHere, originalCodeString, nopsString
local sumBytes = 0
local originalCodeString = ""
local addressReturnHere = strAddress

local countBytes = 0
repeat
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"
end
until (sumBytes >= 5)

local nopsString = ""
local nopsCount = sumBytes - 5
if (nopsCount>0) then
for i = 1, nopsCount do
if i == nopsCount then
nopsString = nopsString.."nop"
else
nopsString = nopsString.."nop\r\n"
end
end
end

return addressReturnHere, originalCodeString, nopsString
end

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

Решил дополнить AA-aobscan.

Теперь, чтобы создать скрипт не нужно выделять код и искать уникальные байты, функция сделает все за нас, достаточно нажать по первой инструкции ПКМ (можно и выделить часть инструкций) и выбрать Create AA-aobscan ^_^

Вот, собственно, и сама функция:


function GetScriptAOBSCAN()
local strSignature = ''
local result = ''
local count = -1
local address = math.min(dv_address1, dv_address2)
local stop = math.max(dv_address1, dv_address2)
local length = stop + getInstructionSize(stop) - address

local countBytes = 0
repeat
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)
end
until (count == 1)

local strAddress = getNameFromAddress(address)
local script = AOBSCANCodeTemplate
local cheatCode = ""
local originalCode = ''
local nops = ''
local addressReturnHere = 0

addressReturnHere, 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+50FCFD
if nops=='' then
script = string.gsub(script,"->>nops\n", nops) --\r\n
else
script = string.gsub(script,"->>nops", nops)
end

script = string.gsub(script,"->>NscriptCount", scriptCount)
return script
end

и еще нужно исправить Create AA-aobsan на Create AA-aobscan =)

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

Версия 1.4

1) Генерация AA-aobscan. (авт. SnedS91)

Скачать:Plagin_MenuDisassembler_GenericAA.rar

Решил дополнить AA-aobscan.

Теперь, чтобы создать скрипт не нужно выделять код и искать уникальные байты, функция сделает все за нас, достаточно нажать по первой инструкции ПКМ (можно и выделить часть инструкций) и выбрать Create AA-aobscan

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

Версия 1.5

1) Добавлена функция GetAddressFromOpcode, которая анализирует все опкоды.

Если находит в опкоде адрес, то меняет его на стандартное представление: База+смещение;

2) Привел код в порядок, убрал ненужные переменные, немного изменил названия меню.

Скачать плагин: Plagin_MenuDisassembler_GenericAA.7z

P.S.: Теперь это вполне полностью работоспособный плагин!

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

Теперь можно брать планку гораздо выше - автоматическое создание АА-кода под 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], reg

4) 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], reg
4) 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 then
local s, e, x = string.find(opcode, '%[(.*)%]')
if x ~= nil then
newCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')

--while string.find(newCode, '\[x\]') ~= nil do
-- newCode = string.gsub(newCode,'\[x\]', '\['..x..'\]')
--end
end
end
end
-----------------------------------
--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 then
if string.find(patternAsmCode, "\[x\]") ~= nil then
local s, e, x = string.find(opcode, ',%[(.*)%]')
if x ~= nil then
newCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')
else
local s, e, x = string.find(opcode, '%[(.*)%],')
if x ~= nil then
newCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')
else
newCode = patternInjectAsmCode
end

end
end
end

-----------------------------------
--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 then
if string.find(patternAsmCode, "\[x\]") ~= nil then
local s, e, x = string.find(opcode, '%[(.*)%]')
if x ~= nil then
newCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')
else
newCode = patternInjectAsmCode
end
end
end

---------------------------------------------------------------
-- 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 then
if string.find(patternAsmCode, "\[x\]") ~= nil then
local s, e, x = string.find(opcode, '%[(.*)%]')
if x ~= nil then
newCode = string.gsub(patternInjectAsmCode,'%[x%]', '\['..x..'\]')
end
end
end

if newCode == '' then
printErrorForCreateAdvancedCheat(cheatName, address, patternAsmCode, patternInjectAsmCode, stateOriginalCode)
else
CreateCheat(cheatName, address, newCode, stateOriginalCode)
end
end

Следующий момент это подсказать пользователю как сформировать CreateAdvancedCheat функцию.


-- Some guess about pattern injection
local disassembledstring = disassemble(address)
local _extrafield, opcode, _bytes, _address = splitDisassembledString(disassembledstring)

-- FOR PATTERN "inc ..."
local pattern = nil
if 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)
end

print(' ' .. 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 then
print(' '..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))
else
print('Advanced cheat is not supported for this instruction: '.. opcode)
end


print('')
print('--END--')

Задача для желающих вытащить из архива нужный код и встроить в этот или в отдельных плагин.

v00001_Base.rar

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

Я вечером еще доделаю aobscan, что то типа проверочных байтов. Можно ли убрать пункт Get signature? Она и так используется в новом aobscan'е.

Как сделаю, возьмусь за новую задачу.

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

Версия 1.6

1) Доработана функция 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
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Итак, нашел свободное время и сделал таки задуманное!

Версия 2.0.

- Полностью переписан код с некоторой оптимизацией;

- в меню оставил единственный пункт: Create Cheat;

- добавил графический интерфейс:

post-8695-0-41692100-1352228984_thumb.jp

Теперь подробнее.

Создание скрипта теперь производится интерактивно, т.е. пользователю предлагается выбрать тип чита (на данный момент это:

Injection, Nops, AOBScan и Disable CALL). Также предлагается ввести имя чита в поле Cheat Name (необязательно). Если оставить поле пустым, то скрипт и имена (label(имя), registersymbol(имя)) в скрипте obscan'а будут сгенерированы автоматом.

Далее, в алгоритм включен анализ выбранной инструкции, от результата которого зависит создание чит кода. Работает пока что только на инструкциях:


inc [x]
mov [x],reg
mov 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
Ссылка на комментарий
Поделиться на другие сайты

Версия 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. Видно что размер инструкции увеличился на байт, что недопустимо.

post-8695-0-90675700-1352649747_thumb.jp

О пункте Advanced Cheat можно думать как о настройках создания скрипта. В Quick Cheat будут использоваться выставленные значения и имена из окна Advanced Cheat.

Сам скрипт с файлом формы: Plagin_MenuDisassembler_GenericAA.7z

Пока что всё. Пишите о багах и предложениях! Удачного взлома! ^_^

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

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 на его официальный сайт. Я думаю ему эта идея понравится и он согласится.

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

  • Garik66 закрепил тема
×
×
  • Создать...

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

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