• Объявления

    • Garik66

      Пользователям форума   05.11.2017

      Прошу обратить внимание на эту тему (чтобы увидеть ссылку, войдите в объявление - нажмите на заголовок):   
MasterGH

ПРЕДЛОЖЕНИЯ по CE (выше версии 6.0)

18 сообщений в этой теме

Дело имеем с CE выше версии 6.0. Компилятор free pascal, среда разработки Lazarus.

Cheat Engine и "без нас" очень активно делает Dark Byte. Есть люди которые ему помогают. Довольно часто выходят обновления и тестовые варианты в закрытом разделе тестеров: альфы, беты и в конце-концов конечные реализы. Я состою в этом разделе и наблюдаю за ходом развития. Dark Byte прислушивается не ко всем советам и не всех. Не удивительно, что может дойти до того, что некоторым желающим приходится делать свои модификации.

Первая проблема. Совместимость сделанных модификаций с новыми обновлениями. Я советую в этом случае расставить приоритет. Ваша модификация, скорее всего, будет незначительна и проще её встраивать в каждые новые исходники где вручную, где автоматически. Переложите ваши исходники в отдельную папку. Свои модификации можно комментировать вашим именем и короткими комментариями. В этом случае вы сможете удобным образом определить где ваш код, а где не ваш и как ваш код встроить в новые исходники. Отмечайте определённым образом где вы затёрли не ваш код или изменили чужой с добавлением вашего. Также в вашей папке ведите текстовый журнал с описанием путей файлов которые вы изменяли сами с вашими короткими комментариями. Возможно вам будет удобно использовать SVN tortoise для сравнения исходников. Возможно, будет тяжёлая работа по исправлению.

Отдельно хочется затронуть тему про перевод. Теперь будет меньше проблем с переводом, т.к. можно создавать специальный языковой файл с русским языком.

0

Поделиться сообщением


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

Хотелось бы чтоб СЕ 6.1 генирила АА скрипты как СЕ 5.6.1 Ру

А именно сама расчитывала проверочные байты

0

Поделиться сообщением


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

Пока у меня на это нет времени...

Вот что есть для тех кто сможет сделать.

Либо перенести это на Lazarus в текущий проект SVN поговорив с DarkByte-ом, либо переписать это на Lua. Ну либо пользоваться старой русской версией. Пока я не могу заняться этим.

This function finds the address of a given signature bytes that you want to know how to do.

84915865.gif

Bold byte is a signature that can be used. In this example, it will be ...

83 ec xx 8b xx xx xx xx xx xx xx 8b xx 8b xx ff xx xx 8b xx xx xx xx xx 8b...

aobscan(fadd,83ecxx8bxxxxxxxxxxxxxx8bxx8bxxffxxxx8bxxxxxxxxxx8b)

To do this manually, you can use my code to Delphi.

It is necessary to replace the "frmautoinjectunit.pas" in source CE


function inttostr(i:int64):string;
begin
if i=0 then result:='' else result:=sysutils.IntToStr(i);
end;
function getbytes(adr:dword):string;
var i,j,len,count:byte; frwrdaddr:dword; stlist:TstringList; s,s0,s1,intsr:string;
begin
stlist:=TstringList.create;
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(s1,length(s1)-1,1); // Удяляем последнюю пустоту
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;

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;
procedure TfrmAutoInject.Codeinjection1Click(Sender: TObject);

You end up with something like this ...


aobscan(_faddress,d9xxxxxxxxxxxxd9xxd8xxdfxxf6xxxx75xxddxxebxxf6xxxx7axxd8)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)

_newmem:
mov dword ptr [esi+00000ca4],3F800000
_originalcode:
fld dword ptr [esi+00000ca4]
jmp _returnhere

_faddress: // 00ADFCFD = GameDLL_x86.dll+50FCFD
jmp _newmem
nop
_returnhere:

[DISABLE]
aobscan(_faddress,90xxd9xxd8xxdfxxf6xxxx75xxddxxebxxf6xxxx7axxd8)

_faddress-5:
fld dword ptr [esi+00000ca4]

dealloc(_newmem)
[ENABLE] 

______

Ладно. Я посмотрю, что можно сделать самым быстрым способом. Может просто заменю функцию или чуть-чуть подправлю и потом exe-шник выложу.

Изменено пользователем MasterGH
0

Поделиться сообщением


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

Было бы не плохо увидеть конструктор трейнеров, чтобы не копировать даннные из таблиц 6.1 в 5.6

0

Поделиться сообщением


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

Хотелось бы чтоб СЕ 6.1 генирила АА скрипты как СЕ 5.6.1 Ру

А именно сама расчитывала проверочные байты

Вот, на здоровье (cheatengine-x86_64.exe, его надо положить в папку с CE и переименовать чтобы он не заменил старый файл):

cheatengine-x86_64.rar

Генерирует шаблон следующего вида без ручного добавления фрейма "[ENABLE] c [DISABLE]":

[ENABLE]
alloc(newmem,2048)
aobscan(address,E8xxxxxxxx8BxxxxxxxxxxA1xxxxxxxx8Bxx8BxxxxxxxxxxE8xxxxxxxxA1)
label(injectAddress)
registersymbol(injectAddress)
label(originalcode)
label(returnhere)

newmem:

originalcode:
call Test.exe+52B40
jmp returnhere

address: // "Test.exe"+556EF = 0x004556EF
injectAddress:
jmp newmem
returnhere:



[DISABLE]
injectAddress:
call Test.exe+52B40

dealloc(newmem)

Всегда проверяйте сигнатуру. В данном случае "E8xxxxxxxx8BxxxxxxxxxxA1xxxxxxxx8Bxx8BxxxxxxxxxxE8xxxxxxxxA1" в сканере памяти для цепочки байт с типом защиты памяти только executable всегда должен находиться только один зелёный адрес. Если находится больше адресов, то экспериментируя измените сигнатуру...

Было бы не плохо увидеть конструктор трейнеров, чтобы не копировать даннные из таблиц 6.1 в 5.6

Конструктор терйнеров в 6.1 уже есть.

Изменено пользователем MasterGH
Перезалит архив: в скрипт длобавлена строка unregistersymbol(...)
0

Поделиться сообщением


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

Вот, на здоровье (cheatengine-x86_64.exe, его надо положить в папку с CE и переименовать чтобы он не заменил старый файл):

чёт я не догоняю

переименовал вставил

Иии.... чёт ни чё

0

Поделиться сообщением


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

Всё прекрасно работает) Автоассемблер -> Внедрение кода и вуаля, вот они проверочные байт, а заодно и секции [ENABLE][DISABLE], которые раньше необходимо было вставлять самому) удобно... но на рабочесть с конкретными играми пока не проверял...

ЗЫ версия CE стала 6.1 + :) проверь, что плюсик у тебя присутствует, а то может чего не то запускаешь..

0

Поделиться сообщением


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

Да забыл написать следующее. В окне CE будет виден "+", чтобы видеть какое-то отличие.

Файл который я выложил запускается только на 64-разрядной Операционной системе. Для 32-разрядных систем пока не разобрался как скомпилировать...

И ещё очень важно. Пример который я привёл выше, это пример того как делать ненадо. Иначе никакого толку от поиска по сигнатуре не будет. В ваших скриптах вы не должны делать инъекции в которых вы работаете со смещениями от exe файла или dll-ки. Т.е. нельзя делать инъекции в call-ы или писать call-ы в теле инъекциис вызовом на не на ваш код.

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

Код на Lua:

Доавбляем код в таблицу Lua:


local function ByteScan(signature, typeMem) -- return address

local results = nil

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

local address = stringlist_getString(results, 0)
object_destroy(results);
return address
end

-- Адрес address , который ищем в типе памяти "+X-C-W" (с выполнением кода; без данных с копированием-перезаписью; без данных с записью)
local address = ByteScan("E8xxxxxxxx8BxxxxxxxxxxA1xxxxxxxx8Bxx8BxxxxxxxxxxE8xxxxxxxxA1","+X-C-W")

-- Регистрируем чтобы обращаться к адресу из автоассемблерных скриптов
registerSymbol("AddressCodeInjected_Health", address)

-- Тоже самое проделайте с другими адресами внерений, которые ищите по сигнатуре

Пишем скрипты АА как раньше это делали:


[ENABLE]
alloc(newmem,2048)
label(originalcode)
label(returnhere)

newmem:
//пишите код без смещенией от exe или dll
originalcode:
call Test.exe+52B40 //пишите другой код без смещенией от exe или dll
jmp returnhere

AddressCodeInjected_Health: // наш адрес. Мы его не видим, но он уже должен был быть найден
jmp newmem
returnhere:

[DISABLE]
AddressCodeInjected_Health:
call Test.exe+52B40 //пишите другой код без смещенией от exe или dll

dealloc(newmem)

Затем генерируем трейнер в генераторе трейнеров...

Этот способ более быстрый чем aobscan в AA скриптах. Недовольство по поводу сложности выражайте Дарк Байту :) Лично ему подобные финты, которые я сделал не кажутся сложными, потому что он программист.

0

Поделиться сообщением


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

Всё понятно у меня 32 разрядная система

win7 sp1

0

Поделиться сообщением


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

Это если ты его добавил в свой мод (конструктор трейнеров), то у меня ХР 32разр

0

Поделиться сообщением


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

Сканирование сигнатур сделаны. Исполняемые файлы для 32-х и 64-х разрядных версий CE ищите на главном сайте.

0

Поделиться сообщением


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

Всё работает

Спасибо

0

Поделиться сообщением


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

Спасибо MasterGH.

0

Поделиться сообщением


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

Принимаю благодарности от тех кто написал "Спасибо" и от тех кто ещё не успел написать "Спасибо". Больше благодарить не стоит. Далее пишем в теме по существу и, если иначе, то во Флудильню, в личное сообщение или в профиль...

0

Поделиться сообщением


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

Пофиксите уже кто-нибудь баги с сохранением таблиц:

1) Размножение расструктуризованных структур - сделали одну Dissect structure, сохранили таблицу, структура сохранилась. Сохраняем ещё раз, в файл таблицы CE попадает ДВЕ наших структуры, вместо одной. Пересохраняем ещё раз - уже ТРИ структуры в таблице...

2) Слияние двух таблиц в одну. Загружаем одну таблицу, удаляем все записи кнопкой "перечёркнутый круг" (очистить таблицу). Загружаем другую таблицу, сохраняем - ОБА! а та удалённая таблица тоже сохранилась)) но мы же её удалили!!

В последних ревизиях не проверял, может уже пофиксили...

0

Поделиться сообщением


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

>> В последних ревизиях не проверял, может уже пофиксили...

Скорее всего, уже исправили, можешь проверить. Об этом баге я сам писал неоднократно на форуме CE и не только я. Самим фиксить рискованно, т.к. исправления могут не попасть в релиз (по желанию Дарк Байта) и просто будет потрачено время.

0

Поделиться сообщением


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

Хочется обратится к умельцам по пересборке или lua скриптингу - заварганьте аддончик для CE 6.3, чтобы доработать компоновку окна анализа структур, как показано ниже.

di-1I7D0D.jpg

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

Конкретно:

1) новая группа с новой строки

2) полоса прокрутки окна по ширине работала и на панель адресов.

Опционально:

3) в активной зоне окна(непосредственно таблице «Адрес:Значение») фон групп адресов отличался. светло-серый, темно-серый чередуясь.

4) возможность сворачивать столбцы адресов под группировочный крестик, как строки в Excel

5) в пункт меню «настройка структуры» добавить опцию - удалить все структуры, или маркировкой (как в мобильном смс-списке)

0

Поделиться сообщением


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

Пофиксить проблемы создания,запуска трейнера на windows 8

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас