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

Наш модуль TrainerGen.lua для создания .CETRAINER-трейнеров


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

Библиотека ещё не доведена до ума, но кое-что она умеет делать.

post-3-1307521965,03_thumb.png

Для того чтобы создалось это окно и читы работали по горячим клавишам со звуковым сообщением надо написать код LUA в главной таблице CE (это всего лишь пример):

require("TrainerGen")

function Initialize()
AddCheatInCETableFillnopsInstructionWithSignature("NoRecoilHand", "e8xxxxxxxx8bxxxxxx83xxxx33xx80xxxxxx75xx8bxxxxxxf7", 0)
bufScript = BeginGenerateAAscriptAggregateMem("allocMem", "2048")
bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoRecoilWalk", "d9xxd9xxxxd9xxxxd9xxxxxxxxxxdexxdfxxf6xxxx75xxd9xxxxxxxxxxd9", 8, "fstp st\n fldz", true )
bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoRecoilShot", "d9xxxxxxxxxx75xxd9xxxxxxxxxxd8xxxxxxd8xxdfxxf6xxxx7axxd9", 0, "fstp st\n fldz", true )
bufScript = GenerateAAscriptAggregateMemWithSignature(bufScript, "NoReload", "83xxxxxxxxxxxxxx74xxf6xxxxxx74xx83xxxx89xxxxxxxxxx39xxxx7dxxf7", 0, "mov [ebp+eax*4+00000334],#100", true )
bufScript = EndGenerateAAscriptAggregateMem(bufScript)
autoAssemble(bufScript)
GroupAA("Complex better weapons", {"NoRecoilHand", "NoRecoilWalk", "NoRecoilShot", "NoReload"} )
end

AAgenINIT("CoD4 Ttainer +1, v1.0, {MasterGH}", "iw3sp.exe", Initialize)

Далее сохранить этот код примера как .CETRAINER.

Запустить двойным кликом. Форма CE показываться не будет.

Запустить игру и дождаться когда трейнер будет готов к работе.

Активировать чит нажатием горячих клавиш для группы "Complex better weapons"

Код TrainerGen.lua (который надо поместить в папку с трейнерами типа .CETRAINER или файлами типа .CT; в коде есть мусор в комментариях, если мешает, то убрать самостоятельно)


-- Если скрипт с таким именем уже существует, то он будет перезаписан
function GenerateAAscriptCreatePageMem( cheatName, address, injectInstruction, originalcode )
local addressInjection = address

local adressReturnHere = 0
local originalCodeString = ""
local nopsString = ""
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)

if (originalcode) then
script =[[
[ENABLE]
alloc(newmem,2048)
label(originalcode)
label(returnhere)

newmem:
]]..injectInstruction..[[

originalcode:]]..originalCodeString.. [[

jmp returnhere

]]..addressInjection..[[:
jmp newmem
]]..nopsString..[[
returnhere:

[DISABLE]
]]..addressInjection..":"..originalCodeString.. [[


dealloc(newmem)
]]
else
script =[[
[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
]]..injectInstruction..[[

jmp returnhere

]]..addressInjection..[[:
jmp newmem
]]..nopsString..[[
returnhere:

[DISABLE]
]]..addressInjection..":"..originalCodeString.. [[


dealloc(newmem)
]]
end

end
----^^^^^^^^^

-- Функции часто используемые другими функциями
function preSubScript(script, patternWord, newWords) -- return bufferString
local index = string.find(script, patternWord)
local newscript = string.sub(script, 1, index - 1)..newWords.."\n"..string.sub(script, index)
return newscript
end
function SetScriptInEntryCETable(cheatName, script)
local teSlave = getTableEntry(cheatName)
if (teSlave == nil) then
teSlave = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(teSlave, cheatName)
end
memoryrecord_setType(teSlave, vtAutoAssembler)
memoryrecord_setScript(teSlave, script)
end
----^^^^^^^^^

-- Функции для извлечения какой-то информации
function GetInfoInjection(address) --return adressReturnHere, originalCodeString, nopsString
local sumBytes = 0
local originalCodeString = " "

repeat
countBytes = getInstructionSize(address)
extrafield, opcode, bytes, address = splitDisassembledString(disassemble(address))
originalCodeString = originalCodeString.."\n "..opcode
sumBytes = sumBytes + countBytes
until (sumBytes >= 5)
adressReturnHere = string.format("%x", ("0x"..address) + countBytes)

local nopsString = ""
local nopsCount = sumBytes - 5
if (nopsCount>0) then
nopsString = " db"
for i = 1, nopsCount do
nopsString = nopsString.." 90"
end
end

return adressReturnHere, originalCodeString, nopsString
end
function GetSignatureOfCode(address)
--[[
Переписать из кода Дельфи

procedure TfrmAutoInject.Codeinjection1Click(Sender: TObject);
function inttostr(i:int64):string;
begin
if i=0 then result:='' else result:=sysutils.IntToStr(i);
end;


var address: string;
addressdw: dword;
originalcode: array of string;
originalbytes: array of byte;
codesize: integer;
a,b: dword;
x: string;
i,j,k: integer;
prev_usesymbols: boolean;
injectnr: integer;

enablepos: integer;
disablepos: integer;
enablecode: tstringlist;
disablecode: tstringlist;
simbol:boolean;
bofset:byte;
provbyte:string;
begin
{$ifndef standalonetrainerwithassembler}
CheatTablecompliantcodee1.Click; // обрамление
simbol:=symhandler.showmodules; //запоминаем "нужно ли показывать модули"
symhandler.showmodules:=true; //в любом случае показываем модули в метках
a:=memorybrowser.disassemblerview.SelectedAddress;

address:=inttohex(a,8);
{ if inputquery('Code inject template','On what address do you want the jump?',address) then
begin}
try
a:=strtoint('+address);
except

a:=symhandler.getaddressfromname(address);

end;

b:=a;

injectnr:=0;
for i:=0 to assemblescreen.Lines.Count-1 do
begin
j:=pos('alloc(newmem',lowercase(assemblescreen.lines[i]));
if j<>0 then
begin
x:=copy(assemblescreen.Lines[i],j+12,length(assemblescreen.Lines[i]));
x:=copy(x,1,pos(',',x)-1);
try
k:=strtoint(x);
if injectnr<=k then
injectnr:=k+1;
except
inc(injectnr);
end;
end;
end;


//disassemble the old code
setlength(originalcode,0);
codesize:=0;

while codesize<5 do
begin
setlength(originalcode,length(originalcode)+1);
originalcode[length(originalcode)-1]:=disassemble(a,x);
i:=posex('-',originalcode[length(originalcode)-1]);
i:=posex('-',originalcode[length(originalcode)-1],i+1);
originalcode[length(originalcode)-1]:=copy(originalcode[length(originalcode)-1],i+2,length(originalcode[length(originalcode)-1]));
codesize:=a-b;
end;

setlength(originalbytes,codesize);
ReadProcessMemory(processhandle, pointer(B), @originalbytes[0], codesize, a);

enablecode:=tstringlist.Create;
disablecode:=tstringlist.Create;
try
with enablecode do
begin

// Необходимое сканирование при активации, когда адрес сместился
//aobscan(_address,d8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8bxxe8xxxxxxxxd9xxd8)
provbyte:=getbytes(strtoint('+address));
add(' aobscan(_faddress,'+provbyte+')');
add(' alloc(_newmem'+inttostr(injectnr)+',2048)');
add(' label(_returnhere'+inttostr(injectnr)+')');
add(' label(_originalcode'+inttostr(injectnr)+')');
add('');
add('_newmem'+inttostr(injectnr)+':');
// add(' mov [],eax //mov eax,');
add('');
add('_originalcode'+inttostr(injectnr)+':');
for i:=0 to length(originalcode)-1 do
add(' '+originalcode[i]);
add(' jmp _returnhere'+inttostr(injectnr)+'');

add('');
add('_faddress: // '+address+' = '+symhandler.getNameFromAddress(strtoint('+address)));
// add(symhandler.getnamefromaddress(strtoint('+address))+':');//прыжок после выделения памяти
// add(address+':');
add(' jmp _newmem'+inttostr(injectnr)+'');
bofset:=5;
while codesize>5 do
begin
add(' nop');
dec(codesize);
inc(bofset); // для посторения проверочных байта отмены
end;
add('_returnhere'+inttostr(injectnr)+':');
end;

delete(provbyte,1,bofset*2); // удаляем то чего не надо искать
dec(bofset,5);
for I := 1 to bofset do
provbyte:='90'+provbyte;

with disablecode do
begin
add(' aobscan(_faddress,'+provbyte+')');
add('');
// add(address+':');
add('_faddress-5:');
for i:=0 to length(originalcode)-1 do
add(' '+originalcode[i]);
add('');
add(' dealloc(_newmem'+inttostr(injectnr)+')');
x:='db';
for i:=0 to length(originalbytes)-1 do
x:=x+' '+inttohex(originalbytes[i],2);
add('//Alt: '+x);
end;

getenableanddisablepos(assemblescreen.lines,enablepos,disablepos);
//skip first comment(s)
if enablepos>=0 then
begin
while enablepos<assemblescreen.lines.Count-1 do
begin
if pos('//',trim(assemblescreen.Lines[enablepos+1]))=1 then inc(enablepos) else break;
end;
end;

for i:=enablecode.Count-1 downto 0 do
assemblescreen.Lines.Insert(enablepos+1,enablecode[i]);

getenableanddisablepos(assemblescreen.lines,enablepos,disablepos);
//skip first comment(s)
if disablepos>=0 then
begin
while disablepos<assemblescreen.lines.Count-1 do
begin
if pos('//',trim(assemblescreen.Lines[disablepos+1]))=1 then inc(enablepos) else break;
inc(disablepos);
end;
//only if there actually is a disable section place this code
for i:=disablecode.Count-1 downto 0 do
assemblescreen.Lines.Insert(disablepos+1,disablecode[i]);
end;
finally
enablecode.free;
disablecode.Free;
end;
symhandler.showmodules:=simbol;
//

{$endif}
end;
]]--

-- Количество попыток поиска сигнатуры, на тот случай если поиск окажеться долгим
-- может вмешаться пользователь остановить или продолжить поиск
local numberOfAttemptsForShowPermission = 1000
local CountOfnumberOfAttemptsForShowPermission = 0

local offsetSignature = 0
local lengthSignature = 0
local signature = ""

-- Уникальная сигнатура подбирается по первым байтам машинных инструкций от начала функции до её конца
-- Стремление к тому чтобы сигнатура была меньших размеров и была уникальна по правилу сканирования "+X-C-W"

--1. Получаем строку байт в функции
-- 1.2 Ищем адрес1 начала функции
-- 1.3 Ищем адрес2 конеца функции
-- Если адреса определить невозможно, то выводится сообщение об ошибке
-- 1.4 Дизассемблируя формируем сигнатуру от адреса1 до адреса2
-- 1.4.1 Формирование происходит по первым байтам одной инструкции в том случае
-- если размер инструкции болше 3 байт
-- заполнение не рабочих байт отмечается как "xx"
-- В итоге получаем длинную сигнатуру - строку байт в функции

repeat
--2. Создаются новый настройки поиска сигнатуры
-- 2.1 Поиск сигнатуры ведётся по её длине от 6 байт с места адреса, когда определены более трёх промежутков "xx" до длины сигнатуры
-- если сигнатура не находиться то она расползается в длину сначала вниз по 3 промежутка "xx", а затем вверх увеличивая увеличивая offsetSignature
-- если вся длина сигнатуры была просканирована и не нашлось уникальной, то появляеться сообщение об ошибке.
-- если сканирование очень затягивается больше 10 секунд, то появляеться сообщение "хочет ли пользователь дальше продолжать сканирование"
-- ....

-- Непосредственный поиск сигнатуры
local list = AOBScan(signature, "+X-C-W")
if ((results == nil) or (strings_getCount(list)>1) and stringlist_getString(results, 0)~=address) then
break -- успешный выход из цикла, уникальная сигнатура найдена
end

-- В противном случае засчитывается неудачаная попытка поиска сигнатуры
CountOfnumberOfAttemptsForShowPermission = CountOfnumberOfAttemptsForShowPermission + 1
if(CountOfnumberOfAttemptsForShowPermission > numberOfAttemptsForShowPermission) then
if (messageDialog()~="OK") then
showMessage("Поиск сигнатуры был остановлен пользователем")
--messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
return nil
end
end
until true

return signature


--[[ function getbytes():string;

adr:dword -- входящий адрес

var i,j,len,count:byte; frwrdaddr:dword; stlist:TstringList; s,s0,s1,intsr:string;
begin





frwrdaddr:=adr;
repeat
stlist.Add(disassemble(frwrdaddr)); // заполнили список ассемблерных инструкций типа '0061c2d3 - e8 61 c0 ff ff - call 00618339'
// frwrdaddr:=previousopcode(frwrdaddr)-1;
until frwrdaddr>=adr+120;

//После этого берём первые байты, если их количество не меньше 3 на опкод, остальные помечаем как xx

for i := 0 to stlist.Count-1 do
begin // Получаем:
s:=stlist.Strings[i];
s0:=copy(s,1,pos(' - ',s)); // адрес
delete(s,1,pos(' - ',s)+2);
s1:=copy(s,1,pos(' - ',s)); // байты
delete(s,1,pos(' - ',s)+2); // инструкция
intsr:=s;

//Если в строке байт находится больше трёх байт
len:=length(s1);
count:=(len div 3); //количество байт
s:='';
if (count>1)and(pos('push',intsr)=0) then
begin
s1:=copy(s1,1,3); // копируеме первый байт "FA "
for j := 2 to count
do s:=s+'xx '; // остальные затераем "хх хх хх хх "

s1:=s1+s; //s1:= "FA хх хх хх хх "
end
else // если байт меньше трёх то заливаем всё как "хх "
begin
for j := 1 to count
do s:=s+'xx ';
s1:=s; //s1: = "xx хх хх "
end;
result:=result+s1; //=)
end;

delete(result,(32*3),length(result)); //режем первые 32 байта

for I := 32 downto 1 do
delete(result,i*3,1);

while 'xx'=copy(result,length(result)-1,2) do
delete(result,length(result)-1,2);

stlist.Destroy; ]]--

end
function BeginGetLUACheatCode(aggregateMem, cheatName, signatre, newCode, stateOriginalCode )
--[[
]]--
end
function ENDGetLUACheatCode(aggregateMem, cheatName, signatre, newCode, stateOriginalCode )
--[[
]]--
end
function GetLUACheatCode(aggregateMem, cheatName, signatre, newCode, stateOriginalCode )
--[[
]]--
end
----^^^^^^^^^

-- Функции окоторые требуются для главной работы
function BeginGenerateAAscriptAggregateMem(newMemDescription, sizeMem) -- return bufferString
return [[
alloc(]]..newMemDescription..","..sizeMem..[[)
registersymbol(]]..newMemDescription..[[)
->>label]]..newMemDescription..[[:

->>newCode
->>adressessInjected
]]
end
function EndGenerateAAscriptAggregateMem(aggregateMem) -- return bufferString
local endScript = string.gsub(aggregateMem, "->>label", "")
endScript = string.gsub(endScript, "->>newCode", "")
endScript = string.gsub(endScript, "->>adressessInjected", "")
return endScript
end
function GenerateAAscriptAggregateMem(aggregateMem, cheatName, address, newCode, stateOriginalCode) -- return bufferString
local addressInjection = address
local adressReturnHere = 0
local originalCodeString = ""
local nopsString = ""
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)

registerSymbol("returnHere_"..cheatName, adressReturnHere)

local script = preSubScript(aggregateMem,"->>label", "label("..cheatName..")")
script = preSubScript(script,"->>label", "registersymbol("..cheatName..")")

if (stateOriginalCode) then
script = preSubScript(script,"->>label", "label(originalcode_"..cheatName..")")
local buf = cheatName..":\n "..newCode.."\noriginalcode_"..cheatName..":"..originalCodeString.."\n jmp returnHere_"..cheatName
script = preSubScript(script,"->>newCode", buf)
else
script = preSubScript(script,"->>newCode", cheatName..":\n"..newCode.."\n jmp returnHere_"..cheatName)
end

local scriptAddMainTable = "[ENABLE]\n-->>address1[DISABLE]\n-->>address2"
scriptAddMainTable = preSubScript(scriptAddMainTable,"-->>address1", addressInjection..":\n jmp "..cheatName.."\n"..nopsString)
scriptAddMainTable = preSubScript(scriptAddMainTable,"-->>address2", addressInjection..":"..originalCodeString)
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address1", "")
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address2", "")
SetScriptInEntryCETable(cheatName,scriptAddMainTable)

return script
end
function ByteScan(signature) -- return address
local results = AOBScan(signature, "+X-C-W")
if (results == nil) then
messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
closeCE()
return
end

local address = stringlist_getString(results, 0)
return address
end
function GenerateAAscriptAggregateMemWithSignature(aggregateMem, cheatName, signature, signatureOffset, newCode, stateOriginalCode )
local workAddress = ByteScan(signature)
if (signatureOffset ~=0) then
workAddress = string.format("%x", ("0x"..workAddress) + signatureOffset)
end
return GenerateAAscriptAggregateMem(aggregateMem, cheatName, workAddress, newCode, stateOriginalCode)
end
function AddCheatInCETableFillnopsInstruction(cheatName, address)
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)
local scriptAddMainTable = "[ENABLE]\n-->>address1[DISABLE]\n-->>address2"

local countBytes = getInstructionSize(address)
local nopsString = " db"
for i = 1, countBytes do
nopsString = nopsString.." 90"
end

scriptAddMainTable = preSubScript(scriptAddMainTable,"-->>address1", address..":\n"..nopsString)
scriptAddMainTable = preSubScript(scriptAddMainTable,"-->>address2", address..":"..originalCodeString)
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address1", "")
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address2", "")
SetScriptInEntryCETable(cheatName,scriptAddMainTable)
end
function AddCheatInCETableFillnopsInstructionWithSignature(cheatName, signature, signatreOffset)
local workAddress = ByteScan(signature)
workAddress = string.format("%x", ("0x"..workAddress) + signatreOffset)
AddCheatInCETableFillnopsInstruction(cheatName, workAddress)
end
----^^^^^^^^^

---------------------------------------------------------
local frmUserTrainer = nil -- форма конструируемого трейнера
local messageLabel = nil
local _InitFunction -- указатель на пользовательскую функцию инициализации читов
local attach = false -- подключен ли процесс

-- Cтрока информации в трейнере
local function SendMessageFrmTrainer(message)
control_setCaption(messageLabel, message)
end
-- Обработчик закрытия главной формы трейнера
local function FormClose(sender)
closeCE()
return caHide
end
-- Создание неготовой формы трейнера
local function CreateFormTrainer(nameTrainer)
frmUserTrainer = createForm(true)
control_setCaption(frmUserTrainer, nameTrainer)
control_setSize(frmUserTrainer, 400, 200)
form_centerScreen(frmUserTrainer)
form_onClose(frmUserTrainer, FormClose)

messageLabel = createLabel(frmUserTrainer)
control_setAlign(messageLabel, alBottom)
SendMessageFrmTrainer("Трейнер НЕ готов к работе")
end

-------------------------------------
local ObjectHotKeys = {}
local countObjectHotKeys = 0 -- countObjectHotKeys равное также кол-ву записей в главной таблице
local adrList = nil
local baseHotKey = "CTRL"
-- Функция группировки АА-скриптов в один (для того чтобы хоткей вешался на один сркипт вместо нескольких)
function GroupAA(nameGRcheat, cheats)
if (adrList == nil) then
adrList = getAddressList()
end
countObjectHotKeys = addresslist_getCount(adrList)
mainGRScript = "[ENABLE]-->>marker1\n[DISABLE]\n-->>marker2"
local delIndexes = {}
local count_delIndexes = 0
local zisetable = table.getn(cheats)
local description = ""
for i = 1,countObjectHotKeys do
local te = addresslist_getMemoryRecord(adrList, i-1)
description = memoryrecord_getDescription(te)
for j=1,zisetable do
if (cheats[j] == description) then
local script = memoryrecord_getScript(te)
local leftPos = 10 -- длина "[ENABLE]\n" 9 символов и плюс переход +1
local rigthPos = string.find(script, "%[DISABLE%]")
mainGRScript = preSubScript(mainGRScript,"-->>marker1",string.sub(script, leftPos, rigthPos-2))
leftPos = rigthPos + 10 + 1
rigthPos = string.len(script)
mainGRScript = preSubScript(mainGRScript,"-->>marker2",string.sub(script, leftPos, rigthPos))
count_delIndexes = count_delIndexes + 1
delIndexes[count_delIndexes] = te
break
end
end
end

for i = 1,count_delIndexes do
memoryrecord_delete(delIndexes[i])
end

mainGRScript = string.gsub(mainGRScript, "-->>marker1", "")
mainGRScript = string.gsub(mainGRScript, "-->>marker2", "")
SetScriptInEntryCETable(nameGRcheat,mainGRScript)
end


local function CheatAction(indexCheat)
local te = addresslist_getMemoryRecord(adrList, indexCheat-1)
if (memoryrecord_isActive(te)) then
memoryrecord_unfreeze(te)
else
memoryrecord_freeze(te, 0)
end
beep()
end

-- Обработчик хот-кеев
function onHotkey1(hotkey)
CheatAction(1)
end
function onHotkey2(hotkey)
CheatAction(2)
end
function onHotkey3(hotkey)
CheatAction(3)
end
function onHotkey4(hotkey)
CheatAction(4)
end
function onHotkey5(hotkey)
CheatAction(5)
end
function onHotkey6(hotkey)
CheatAction(6)
end
function onHotkey7(hotkey)
CheatAction(7)
end
function onHotkey8(hotkey)
CheatAction(8)
end
function onHotkey9(hotkey)
CheatAction(9)
end

local arrayFunction = {}
arrayFunction[1] = onHotkey1
arrayFunction[2] = onHotkey2
arrayFunction[3] = onHotkey3
arrayFunction[4] = onHotkey4
arrayFunction[5] = onHotkey5
arrayFunction[6] = onHotkey6
arrayFunction[7] = onHotkey7
arrayFunction[8] = onHotkey8
arrayFunction[9] = onHotkey9

-- Создание контролов на форме трейнера
local function CreateControlsForTrainer()
--сделать формирование данных
-- todo: сделать слотов больше 9
if (adrList == nil) then
adrList = getAddressList()
end
countObjectHotKeys = addresslist_getCount(adrList)
if (countObjectHotKeys < 1 or countObjectHotKeys > 9) then
showMessage("В этой реализации программы читов не может быть меньше 1 или больше 9. Трейнер будет закрыт")
FormClose(nil)
return nil
end


for i = 1,countObjectHotKeys do
local te = addresslist_getMemoryRecord(adrList, i-1)
local description = memoryrecord_getDescription(te)
--[[
GenericHotkey Class : (Inheritance: Object)
createHotkey(function, key, ...) : returns an initialized GenericHotkey class object. Maximum of 5 keys
generichotkey_setKeys(hotkey, key, ....)
generichotkey_onHotkey(hotkey, function)
]]--
ObjectHotKeys[i] = createHotkey(arrayFunction[i], VK_CONTROL, VK_0 + i) --string.format("%s",i)
generichotkey_setKeys(ObjectHotKeys[i], VK_CONTROL, VK_0 + i)
generichotkey_onHotkey(ObjectHotKeys[i], arrayFunction[i])

CheatLbl = createLabel(frmUserTrainer)
control_setAlign(CheatLbl, alTop)
local stringHotKey = baseHotKey.."+"..i
control_setCaption(CheatLbl, i..") "..description..": "..stringHotKey)
end
CheatLbl = createLabel(frmUserTrainer)
control_setAlign(CheatLbl, alTop)
control_setCaption(CheatLbl, "Cheats:")

SendMessageFrmTrainer("Трейнер готов к работе")
end

-- Событие открытия процесса
function onOpenProcess(processid)
--print("вызов onOpenProcess")
if (attach) then
return
end
attach = true
--openProcess(processid)
_InitFunction()
CreateControlsForTrainer()
end

-- Главная функция иницилазации
function AAgenINIT(nameTrainer, processName, InitFunction)
-- todo: раскомментировать строку ниже когда все функции будут отлажены
--hideAllCEWindows()
aalist = getAutoAttachList()
stringlist_add(aalist, processName);
CreateFormTrainer(nameTrainer)
_InitFunction = InitFunction
end
-- Функция создаёт скрипт, который выделит память для отдельного чита. Сам скрипт добавиться в главную таблицу

Хочу прокомментировать недостатки.

Это версия не для 64-разрядных приложений,а только для 32-разрядных.

Пока требуется вручную забивать сигнатуру. Я же пользовался CE 5.6 русская версия с нашего сайта для генерации сигнатур из автоаассемблера.

Групп читов можно сделать только 9,а в группах же может быть любое количество читов.

Дизайн трейнера пока хромает.

Возможны какие-то ошибки...

Достоинства:

1) Читы можно объеденять в группы как было показано в примере выше, они все могут активироваться по одной горячей клавише.

2) Вся нудная разметка Автоассемблерного скрипта скрывается от вас.

3) Читы тела которых должны быть в выделенной памяти формируются только в одном участке памяти, а не в нескольких при каждом alloc(название метки, размер памяти)

4) Поиск адреса внедрения по сигнатурам увеличивает шанс работы трейнера с разными патчами игр на 30%-70% чем если бы вы это делали просто по адресам внедрения. Это в какой-то степени избавляет вас от написания трейнеров к новым патчам. Но этот метод внедрения с увеличением шансов работы трейнера ещё далеко не предел... можно повысить и до %60-%80.

5) Горячие клавиши сами выставляются для слотов от 1 до 9. Конечно, это может быть неудобно, но пока останется так.

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

Новая версия модуля TrainerGen.lua: TrainerGen.rar

Позволяет формировать трейнер вида:

post-3-1307856932,13_thumb.png

По примеру разметки формата .CETRAINER:

<?xml version="1.0"?>
<CheatTable CheatEngineTableVersion="11">
<CheatEntries/>
<UserdefinedSymbols/>
<LuaScript>
require("TrainerGen")
function Initialize()
bufScript = BeginGenerateAA("allocMem", "2048")
bufScript = GenerateAAWithSignature(bufScript, "InfHealth1", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth2", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth3", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth4", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth5", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth6", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth7", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth8", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth9", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
EndGenerateAA(bufScript)
end

TrainerShow("F.E.A.R.XP Ttainer +9, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)</LuaScript>
</CheatTable>

Основные пользовательские функции:

1) TrainerShow(nameTrainer, processName, frmWidth, frmHeigth, initFunction)

2)

BeginGenerateAA(newMemDescription, sizeMem)

-----GenerateAA(aggregateMem, cheatName, address, newCode, stateOriginalCode)

-----GenerateAAWithSignature(aggregateMem, cheatName, signature, typeMem, signatureOffset, newCode, stateOriginalCode )

-----AddRegistersymbols(aggregateMem, tableNewSymbols)

EndGenerateAA(aggregateMem)

3)

FillnopsInstruction_AndAddInCETable(cheatName, address)

FillnopsInstructionWithSignature_AndAddInCETable(cheatName, signature, typeMem, signatreOffset)

4) GroupAA(nameGRcheat, tableCheats)

5) Функция для быстрых тестов из консоли LUA:

GenerateAAscriptPageMem_AndAddInCETable( cheatName, address, injectInstruction, originalcode )

-----

Как пользоваться этими функциями пока описывать не буду,т.к. могут быть новые изменения и придётся описания переделывать...

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

Разработки будущего

В этом конкретном примере рассмотрю формирование трейнера для игры Dark Sector.

45 строк против 175 строк, а самое главное более понятнее. АА скрипты для Dark Sector я плохо написал. А вот на LUA гораздо лучше на мой взгляд.

Если читов будет гораздо больше, то эффект будет ещё сильнее.


require("TrainerGen")
function Initialize()
bufScript = BeginGenerateAA("allocMem", "2048")
AllocVariableRegistersymbols({ {"pId", 4}, {"pRES", 4} })

bufScript = GenerateAAWithSignature(bufScript, "getPtrHeroID", "83xxxxxxxxxxxx0fxxxxxxxxxx8dxxxxxxxx8dxxxxxxe8xxxxxxxx80", "+X-C-W", 0, "mov [pId],edx", true)
bufScript = GenerateAAWithSignature(bufScript, "getPtrHeroRes", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [pRES],eax", true)

ExtraCreateCheat("Health", bufScript, "getPtrHeroID",[[
mov [edx+468],#100000
mov [edx+464],#100000
]])

ExtraCreateCheat("Money", bufScript, "getPtrHeroRes",[[
mov eax,[eax]
mov [eax+1d4],#1000000
]])

HideCheats({"getPtrHeroID", "getPtrHeroRes"})

bufScript = GenerateAAWithSignature(bufScript, "MaxAmmo", "8bxxxxxxxxxxxx74xxxxxx8dxxxxxxxxxxbfxxxxxxxx8bxx85xx74xx83xxxx74", "+X-C-W", 0, [[
pushf
push eax
mov eax,[pRES]
or eax,eax
jz short no_MaxAmmo

cmp ecx,[eax]
jne short no_MaxAmmo
mov [ecx+ebp*8+00000394],#99999

no_MaxAmmo:
pop eax
popf
mov ebx,[ecx+ebp*8+394]
]], false)

bufScript = GenerateAAWithSignature(bufScript, "NoReload", "8bxx8bxxxxxxxxxx8dxxxxxxxx8bxxbbxxxxxxxxffxx8bxx8bxxe8xxxxxxxx84xx75xx83", "+X-C-W", 0, [[
mov eax,[eax]
mov byte [eax+3e8],#30
]], true)

EndGenerateAA(bufScript)
end

TrainerShow("Dark Sector Ttainer +4, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)

Так же в более далёком будущем сделать автоматическое исправление регистров и смещений, если в игре с патчем они будут разные. Например, инструкция в которой будет внедрение будет не mov [ecx+ebp*8+00000394],#99999, а mov [ecx+ebp*7+00000344],#99999. В этом случае будет автоматической исправления первой инструкции на вторую.

Можно увидеть новую функцию пока не реализованную


mov [edx+468],#100000
mov [edx+464],#100000
]])
	ExtraCreateCheat("Health", bufScript, "getPtrHeroID",[[

Здесь новый принцип. ExtraCreateCheat добавляет каскад безусловных прыгов в то место кода, где была запись поинтера на структуру. Каскад позволит записывать внутрь структуры данные забив прыг нопами. В примере выше нет каскадов, а всего лишь создаётся по одному прыгу для двух поинтеров. Вот один из них

Вырезка из АА скрипта:


mov [_pId],edx

_cheatHealth:
jmp short _Aoriginalcode
mov [edx+468],#100000
mov [edx+464],#100000
_newmem1: 

--------------

Обновлено...

Всё-таки не пойдут так дела. Смещения от поинтера могут смещаться в играх с новыми патчами. Поэтому надо привязываться к инструкциями работающими со смещениями структуры, а не к инструкциям которые работают с поинтерами. Так что всё что я выше написал не берите в голову. Для игры нужно написать новые "правильные" АА-скрипты. Функция ExtraCreateCheat не потребуется, а остальное всё актуально...


function Initialize()
bufScript = BeginGenerateAA("allocMem", "2048")
AllocVariableRegistersymbols({ {"pId", 4}, {"pRES", 4} })

bufScript = GenerateAAWithSignature(bufScript, "getPtrHeroID", "83xxxxxxxxxxxx0fxxxxxxxxxx8dxxxxxxxx8dxxxxxxe8xxxxxxxx80", "+X-C-W", 0, "mov [pId],edx", true)
bufScript = GenerateAAWithSignature(bufScript, "getPtrHeroRes", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [pRES],eax", true)

-- здесь добваить GenerateAAWithSignature с сравнениями с поинтерами для читов здоровья и возможно денег, если на деньги не будет инструкции типа А

HideCheats({"getPtrHeroID", "getPtrHeroRes"})

bufScript = GenerateAAWithSignature(bufScript, "MaxAmmo", "8bxxxxxxxxxxxx74xxxxxx8dxxxxxxxxxxbfxxxxxxxx8bxx85xx74xx83xxxx74", "+X-C-W", 0, [[
pushf
push eax
mov eax,[pRES]
or eax,eax
jz short no_MaxAmmo

cmp ecx,[eax]
jne short no_MaxAmmo
mov [ecx+ebp*8+00000394],#99999

no_MaxAmmo:
pop eax
popf
mov ebx,[ecx+ebp*8+394]
]], false)

bufScript = GenerateAAWithSignature(bufScript, "NoReload", "8bxx8bxxxxxxxxxx8dxxxxxxxx8bxxbbxxxxxxxxffxx8bxx8bxxe8xxxxxxxx84xx75xx83", "+X-C-W", 0, [[
mov eax,[eax]
mov byte [eax+3e8],#30
]], true)

EndGenerateAA(bufScript)
end

TrainerShow("Dark Sector Ttainer +4, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)
require("TrainerGen")

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

Новая версия модуля TrainerGen.lua (версия 1.1)


-- Create by MasterGH
--[[
На будущее:
0) Добавить запуск игры из трейнера из указанного места
1) Сделать отображение читов перед внедрением серым цветом, после вндрения чёрным с бипом
2) Разобраться со скрытыми и не скрытыми читами в группах
3) Сделать отображение читов в виде дерева на основе дерева из главной таблицы Cheat Engine
Читы с префиксом "(+)" отображаются в дереве без префикса
Рядом с именем корневого элемента дерева должен отображаться хот-кей
Корневых элементов может быть не больше 9

4) Обновление формы во время сканирования
5) Возвратить сигнатуру
6) Интеллектуальное внедрение

8) Корректное использование трейнера, при повторном запуске игры.
9) Поодержка русских слов
10) Поддержка файлов перевода
11) Запоминание адресов внедрения, чтобы проивзодить меньше сканирований сигнатур

Раздел1
1) FillnopsInstruction_AndAddInCETable(cheatName, address)
Функция создаёт запись АА-скрипта в главной таблице CE c названием cheatName.
АА-скрипт будет стерать инструкцию по адресу address при активации. При деактивации код будет восстановлен.

2) FillnopsInstructionWithSignature_AndAddInCETable(cheatName, signature, typeMem, signatreOffset)
Функция создаёт запись АА-скрипта в главной таблице CE c названием cheatName.
Тоже что и FillnopsInstruction_AndAddInCETable только по сигнатуре.
Где signature - сигнатура
typeMem - тип сканируемой памяти
signatreOffset - смещение от сигнатуры в виде числа, которое может положительным и отрицательным.

3) GenerateAAscriptPageMem_AndAddInCETable( cheatName, address, injectInstruction, originalcode )
Функция создаёт запись АА-скрипта в главной таблице CE c названием cheatName.
Функция создаёт АА скрипт в новой странице памяти.
Не рекоммендуется использовать эту функцию. Она создана только для тестов из консоли LUA. Используйте альтернативные функции из Раздела 2:
BeginGenerateAA, GenerateAA, EndGenerateAA

4) CreateThread(CEEntryName, callLabel)
Функция создаёт запись АА-скрипта в главной таблице CE c названием CEEntryName.
Функция создания АА-скрипта для потока с добавлением этого скрипта в главную таблицу
Пригодится в случае создания АА исполнения кода находящегося под известной зарегистрированной меткой/
Рекоммендуется использовать эту функцию в особенных редких случаях. Используйте альтернативную функцию из Раздела 2:
BeginGenerateAA, AddCodeThread, EndGenerateAA

5) SetScriptInEntryCETable(cheatName, script)
Функция создаёт запись АА-скрипта в главной таблице CE c названием cheatName.
Добавление скрипта в главную таблицу как записи таблицы с названием cheatName. Если запись уже существует, то будет перезапись.
Рекоммендуется использовать эту функцию в особенных редких случаях. Используйте функциии из Раздела 2, которые добавляют скрипт в CE.

6) DeleteTableEntryes(tableCEEntryesName)
Удаляет записи из главной таблицы Cheat Engine.
tableCEEntryesName имеет формат вида {"имя","имя", ...}

7) GroupAA(nameGRcheat, tableCheats, stateDeleteTableCheats)
Группировка указанных скриптов tableCheats вида {"имя","имя",..} в новый создаваемые или существующий скрипт с названием nameGRcheat.
Группируемые скрипты будут удалены если stateDeleteTableCheats бует равен true

Раздел2
Используйте функции BeginGenerateAA и EndGenerateAA для формирования и исполнения скрипта. Между этими функциями разрешается выполнять другие функции с передачей aggregateMem и возрватом нового сформированного скрипта.

Пример:
script = BeginGenerateAA(script,...)
// Здесь любые функции из раздела 2 например это
script = GenerateAA(script, ...)
script = GenerateAAWithSignature(script, ...)
EndGenerateAA(script,...)

1) BeginGenerateAA(newMemDescription, sizeMem)
Герация начала формирования разметки

2) EndGenerateAA(aggregateMem)
Конец формирования разметки с исполнением АА-скрипта

3) GenerateAA(aggregateMem, cheatName, address, newCode, stateOriginalCode)
Продолжение формирования разметки.
Добавляет запись с названием cheatName в главную таблицу
В АА скрипте формируются метки originalcode_cheatName, где cheatName название из скрипта

4) GenerateAAWithSignature(aggregateMem, cheatName, signature, typeMem, signatureOffset, newCode, stateOriginalCode )
Продолжение формирования разметки по сигнатуре.
Добавляет запись с названием cheatName в главную таблицу
В АА скрипте формируются метки originalcode_cheatName, где cheatName название из скрипта

5) AddCodeThread(aggregateMem, newRegSymbols, AAcode)
Продолжение формирования разметки.
Добавляет запись с названием cheatName в главную таблицу
Регистрируется метка newRegSymbols и добавляется запись в главную таблицу runThread_newRegSymbols

6) AddRegisterSymbols(aggregateMem, tableNewSymbols)
Продолжение формирования разметки. tableNewSymbols вида {"имя","имя","имя","имя",...}
Регистрация пользовательских символа в формирующуюся разметку между началом и концом её формирования

7) AddAllocVariableRegistersymbols(aggregateMem, tableTableSymbols)
где tableTableSymbols может быть вида { {"pId", 4}, {"pRES", 4}, ... }
Продолжение формирования разметки.
Добавление регистрации пользовательского символа для участка памяти определённого размера в формирующуюся разметку между началом и концом её формирования.

8) AddCode(aggregateMem, newRegSymbols, AAcode)
Продолжение формирования разметки.
Добавление участка кода в скрипте в выделенную память. Участок код регистрируется под меткой newRegSymbols. Новый код AAcode

Локальные функции:
CheatAction(indexCheat)
Trainer_Close(sender)
Trainer_SendMessage(message)
Trainer_FormCreate(nameTrainer)
Trainer_CheatsCreateFromCETable()

onOpenProcess(processid)

ByteScan(signature, typeMem)
GetInfoInjection(address)
PreSubScript(script, patternWord, newWords)

DeleteEntryCETable(cheatName)
]]--

local frmTrainer = nil -- форма автоматически создаваемого трейнера
local frmTrainerWidth = 0
local frmTrainerHeigth = 0
local messageLabel = nil -- строка информации в трейнере

local _InitFunction -- указатель на пользовательскую функцию инициализации читов

local countObjectHotKeys = 0 -- countObjectHotKeys равное также кол-ву записей в главной таблице
local adrList = nil
local baseHotKey = "CTRL"


local function CheatAction(indexCheat)
local te = addresslist_getMemoryRecord(adrList, indexCheat-1)
if (memoryrecord_isActive(te)) then
memoryrecord_unfreeze(te)
else
memoryrecord_freeze(te, 0)
end
beep()
end

function onHotkey1(hotkey) CheatAction(1) end
function onHotkey2(hotkey) CheatAction(2) end
function onHotkey3(hotkey) CheatAction(3) end
function onHotkey4(hotkey) CheatAction(4) end
function onHotkey5(hotkey) CheatAction(5) end
function onHotkey6(hotkey) CheatAction(6) end
function onHotkey7(hotkey) CheatAction(7) end
function onHotkey8(hotkey) CheatAction(8) end
function onHotkey9(hotkey) CheatAction(9) end

local arrayFunction = {}
arrayFunction[1] = onHotkey1
arrayFunction[2] = onHotkey2
arrayFunction[3] = onHotkey3
arrayFunction[4] = onHotkey4
arrayFunction[5] = onHotkey5
arrayFunction[6] = onHotkey6
arrayFunction[7] = onHotkey7
arrayFunction[8] = onHotkey8
arrayFunction[9] = onHotkey9

local function Trainer_Close(sender)
closeCE()
return caFree
end
local function Trainer_SendMessage(message)
control_setCaption(messageLabel, message)
end
local function Trainer_FormCreate(nameTrainer)
frmTrainer = createForm(true)
setProperty(frmTrainer, "BorderStyle", "bsDialog")
control_setSize(frmTrainer, frmTrainerWidth, frmTrainerHeigth)
control_setCaption(frmTrainer, nameTrainer)
form_centerScreen(frmTrainer)
form_onClose(frmTrainer, Trainer_Close)

messageLabel = createLabel(frmTrainer)
control_setAlign(messageLabel, alBottom)
Trainer_SendMessage("Trainer is not ready")
end
local function Trainer_CheatsCreateFromCETable()
if (adrList == nil) then
adrList = getAddressList()
end

countObjectHotKeys = addresslist_getCount(adrList)
if (countObjectHotKeys < 1 or countObjectHotKeys > 9) then
showMessage("Cheats group count can not be less than 1 or greater than 9. Trainer will be closed")
Trainer_Close()
end

local x = 20
local y = 10
local yInc = 14

CheatLbl = createLabel(frmTrainer)
control_setPosition(CheatLbl, x, y)
control_setCaption(CheatLbl, "Cheats:")
x = x + 15

for i = 1,countObjectHotKeys do
local te = addresslist_getMemoryRecord(adrList, i-1)
local description = memoryrecord_getDescription(te)
local ObjectHotKeys = createHotkey(arrayFunction[i], VK_CONTROL, VK_0 + i) --string.format("%s",i)
generichotkey_setKeys(ObjectHotKeys, VK_CONTROL, VK_0 + i)
generichotkey_onHotkey(ObjectHotKeys, arrayFunction[i])

CheatLbl = createLabel(frmTrainer)
control_setPosition(CheatLbl, x, (i + 1) * yInc)
local stringHotKey = baseHotKey.."+"..i
control_setCaption(CheatLbl, i..") "..description..": "..stringHotKey)
end

Trainer_SendMessage("Trainer is ready!")
beep()
end


function onOpenProcess(processid)
_InitFunction()
Trainer_CheatsCreateFromCETable()
end

local function ByteScan(signature, typeMem) -- return address
Trainer_SendMessage("Scaning mode... Play in game and wait bell")
local results = nil
-- if (results == nil) then
-- messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
-- Trainer_Close()
-- end
repeat
results = AOBScan(signature, typeMem) -- typeMem = "+X-C-W" and any
-- form_show(frmTrainer)
sleep(200)
until (results ~= nil)

local address = stringlist_getString(results, 0)
object_destroy(results);
return address
end
local function GetInfoInjection(address) -- return adressReturnHere, originalCodeString, nopsString
local sumBytes = 0
local originalCodeString = " "

repeat
countBytes = getInstructionSize(address)
extrafield, opcode, bytes, address = splitDisassembledString(disassemble(address))
originalCodeString = originalCodeString.."\n "..opcode
sumBytes = sumBytes + countBytes
until (sumBytes >= 5)
adressReturnHere = string.format("%x", ("0x"..address) + countBytes)

local nopsString = ""
local nopsCount = sumBytes - 5
if (nopsCount>0) then
nopsString = " db"
for i = 1, nopsCount do
nopsString = nopsString.." 90"
end
end

return adressReturnHere, originalCodeString, nopsString
end
local function PreSubScript(script, patternWord, newWords) -- return bufferString
local index = string.find(script, patternWord)
local newscript = string.sub(script, 1, index - 1)..newWords.."\n"..string.sub(script, index)
return newscript
end
local function DeleteEntryCETable(cheatName)
local teSlave = getTableEntry(cheatName)
if (teSlave == nil) then
return
end
memoryrecord_delete(teSlave)
end

-- SECTION 1
function FillnopsInstruction_AndAddInCETable(cheatName, address)
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)
local scriptAddMainTable = "[ENABLE]\n-->>address1[DISABLE]\n-->>address2"

local countBytes = getInstructionSize(address)
local nopsString = " db"
for i = 1, countBytes do
nopsString = nopsString.." 90"
end

scriptAddMainTable = PreSubScript(scriptAddMainTable,"-->>address1", address..":\n"..nopsString)
scriptAddMainTable = PreSubScript(scriptAddMainTable,"-->>address2", address..":"..originalCodeString)
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address1", "")
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address2", "")
SetScriptInEntryCETable(cheatName,scriptAddMainTable)
end
function FillnopsInstructionWithSignature_AndAddInCETable(cheatName, signature, typeMem, signatreOffset)
local workAddress = ByteScan(signature, typeMem)
if (signatureOffset ~=0) then
workAddress = string.format("%x", ("0x"..workAddress) + signatureOffset)
end
FillnopsInstruction_AndAddInCETable(cheatName, workAddress)
end
function GenerateAAscriptPageMem_AndAddInCETable( cheatName, address, injectInstruction, originalcode )
local addressInjection = address

local adressReturnHere = 0
local originalCodeString = ""
local nopsString = ""
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)

if (originalcode) then
script =[[
[ENABLE]
alloc(newmem,2048)
label(originalcode)
label(returnhere)

newmem:
]]..injectInstruction..[[

originalcode:]]..originalCodeString.. [[

jmp returnhere

]]..addressInjection..[[:
jmp newmem
]]..nopsString..[[
returnhere:

[DISABLE]
]]..addressInjection..":"..originalCodeString.. [[


dealloc(newmem)
]]
else
script =[[
[ENABLE]
alloc(newmem,2048)
label(returnhere)

newmem:
]]..injectInstruction..[[

jmp returnhere

]]..addressInjection..[[:
jmp newmem
]]..nopsString..[[
returnhere:

[DISABLE]
]]..addressInjection..":"..originalCodeString.. [[


dealloc(newmem)
]]
end
SetScriptInEntryCETable(cheatName, script)
end
function CreateThread(CEEntryName, callLabel)
local bufscript = "%[ENABLE%]\n% createthread("..callLabel..")\n[DISABLE%]"
SetScriptInEntryCETable(CEEntryName, bufscript)
end
function SetScriptInEntryCETable(cheatName, script)
local teSlave = getTableEntry(cheatName)
if (teSlave == nil) then
teSlave = addresslist_createMemoryRecord(addresslist)
memoryrecord_setDescription(teSlave, cheatName)
end
memoryrecord_setType(teSlave, vtAutoAssembler)
memoryrecord_setScript(teSlave, script)
end
function DeleteTableEntryes(tableCEEntryesName)
local sizetable = table.getn(tableCheatsName)
for i=1,sizetable do
DeleteEntryCETable(tableCheatsName[i])
end
end
function GroupAA(nameGRcheat, tableCheats, stateDeleteTableCheats)
if (adrList == nil) then
adrList = getAddressList()
end
countObjectHotKeys = addresslist_getCount(adrList)
mainGRScript = "[ENABLE]-->>marker1\n[DISABLE]\n-->>marker2"
local delIndexes = {}
local count_delIndexes = 0
local zisetable = table.getn(tableCheats)
local description = ""
for i = 1,countObjectHotKeys do
local te = addresslist_getMemoryRecord(adrList, i-1)
description = memoryrecord_getDescription(te)
for j=1,zisetable do
if (tableCheats[j] == description) then
local script = memoryrecord_getScript(te)
local leftPos = 10 -- длина "[ENABLE]\n" 9 символов и плюс переход +1
local rigthPos = string.find(script, "%[DISABLE%]")
mainGRScript = PreSubScript(mainGRScript,"-->>marker1",string.sub(script, leftPos, rigthPos-2))
leftPos = rigthPos + 10 + 1
rigthPos = string.len(script)
mainGRScript = PreSubScript(mainGRScript,"-->>marker2",string.sub(script, leftPos, rigthPos))
count_delIndexes = count_delIndexes + 1
delIndexes[count_delIndexes] = te
break
end
end
end

if (stateDeleteTableCheats) then
for i = 1,count_delIndexes do
memoryrecord_delete(delIndexes[i])
end
end

mainGRScript = string.gsub(mainGRScript, "-->>marker1", "")
mainGRScript = string.gsub(mainGRScript, "-->>marker2", "")
SetScriptInEntryCETable(nameGRcheat,mainGRScript)
end
-- SECTION 2
function BeginGenerateAA(newMemDescription, sizeMem) -- return bufferString
return [[
alloc(]]..newMemDescription..","..sizeMem..[[)
registersymbol(]]..newMemDescription..[[)
->>label]]..newMemDescription..[[:

->>newCode
->>adressessInjected
]]
end
function EndGenerateAA(aggregateMem)
local endScript = string.gsub(aggregateMem, "->>label", "")
endScript = string.gsub(endScript, "->>newCode", "")
endScript = string.gsub(endScript, "->>adressessInjected", "")
autoAssemble(endScript)
end
function GenerateAA(aggregateMem, cheatName, address, newCode, stateOriginalCode) -- return bufferString
local addressInjection = address
local adressReturnHere = 0
local originalCodeString = ""
local nopsString = ""
adressReturnHere, originalCodeString, nopsString = GetInfoInjection(address)

registerSymbol("returnHere_"..cheatName, adressReturnHere)

local script = PreSubScript(aggregateMem,"->>label", "label("..cheatName..")")
script = PreSubScript(script,"->>label", "registersymbol("..cheatName..")")

if (stateOriginalCode) then
script = PreSubScript(script,"->>label", "label(originalcode_"..cheatName..")")
local buf = cheatName..":\n "..newCode.."\noriginalcode_"..cheatName..":"..originalCodeString.."\n jmp returnHere_"..cheatName
script = PreSubScript(script,"->>newCode", buf)
else
script = PreSubScript(script,"->>newCode", cheatName..":\n"..newCode.."\n jmp returnHere_"..cheatName)
end

local scriptAddMainTable = "[ENABLE]\n-->>address1[DISABLE]\n-->>address2"
scriptAddMainTable = PreSubScript(scriptAddMainTable,"-->>address1", addressInjection..":\n jmp "..cheatName.."\n"..nopsString)
scriptAddMainTable = PreSubScript(scriptAddMainTable,"-->>address2", addressInjection..":"..originalCodeString)
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address1", "")
scriptAddMainTable = string.gsub(scriptAddMainTable, "-->>address2", "")
SetScriptInEntryCETable(cheatName,scriptAddMainTable)

return script
end
function GenerateAAWithSignature(aggregateMem, cheatName, signature, typeMem, signatureOffset, newCode, stateOriginalCode ) -- return bufferString
local workAddress = ByteScan(signature, typeMem)
if (signatureOffset ~=0) then
workAddress = string.format("%x", ("0x"..workAddress) + signatureOffset)
end
return GenerateAA(aggregateMem, cheatName, workAddress, newCode, stateOriginalCode)
end
function AddCodeThread(aggregateMem, newRegSymbols, AAcode)
newRegSymbols = "threadAA_"..newRegSymbols
local script = PreSubScript(aggregateMem,"->>label", "label("..newRegSymbols..")")
script = PreSubScript(script,"->>label", "registersymbol("..newRegSymbols..")")
script = PreSubScript(script,"->>newCode", AAcode)

local bufscript = "%[ENABLE%]\n% createthread("..newRegSymbols..")\n[DISABLE%]"
SetScriptInEntryCETable("runThread_"..newRegSymbols, bufscript)

return script
end
function AddRegisterSymbols(aggregateMem, tableNewSymbols) -- return bufferString
local sizetable = table.getn(newSymbols)
for i=1,sizetable do
PreSubScript(aggregateMem,"->>label", "label("..tableNewSymbols[i]..")")
PreSubScript(aggregateMem,"->>label", "registersymbol("..tableNewSymbols[i]..")")
end
return aggregateMem
end
function AddAllocVariableRegistersymbols(aggregateMem, tableTableSymbols) --tableTableSymbols = { {"pId", 4}, {"pRES", 4} } -- return bufferString
local sizetable1 = table.getn(tableTableSymbols)
for i=1,sizetable1 do
local inTable = tableTableSymbols[i]
local sizetable2 = table.getn(inTable)
for j=1,sizetable2 do
local regName = inTable[1]
local sizeRegName = inTable[1]
local template = regName..":\n".."db "
for j=1,sizeRegName do
template = sizeRegName.."00"
end
local name
PreSubScript(script,"->>label", "label("..regName..")")
PreSubScript(script,"->>label", "registersymbol("..regName..")")
script = PreSubScript(script,"->>adressessInjected", template)
end
end
return script
end
function AddCode(aggregateMem, newRegSymbols, AAcode)
local script = PreSubScript(aggregateMem,"->>label", "label("..newRegSymbols..")")
script = PreSubScript(script,"->>label", "registersymbol("..newRegSymbols..")")
script = PreSubScript(script,"->>newCode", AAcode)
end

-- SECTION 3
function TrainerShow(nameTrainer, processName, frmWidth, frmHeigth, initFunction)
frmTrainerWidth = frmWidth
frmTrainerHeigth = frmHeigth
local aalist = getAutoAttachList()
stringlist_add(aalist, processName);
Trainer_FormCreate(nameTrainer)
_InitFunction = initFunction
end

--[[
function Initialize()
bufScript = BeginGenerateAA("allocMem", "2048")
bufScript = GenerateAAWithSignature(bufScript, "InfHealth1", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth2", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth3", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth4", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth5", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth6", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth7", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth8", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
bufScript = GenerateAAWithSignature(bufScript, "InfHealth9", "d9xxxxxxxxxx8bxxe8xxxxxxxx2bxx8bxxxx33xx2bxx83xxxx7dxx8axxxxxx84", "+X-C-W", 0, "mov [ebx+00000758],(float)100", true)
EndGenerateAA(bufScript)
end


TrainerShow("F.E.A.R.XP Ttainer +9, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)]]--
-- Version 1.1

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

Почему я не мог раньше догадаться до такой простой вещи - аттач к процессу сделать по горячей клавише! В этом случае пользователь не увидит, что форма подвисает при AObscan-е.

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

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

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

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