-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные MasterGH
-
-
Дестрибутив CESetupRus5.6
Выкладываю не для бета-тестинга, а просто если кому потребуется. Добавлений не так уж много.
1. Добавлена функция показывающая загруженный игрой и системой файлы (для определения сейв-файлов)
2. Добавлена функция разложения указателей из CE 5.5
3. Переделано меню функций (в главном окне, кнопка Ф)
4. В инсталятре есть лоадер, который сбрасывает настройки (правда немного он не продуман, из-за него запускается каждый раз предложение пройти тренировку, в будущем исправлю)
5. Инсталлируемый файл CheatEngine.exe переименован в другой с пометкой что это русская версия и в нём указана версия.
6. Также вы можете без опасений денисталировать файлы, который были установлены. Ничего не перезаписывается и не удаляется, того что удалять нельзя.
7. Русский туториал, переведённый aliast (ом), за что ему "спасибо" за труд.
Может быть есть ещё какие-то мелкие изменения в CE я мог забыть...
По мере своего желания и свободного времени буду модернизировать CE дальше. Так же жду исходников Дарк-байта...
СКАЧАТЬ -
Самого главного ты не написал... ecx чем является? Это я потому спрашиваю, что на этой инструкции проскакивают множество адресов. Отсюда не понятно, чему должен быть равен ecx
-
В общем я так и не понял как тут координаты работают. Одну координату я так и не нашёл.
Вот прототип скриптов, может кто захочет доработать. А я пока это дело оставляю. Флоат режим работает только в двух плоскостях - вертикальной и какой-то боковой.
[ENABLE]
alloc(_newmem,2048)
label(_coord)
registersymbol(_coord)
label(_fx)
label(_fy)
label(_fz)
registersymbol(_fx)
registersymbol(_fy)
registersymbol(_fz)
label(_procMov)
registersymbol(_procMov)
label(_loop1)
label(_next)
label(_nextflag)
_newmem:
_procMov: // передвижение
pushf
push eax
push ebx
push ecx
lea eax,[_fx]
lea ebx,[_coord]
xor ecx,ecx
_loop1:
cmp byte [eax+ecx],00 // проверяем флаги разрешения
je short _next
lea ebx,[ebx+ecx*4]
cmp byte [eax*ecx],01 // проверяем флаги разрешения
jne short _nextflag
fld1
fld [ebx]
faddp ST(2),ST // прибавляем 1 к координатам
fstp [ebx]
_nextflag:
cmp byte [eax*ecx],02 // проверяем флаги разрешения
jne short _next
fld [ebx]
fld1
fsubp ST(2),ST // отнимаем 1 от координат
fstp [ebx]
_next:
inc ecx // ув. и проверяем счётчик
cmp ecx,3
jne _loop1
mov byte [_fx],0
mov byte [_fy],0
mov byte [_fz],0
pop ecx
pop ebx
pop eax
popf
ret
_newmem+70: // из-за выравнивания по 16 байтам инструкций SSE
_coord: // структура координат
dd (float)0
dd (float)0
dd (float)0
dd (float)1
// флаги разрешения премещения
_fx:
db 0
_fy:
db 0
_fz:
db 0
[DISABLE]
dealloc(_newmem)
unregistersymbol(coord)
unregistersymbol(_procMov)
unregistersymbol(_fx)
unregistersymbol(_fy)
unregistersymbol(_fz)
//Alt: db 0F 28 44 24 10[ENABLE]
aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)
label(Init)
label(_Init)
_newmem:
pushf
push ecx
mov ecx,[metro2033.exe+62A7C0]
lea ecx,[ecx+70]
cmp ecx,esi
jne short _originalcode // др. персонажи?
cmp byte [Init],1 // инициализация была?
jne short _Init
call _procMov
movaps xmm0,[_coord]
_originalcode:
pop ecx
popf
db 66 0F D6 46 30 //movq [esi+30],xmm0
jmp _returnhere
_Init:
push eax
mov eax,[esi+30] // пришлось писать так, т.к. не компилируется movaps [_coord],xmm0,
mov [_coord],eax
mov eax,[esi+34]
mov [_coord+4],eax
mov eax,[esi+38]
mov [_coord+8],eax
mov eax,[esi+3C]
mov [_coord+0C],eax
pop eax
mov byte [Init],1
jmp short _originalcode
Init:
db 0
_faddress: // 00753ECF = metro2033.exe+353ECF
jmp _newmem
_returnhere:
[DISABLE]
aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)
_faddress-5:
db 66 0F D6 46 30 //movq [esi+30],xmm0
dealloc(_newmem)
//Alt: db 66 0F D6 46 30В CE я ввёл три адреса _coord, _coord+4, _coord+8. Ставил на них заморозку с увелечением/уменьшением на 0,1. В итоге двигался в двух плоскостях и мог проходить сквозь стены. В идеале надо управлять этими флагами _fx:
db 0
_fy:
db 0
_fz:
db 0Но я что-то намудрил в цикле
_loop1:
cmp byte [eax+ecx],00 // проверяем флаги разрешения
je short _next
lea ebx,[ebx+ecx*4]
cmp byte [eax*ecx],01 // проверяем флаги разрешения
jne short _nextflag
fld1
fld [ebx]
faddp ST(2),ST // прибавляем 1 к координатам
fstp [ebx]
_nextflag:
cmp byte [eax*ecx],02 // проверяем флаги разрешения
jne short _next
fld [ebx]
fld1
fsubp ST(2),ST // отнимаем 1 от координат
fstp [ebx]
_next:
inc ecx // ув. и проверяем счётчик
cmp ecx,3
jne _loop1До супер прыжка пока не дошёл.
-
Посмотри вот эту инструкцию для координаты Х aobscan(_faddress,f3xxxxxxxxxxxxxxf3xxxxxxxxxxxxxxxx8bxxxxxx8bxxxxxxd9xxxxxxd9xxxx) или metro2033.exe+71CF2 (movq xmm0,[ecx+00000118])
А для чего её смотреть? А то я её найду, а дальше какая цель?
скажу честно, не умею делать опцию телепорта.. ммм... точнее никогда не пытался ее сделать, хоть и примерно представляю как. Все из-за того, что.. а нафига ? Какой в ней смысл ?Есть некоторый смысл, когда играешь в других играх даже с бессмертием - проваливаешься в "яму" и начинай карту заного. Но самое важное, так называемое перемещение по карте чек-поинтов или каких либо ресурсов для выполнения миссии: в ассасине это флажки, в Сталкере - интересные места зон. В GTA 4 (и др. версиях) может быстро пригодиться быть у дома или на некоторых островах телепортируясь по координатам из базы данных координат... Но в общем иногда телепорт может быть полезным.
Я тоже вручную делал какую-то цепочку на здоровье и обнаружил много "обратных" указателей из структур в структуре героя. Т.е. в структуре1 героя есть структура2, в которой есть указатель на структуру1 героя. На структуру2 есть статический указатель. CE скорее всего не учитывает структуры, которые циклически друг на друга указывают. Если ты хочешь посмотреть сколько взаимных указателей в струтуре героя, то в CE 5.5 RUS кликни на "P", найди окно поиска взаимных указателей и введи структуру игрока и смещение его здоровья. Так я нашёл около 10-20 (точно не помню) взаимно ссылающихся структур. Данная "ссылочность друг на друга" очень распространена в объектно-ориентированном программировании.У меня тут вопрос возник по сканеру указателей. Вот в том же Метро 2033 указатель на здоровье со смещением 1E4 находится один единственный, 1 уровня. Вот только этот указатель не совпадает с указателем на патроны и при добавлении в таблицу периодически уходит в неопределённость (начинает указывать на адрес 00000000). Я же без сканера нашёл такую цепочку на здоровье: [[[[metro2033.exe+00611210]+18]+4]+1E4] такая цепочка похожа на цепочку к патронам и в неопределённость не уходит. Т.е. получается сканер указателей не идеален? Он такую цепочку у меня не находит...Короче я остановился на указателях [[metro2033.exe+62A7C0]+1E4] = здоровье. [metro2033.exe+62A7C0]= структура героя. А с патронами я ещё не возился. Сейчас буду возиться с float-режимом по горячим клавишам, суперждампом и внедрением dll - чтобы можно было игрока двигать из внешнего окна, которое создаёт dll (возможно мне это пригодится потом + опыт во внедрении будет, может быть статью потом накатаю с исходниками и комментариями)
-
У меня получилось установка по координатам Новый бесценный опыт - я направил себя в одно место и некоторых людей случайно По какому-то критерию не все направились в одно место.
Получается что я могу переставлять не только себя но и других игроков. Но скрипты пока не доработаны.
Создаю структуру координат
[ENABLE]
alloc(_newmem,2048)
label(_coord)
registersymbol(_coord)
_newmem:
_coord:
dd (float)48.45
dd (float)2.96
dd (float)-3.54
dd (float)1 // чё это за данные я без понятия
[DISABLE]
dealloc(_newmem)
unregistersymbol(coord)
//Alt: db 0F 28 44 24 10Скрипт без фильтра, который переставляет всех (или почти всех) в указанные координаты. Скоро я его изменю.
[ENABLE]
aobscan(_faddress,66xxxxxxxx8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)
alloc(_newmem,2048)
label(_returnhere)
label(_originalcode)
_newmem:
movaps xmm0,[_coord]
_originalcode:
db 66 0F D6 46 30 //"movq [esi+30],xmm0" - не компилировалось, поэтому пришлось писать байтами
jmp _returnhere
_faddress: // 00753ECF = metro2033.exe+353ECF
jmp _newmem
_returnhere:
[DISABLE]
aobscan(_faddress,8bxxxxxxxxxx89xxxx80xxxxxxxxxxxx74xxd9xxxxxxxxxxxxd9xx)
_faddress-5:
db 66 0F D6 46 30 //movq [esi+30],xmm0
dealloc(_newmem)
//Alt: db 66 0F D6 46 30 -
Можно, но как-нибудь потом. Сейчас я отдыхаю от алгоритмов и писанины. Если у тебя есть желание попытаться это сделать,то могу залить исходники последней русской версии.
-
По идеи если установишь координаты дальше стены, то можешь проходить сквозь. Узнав координату Z, ты выйдешь на все остальные: X, Y. И возможно ещё координаты вектора прицела. По ним некоторые умники делают аимботы с раздачей хедшотов в мультиплерных играх.
Там не double, а там 4 float значения, которые можно уместить в 128-ми разрядный регистр XMM Иными словами 4 раза по 32 разряда (по 4 байта)
Должен сказать, что эта игра на мой взгляд гораздо лучше оптимизирована чем большинство других ранее 2009 года. В этой игре очень много инструкций из набора SSE. Уже хочешь не хочешь, а надо учить все тонкости работы со скалярными и векторными инструкциями типа movq [esi+30],xmm0
Пока всё на рабочую Z выйти не могу - экран дёргается, а вместо этого герой должен падать.
От структуры героя по смещению +A0 находится какое-то значение которое связано с Z
-
Проект CheatEngine (CE):
Сайт оригинальной версии:
- 1.
2.CheatEngine SVN(слежение за обновлениями исходников)
3.Перейти на форумСайт старой русской версии CE 5.5 (может быть обновлю):
- 1.
Проект OllyDbg:
- 1.
Проект MemoryHackingSoftware (MHS):
- 1.
2.Перейти на форумПроект Artmoney:
- 1.
Проект GameHacking.com:
1. Перейти на форум- 2
-
Более полные справочники:
[ENG]
64-ia-32-architectures-software-developer-vol-2a-manual.pdf
64-ia-32-architectures-software-developer-vol-2b-manual.pdf
CE ASM Basics 1 (*new)
CE ASM Basics 2 (*new)
CE ASM Basics 3 (*new)
[RU]
Архитектура x86 (*new)
SIMD (MMX, SSE, SSE2, SSE3, SSSE3).
Рассмотрим основные инструкции.
Инструкции можно разделить на три блока
-
* CPU (работа над целыми числами),
* FPU (работа над вещественными),
* SIMD инструкции (работа с массивами чисел).
CPU (окно регистров)
CPU(основные команды):
Скрытый текстMOV
mov рег, рег -записать в левый регистр, значение правого регистра
mov рег,[] -записать в регистр значение памяти
mov [],рег -записать в память значение регистра
Важно. Не забываете указывать размер данных. Байт, 2 байта, 4 байта. Это касается всех инструкций работающих со значением адреса в памяти.
Пример.
mov eax,byte [410000] - занести в eax значение байта
mov eax,word [410000] - занести 2 байта
mov eax,dword [410000] - занести 4 байта
NOP
Эта команда самая знакомая команда. Она стерает код. Это даже и не команда вовсе.
SUB
sub рег,рег -вычесть из левого правый регистр и сохранить в левом
sub рег,размер [] - вычесть из регистра значение адреса памяти и сохранить регистре
sub размер [], рег - вычесть из значения адреса в памяти значение регистра и сохранить в памяти
ADD
Тоже самое что и SUB только сложение.
CMP
cmp рег,рег - сравнить регистры
cmp рег, размер [] -сравнить значение регистра и значение памяти
cmp размер [], рег -сравнить значение регистра и значение памяти
*cmp, обычно, ставят сразу перед прыжком.
сmp будет выскакивать, только если вы ставите бряк на чтение, ведь, здесь только сравнение ))
DEC
dec рег - уменьшить значение регистра на единицу
dec размер [] - вычесть значение регистра из значения в памяти и сохранить в регистре
sub размер [], рег - вычесть значение значения в памяти из регистра и сохранить в регистре
INC
Тоже самое что и DEC только сложение.
LEA
Вы будите встречать редко, это работа с регистрами.
LEA EAX,[EBX+ECX*4+100]
eax=ebx+ecx*4+100
Эта инструкция нужна лишь для того чтобы вычислить смещение .Просто знайте о ней.
PUSH
push число - добавить в стек (времення память) число
push рег - добавить в стек значение регистра
push размер [] - добавить в значение памяти определённого размера
Эту команду геймхакеры часто применяют для того чтобы быстро сохранить какое-то значение регистра, если регистр нужен для расчётов.
POP
Тоже самое что и PUSH только вытаскивание или восстановление. Вытаскивать нужно в обратном порядке.
Положили 1 2 3 4 5. Вытаскиваем 5 4 3 2 1. Будьте внимательны.
push eax
push ebx
add eax,ebx
sub ebx,eax
pop ebx
pop eax
PUSHAD Сохранение в стек регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax.
POPAD Восстановление регистров общего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax
PUSHF Размещение в вершине стека содержимого регистра флагов flags
POPF Восстановление флагов
XOR
Исключающие или
xor al, 01; изменить значение бита 0 регистра al на обратное
IMUL
Целочисленное умножение
mov bx,186
imul eax,bx,8
DIV
Без знаковое деление
• если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;
• если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;
• если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.
mov ax,10234
mov bl,154
div bl ;ah=остаток, al=частное
FPU (окно регистров)
Основные FPU(команды):
Скрытый текстПринцип такой есть 8 регистров ST. Эти регистры как барабан, который можно вращать некоторыми инстукциями. Также можно обратиться к каждомму регистру. Если регистр не указаывается, значит имеете дело с первым ST0 напримере комманды как fld [esi] (тоже самое что fld STO, [esi]).
Существуют инструкции довольно часто встречающиеся:
fld [] - загрузит из памяти в ST0 //fld St1,[] - загрузит в ST1
stp [] - скопирует из STO в память
fstp [] - выгрузит из STO в память
ну и так далее...
SIMD(окно регистров)
Эти регистры встречаются довольно редко и в основном в играх стратегиях, т.е. в играх в которых участвует большое количество объектов (юнитов, зданий, и т.п.)
Про эти регистры вы можете посмотреть здесь, если будет нужно.
- 3
-
* CPU (работа над целыми числами),
-
Конечно есть опыт. Я делал на старой игре Академии Джедаев. Надо найти адрес Z координаты, пока я всё её найти не могу. Предположительно этот адрес должен быть в структуре игрока.
Затем самый простой способ, это в часто обращаемую инструкцию вписывать изменяющийся пользовательский параметр высоты.
А супер прыжок я не делал. Хотя интересно было бы. Ведь тут нужно найти адрес массы героя из его структуры и изменить его. А на него можно выйти через бряк на запись в координату Z. Изменяем массу и получаем прыжок.
-
Ясно, может быть, Дарк Байт исправит.
-
-
А вы попробуйте сделать так называемый "float - режим" или полёта героя, чтобы можно было подняться из ямы по горячим клавишам. Для этого надо искать координаты перемещения, ставить бряки и т.п.
Я тоже игру скачал Попробую сделать этот режим. Но я не могу сделать оконный режим (пока не получилось )
-
У меня нет... Сообщения об ошибках есть?
-
Ты трассировкой вычислял, а я "определением адресов на инструкции" изворачивался
-
Хотел бы вам указать кое-какую особенность на мой взгляд очень важную. Новичкам будет полезно.
Уж так получается, что аппаратный бряк пропускает инструкцию, а бряк на памяти не пропускает. Посмотрим на примере.
Поменяем настройкиИ будет
К примеру аппаратный бряк следующей инструкции от нас скроет значение адреса памяти:
mov eax,[eax] // здесь не известно каким был eax до выполнения инструкции
Если же мы поставим бряк на память, то мы узнаем регистры до выполнения инструкции, т.е. узнаем чему был равен [eax].
Так мы узнаем чему равно начало структуры в такой ситуации
mov eax, [eax+edi*esi+8]
Жаль, что я не обратил внимание на это раньше так много бы времени сэкономил.
-
[sp=Проверка не окончательная][ENABLE]
aobscan(_faddress,f3xxxxxxxxxxxxxx0fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)
alloc(_newmem,2048)
registersymbol(_dead) // как только я инициализирую _dead - игра виснет, даже если я не использую переменную в своей инъекции!
label(_dead)
label(_returnhere)
label(_originalcode)
_newmem:
movss xmm0,[eax+000001e4]
comiss xmm0,[_dead] //с этой строкой игра виснет. И без неё тоже (при попытке объявить переменную _dead)
// comiss xmm0,[agpmeventloggingenabled+3fcff4] //сравнение с нулём - с этой строкой игра не виснет
jna _returnhere //жизни ушли в ноль - отключаем чит
mov [eax+000001e4],(float)1 //если остались живы - восстанавливаем 100% здоровья
_originalcode:
movss xmm0,[eax+000001e4]
jmp _returnhere
_faddress: // 007387BC = AgPmEventLoggingEnabled+1683FC
jmp _newmem
nop
nop
nop
_dead:
dd 0
_returnhere: (! ошибка)
[DISABLE]
aobscan(_faddress,9090900fxxxxxxxxxxxx76xx8bxxxxxxxxxx85xx74xx8bxxe8xxxx)
_faddress-5:
movss xmm0,[eax+000001e4]
dealloc(_newmem)
unregistersymbol(_dead)
//Alt: db F3 0F 10 80 E4 01 00 00[/sp]
Также проследи за флагами возможно надо сохранять флаги pushf до сравнения и восстанавливать после popf
Посмотри в отладке в OllyDbg как выполняется код.
Загляни в справочник по инструкциям (привел некоторые)
[sp=Таблица. Инструкции расширения SSE]Инструкция Описание
Пересылка данных с участием регистров ХММ
MOVAPS Пересылка 128-битных данных между памятью и регистрами ХММ или
между регистрами ХММ. Данные в памяти должны быть выровнены по границе 16-байтного параграфа
MOVUPS Пересылка 128-битных данных между памятью и регистрами ХММ или между регистрами ХММ (без требования выравнивания)
MOVHPS Пересылка 64-битных данных между памятью и старшей половиной регистров ХММ или между регистрами ХММ (младшая половина ХММ не изменяется)
MOVHLPS Пересылка старшей половины источника в младшую половину назначения (старшая половина регистра назначения не меняется)
MOVLHPS Пересылка младшей половины источника в старшую половину назначения (младшая половина регистра назначения не меняется)
MOVLPS Пересылка 64-битных данных между памятью и младшей половиной регистров ХММ или между регистрами ХММ (старшая половина ХММ не изменяется)
MOVMSKPS Сборка старших бит упакованных операндов из регистра ХММ в регистр общего назначения (биты 31, 63, 95 и 127 регистра ХММ попадают в биты О, 1, 2 и 3 регистра-приемника, остальные биты приемника будут нулевыми)
MOVSS Пересылка скалярного операнда (младшие 32 бита) между памятью и регистрами ХММ или между регистрами ХММ
Арифметические инструкции над числами в FP-формате в регистрах ХММ
ADDPS Векторное сложение
SUBPS Векторное вычитание
ADDSS Скалярное сложение
SUBSS Скалярное вычитание
MULPS Векторное умножение
MULSS Скалярное умножение
DIVPS Векторное деление
DIVSS Скалярное деление
SQRTPS Векторное извлечение квадратного корня
SQRTSS Скалярное извлечение квадратного корня
MAXPS Векторное нахождение максимума
MAXSS Скалярное нахождение максимума
MINPS Векторное нахождение минимума
MINSS Скалярное нахождение минимума
Сравнение
CMPPS Векторное сравнение (задается полный набор 12 условий, как в инструкциях условных переходов). В том элементе операнда назначения, для которого условие сравнения выполняется, устанавливаются все единицы (32 бита), где не выполняется - все нули
CMPSS Скалярное сравнение (12 условий), аналогично предыдущему, но только для младших 32 бит
COMISS Скалярное сравнение с установкой бит ZF, PF и CF регистра EFLAGS (биты 0F, SF и AF обнуляются)
UCOMISS Скалярное сравнение, но без генерации исключения в случае NaN (при этом ZF=PF=CF=1)
ситуация несравнимости может возникнуть, если один из операндов является NAN или бесконечностью
Пример работы сравнения, но уже не блоком SSE, а FPU
...
fcomp Number;сравнили ST(0) с Number,
;установили нужные флаги
fstsw [status];выгрузили слово состояния сопра
;в заранее объявленную двухбайтную переменную Status
fwait;выполняем синхронизацию
;пусть сопр отдохнёт
;дальше работает CPU
mov ax, [status];грузим слово состояния в регистр ax
;при этом старший байт слова состояния окажется в ah
sahf;загружаем ah в младший байт регистра eflags
...[/sp]
Терпение и попытка за попыткой и всё получится... Я лично подсказать не могу, потому что чувствую, что нагорожу ошибок.
Насчёт дробовика, думаю справишься скоро.
-
Профессиональный hex-редактор, главным отличием которого от WinHex является наличие С-подобного скриптового языка, заметно упрощающего работу при исследовании файла. Так же радует большое количество встроенных инструментов: калькулятор, подсчет контрольных сумм и т.д.
Часть мануала из справки этой программы:
Introduction to Templates and Scripts
One of the most powerful features of 010 Editor is the ability to run Binary Templates and Scripts. A Binary Template allows a binary file to be understood by parsing the file into a hierarchical structure. Templates have a similar syntax to C/C++ structs but they are run as a program. Every time a variable is declared in the Template, the variable is mapped to a set of bytes in the current file. For example, the following is a simple Template:
struct HEADER {
char type[4];
int version;
int numRecords;
} header;
struct RECORD {
int employeeId;
char name[40];
float salary;
} record[ header.numRecords ];
} file;struct FILE {
The variable type is mapped to the bytes 0 to 3 in the file, version is mapped to the bytes 4 to 7, and numRecords is mapped to the bytes 8 to 11. Any time a variable is accessed, its value is read from the file, and any time the variable is assigned, its value is written to the file. These structures are different from regular C since they can contain control statements such as if, for, or while. Templates are executed in a similar fashion to an interpreter, where each line is executing starting from the top of the file.
A Script file also has a similar syntax to C and can be used to edit variables defined in a Template. For example, the Script:
for( i = 0; i < file.header.numRecords; i++ )
file.record[i].salary *= 2.0;int i;
can be used to double every employee's salary using the Template. Scripts can be used with Templates, or on their own to edit files or interact with the 010 Editor program. Scripts can also be used as macros to simplify repetitive tasks.
Над применением данной программы в gamehackimg-е предлагаю вам задуматься самим, что можно сделать после изучения справки. Хотя я припоминаю, что MHS имеет аналогичные функции по работе с данными на С-подобном языке. И не просто с дампом на харде, а с данными в памяти запущенной игры...
P.S. Программу, если она вам нужна поищите сами...
-
-Создать проект WindowsForms (или дргого типа), сохранив его в некоторую директорию.
-Скомпилировать проект (нажать F9)
-Получиться и запустится exe файл находящийся в директории проекта.
-
SERGANT, странно, у меня на XP нет такого эффекта. Может быть, исправлю, но я обещать не буду, т.к. возится с этим не хочется.
В любом случае, я постараюсь доделать свою фишку, возможно, она заменит эффект, который ты описал. Двойным кликом, можно будет делать безусловные прыжки и восстанавливать изменённую инструкцию обратно, также нопить.
-
Версия игры 1.0; версия трейнера 1.0; +4; дата создания 13.12.2009
Описание:
1) Здоровье
2) Без перезарядки
3) Боеприпасы
4) Деньги
Трейнер:DS_trainer.rar
Дополнительная информация:
S+ означает, что в данном трейнере есть механизм сканирования сигнатур (проверочных байт)
Трейнер создан на модифицированной мной версии CE 5.xx RUS (точно какая не помню)
Есть статья по тому как был сделан этот трейнер.
Инструкция:
1. Запустить трейнер и игру
2. Включить активирующий скрипт (ctrl+0) один раз.
3. Использовать трейнер, нажимая комбинации горячих клавиш.
Недостатки:
1. Изловчиться нажать ctrl+0 только один раз иначе получим сообщение об ошибке. Которое придётся закрыть свернув игру. После этого также можно работать с трейнером.
2. Нет звукового оповещения активации трейнера.
3. Большой размер трейнера.
-
Визуальное раскрытие красиво получилось.
-
Я думаю - "Фиксировать позицию устанавливаемых указателей"
-
**** Про вкладки *****
Вкладками я тоже не пользуюсь. Я пробовал сделать закрытие вкладки по курсору и даже Дарк Байт пробовал (он закомментировал свои исходники), но мы похоже оба "плюнули" на эту возню - вылазят ошибки, которые исправлять запаришься.
За вкладками есть будущие, поэтому я их оставлю. Например, если в трёх вкладках есть скрипты, то пользователь может их одним нажатием кнопки связать с таблицей - в таблицу добавиться одна запись с группой скриптов... Например, создать группу скриптов под названием "Дать все ресурсы", которая содержит 4 скрипта.
Далее, хочу сделать прописывание скриптов в одну выделенную память... Так же хочу продумать как максимально упростить создание скрипта с помощью новых скриптовых команд "scaninject"":
[ENABLE]
scaninject(8Fxx45345345xxxxxx45, jORIGINALCODE, ORIGINALCODE):
mov eax, #100
jORIGINALCODE // с прыжком назад
[DISABLE]
scaninject(8Fxx45345345xxxxxx45):
ORIGINALCODE // просто оригинальный код
Как мы видим, что тут мы избавляем себя от писанины меток. Два вида scaningect перегружены, одна
scaningect("проверочные байты", "оригинальный код с возвратом", "просто оригинальный код"): возвращает найденный адрес внедрения.
Другая scaningect("проверочные байты"):возвращает найденный адрес внедрения.
А вот этот скрипт, автоматически регистрирует глобальную метку
[ENABLE]
scaninject(8Fxx45345345xxxxxx45, jORIGINALCODE, ORIGINALCODE):
[__pID], #100
jORIGINALCODE
__pID:
dd 0
[DISABLE]
scaninject(8Fxx45345345xxxxxx45):
ORIGINALCODE
А если, нужно чтобы она была не зарегистрирована глобально, то добавить префикс "_"
[ENABLE]
scaninject(8Fxx45345345xxxxxx45, jORIGINALCODE, ORIGINALCODE):
[_pID], #100
jORIGINALCODE
_pID:
dd 0
[DISABLE]
scaninject(8Fxx45345345xxxxxx45):
ORIGINALCODE
У меня много идей - много писать.
**** Про чек-боксы*****
А пускай ждут чуда. Итак понятно, что они нужны для тех, кто найдёт им применение (потом добавлю ещё чек-боксы нопящие инструкции).
**** Про задуматься "о двухязыковой версии (рус/инг)" *****
Когда я сделаю TrainerMax, когда я домодернизирую ChatEngine RUS, когда я заполню более менее базу TrainerMax, тогда я займусь английским переводом обеих программ. Я думал над этим, а пока приоритеты другие. Если кто хочет сделать из CE RUS английскую версию, то я не против, выложу исходники с уговором на то, что английская версия с открытыми исходниками может быть опубликована на нашем сайте gamehacklab.ru.
Программирование трейнеров на Delphi
in Высокоуровневое программирование
Опубликовано