MasterGH Опубликовано 8 июня, 2011 Поделиться Опубликовано 8 июня, 2011 Библиотека ещё не доведена до ума, но кое-что она умеет делать.Для того чтобы создалось это окно и читы работали по горячим клавишам со звуковым сообщением надо написать код 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"} ) endAAgenINIT("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(, @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 = nillocal _InitFunction -- указатель на пользовательскую функцию инициализации читовlocal attach = false -- подключен ли процесс-- Cтрока информации в трейнереlocal function SendMessageFrmTrainer(message) control_setCaption(messageLabel, message)end-- Обработчик закрытия главной формы трейнераlocal function FormClose(sender) closeCE() return caHideend-- Создание неготовой формы трейнера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 = nillocal 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)endlocal 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)endfunction onHotkey2(hotkey) CheatAction(2)endfunction onHotkey3(hotkey) CheatAction(3)endfunction onHotkey4(hotkey) CheatAction(4)endfunction onHotkey5(hotkey) CheatAction(5)endfunction onHotkey6(hotkey) CheatAction(6)endfunction onHotkey7(hotkey) CheatAction(7)endfunction onHotkey8(hotkey) CheatAction(8)endfunction onHotkey9(hotkey) CheatAction(9)endlocal arrayFunction = {}arrayFunction[1] = onHotkey1arrayFunction[2] = onHotkey2arrayFunction[3] = onHotkey3arrayFunction[4] = onHotkey4arrayFunction[5] = onHotkey5arrayFunction[6] = onHotkey6arrayFunction[7] = onHotkey7arrayFunction[8] = onHotkey8arrayFunction[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 = InitFunctionend-- Функция создаёт скрипт, который выделит память для отдельного чита. Сам скрипт добавиться в главную таблицуХочу прокомментировать недостатки.Это версия не для 64-разрядных приложений,а только для 32-разрядных.Пока требуется вручную забивать сигнатуру. Я же пользовался CE 5.6 русская версия с нашего сайта для генерации сигнатур из автоаассемблера.Групп читов можно сделать только 9,а в группах же может быть любое количество читов.Дизайн трейнера пока хромает.Возможны какие-то ошибки...Достоинства:1) Читы можно объеденять в группы как было показано в примере выше, они все могут активироваться по одной горячей клавише.2) Вся нудная разметка Автоассемблерного скрипта скрывается от вас.3) Читы тела которых должны быть в выделенной памяти формируются только в одном участке памяти, а не в нескольких при каждом alloc(название метки, размер памяти)4) Поиск адреса внедрения по сигнатурам увеличивает шанс работы трейнера с разными патчами игр на 30%-70% чем если бы вы это делали просто по адресам внедрения. Это в какой-то степени избавляет вас от написания трейнеров к новым патчам. Но этот метод внедрения с увеличением шансов работы трейнера ещё далеко не предел... можно повысить и до %60-%80.5) Горячие клавиши сами выставляются для слотов от 1 до 9. Конечно, это может быть неудобно, но пока останется так. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 12 июня, 2011 Автор Поделиться Опубликовано 12 июня, 2011 Новая версия модуля TrainerGen.lua: TrainerGen.rarПозволяет формировать трейнер вида:По примеру разметки формата .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)endTrainerShow("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 )-----Как пользоваться этими функциями пока описывать не буду,т.к. могут быть новые изменения и придётся описания переделывать... Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 12 июня, 2011 Автор Поделиться Опубликовано 12 июня, 2011 (изменено) Разработки будущегоВ этом конкретном примере рассмотрю формирование трейнера для игры 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)endTrainerShow("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") Изменено 12 июня, 2011 пользователем MasterGH Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 Новая версия модуля 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 = 0local frmTrainerHeigth = 0local messageLabel = nil -- строка информации в трейнереlocal _InitFunction -- указатель на пользовательскую функцию инициализации читовlocal countObjectHotKeys = 0 -- countObjectHotKeys равное также кол-ву записей в главной таблицеlocal adrList = nillocal 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)endTrainerShow("F.E.A.R.XP Ttainer +9, v1.0, {MasterGH}", "FEARXP.exe", 290, 180, Initialize)]]---- Version 1.1 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 июня, 2011 Автор Поделиться Опубликовано 23 июня, 2011 Почему я не мог раньше догадаться до такой простой вещи - аттач к процессу сделать по горячей клавише! В этом случае пользователь не увидит, что форма подвисает при AObscan-е. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения