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

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Сообщения, опубликованные MasterGH

  1. :D Как у тебя так получилось, может ты не так создал проект?! Может ты по какому-то примеру делал, можешь указать? Поищи в интернете простой пример создания приложения на Дельфи. Я думаю тогда вопросы будут решены...
  2. Дестрибутив CESetupRus5.6

    Выкладываю не для бета-тестинга, а просто если кому потребуется. Добавлений не так уж много.

    1. Добавлена функция показывающая загруженный игрой и системой файлы (для определения сейв-файлов)

    2. Добавлена функция разложения указателей из CE 5.5

    3. Переделано меню функций (в главном окне, кнопка Ф)

    4. В инсталятре есть лоадер, который сбрасывает настройки (правда немного он не продуман, из-за него запускается каждый раз предложение пройти тренировку, в будущем исправлю)

    5. Инсталлируемый файл CheatEngine.exe переименован в другой с пометкой что это русская версия и в нём указана версия.

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

    7. Русский туториал, переведённый aliast (ом), за что ему "спасибо" за труд.

    Может быть есть ещё какие-то мелкие изменения в CE я мог забыть...

    По мере своего желания и свободного времени буду модернизировать CE дальше. Так же жду исходников Дарк-байта...

    СКАЧАТЬ
  3. В общем я так и не понял как тут координаты работают. Одну координату я так и не нашёл.

    Вот прототип скриптов, может кто захочет доработать. А я пока это дело оставляю. Флоат режим работает только в двух плоскостях - вертикальной и какой-то боковой.

    [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

    До супер прыжка пока не дошёл.

  4. Посмотри вот эту инструкцию для координаты Х aobscan(_faddress,f3xxxxxxxxxxxxxxf3xxxxxxxxxxxxxxxx8bxxxxxx8bxxxxxxd9xxxxxxd9xxxx) или metro2033.exe+71CF2 (movq xmm0,[ecx+00000118])

    А для чего её смотреть? А то я её найду, а дальше какая цель?

    скажу честно, не умею делать опцию телепорта.. ммм... точнее никогда не пытался ее сделать, хоть и примерно представляю как. Все из-за того, что.. а нафига ? Какой в ней смысл ?

    Есть некоторый смысл, когда играешь в других играх даже с бессмертием - проваливаешься в "яму" и начинай карту заного. Но самое важное, так называемое перемещение по карте чек-поинтов или каких либо ресурсов для выполнения миссии: в ассасине это флажки, в Сталкере - интересные места зон. В GTA 4 (и др. версиях) может быстро пригодиться быть у дома или на некоторых островах телепортируясь по координатам из базы данных координат... Но в общем иногда телепорт может быть полезным.

    У меня тут вопрос возник по сканеру указателей. Вот в том же Метро 2033 указатель на здоровье со смещением 1E4 находится один единственный, 1 уровня. Вот только этот указатель не совпадает с указателем на патроны и при добавлении в таблицу периодически уходит в неопределённость (начинает указывать на адрес 00000000). Я же без сканера нашёл такую цепочку на здоровье: [[[[metro2033.exe+00611210]+18]+4]+1E4] такая цепочка похожа на цепочку к патронам и в неопределённость не уходит. Т.е. получается сканер указателей не идеален? Он такую цепочку у меня не находит...
    Я тоже вручную делал какую-то цепочку на здоровье и обнаружил много "обратных" указателей из структур в структуре героя. Т.е. в структуре1 героя есть структура2, в которой есть указатель на структуру1 героя. На структуру2 есть статический указатель. CE скорее всего не учитывает структуры, которые циклически друг на друга указывают. Если ты хочешь посмотреть сколько взаимных указателей в струтуре героя, то в CE 5.5 RUS кликни на "P", найди окно поиска взаимных указателей и введи структуру игрока и смещение его здоровья. Так я нашёл около 10-20 (точно не помню) взаимно ссылающихся структур. Данная "ссылочность друг на друга" очень распространена в объектно-ориентированном программировании.

    Короче я остановился на указателях [[metro2033.exe+62A7C0]+1E4] = здоровье. [metro2033.exe+62A7C0]= структура героя. А с патронами я ещё не возился. Сейчас буду возиться с float-режимом по горячим клавишам, суперждампом и внедрением dll - чтобы можно было игрока двигать из внешнего окна, которое создаёт dll (возможно мне это пригодится потом + опыт во внедрении будет, может быть статью потом накатаю с исходниками и комментариями)

  5. У меня получилось установка по координатам :D Новый бесценный опыт - я направил себя в одно место и некоторых людей случайно :D По какому-то критерию не все направились в одно место.

    Получается что я могу переставлять не только себя но и других игроков. Но скрипты пока не доработаны.

    Создаю структуру координат

    [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

  6. По идеи если установишь координаты дальше стены, то можешь проходить сквозь. Узнав координату Z, ты выйдешь на все остальные: X, Y. И возможно ещё координаты вектора прицела. По ним некоторые умники делают аимботы с раздачей хедшотов в мультиплерных играх.

    Там не double, а там 4 float значения, которые можно уместить в 128-ми разрядный регистр XMM Иными словами 4 раза по 32 разряда (по 4 байта)

    Должен сказать, что эта игра на мой взгляд гораздо лучше оптимизирована чем большинство других ранее 2009 года. В этой игре очень много инструкций из набора SSE. Уже хочешь не хочешь, а надо учить все тонкости работы со скалярными и векторными инструкциями типа movq [esi+30],xmm0

    Пока всё на рабочую Z выйти не могу - экран дёргается, а вместо этого герой должен падать.

    От структуры героя по смещению +A0 находится какое-то значение которое связано с Z

  7. Более полные справочники:

     

    [ENG]

    64-ia-32-architectures-software-developer-vol-2a-manual.pdf

    64-ia-32-architectures-software-developer-vol-2b-manual.pdf

    Instruction_Set_Reference.pdf

     

    CE ASM Basics 1 (*new)

    CE ASM Basics 2 (*new)

    CE ASM Basics 3 (*new)

     

    [RU]

    Архитектура x86 (*new)

    CPU

    FPU

    SIMD (MMX, SSE, SSE2, SSE3, SSSE3).

    Рассмотрим основные инструкции.

      

    Инструкции можно разделить на три блока  

     

    • * CPU (работа над целыми числами),   
      * FPU (работа над вещественными),
      * SIMD инструкции (работа с массивами чисел).

     

    CPU (окно регистров)

    post-3-1281083650,91_thumb.png

    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 (окно регистров)

    post-3-1281083698,37_thumb.png

    Основные FPU(команды):

        

    Скрытый текст

    Принцип такой есть 8 регистров ST. Эти регистры как барабан, который можно вращать некоторыми инстукциями. Также можно обратиться к каждомму регистру. Если регистр не указаывается, значит имеете дело с первым ST0 напримере комманды как fld [esi] (тоже самое что fld STO, [esi]).

        

        Существуют инструкции довольно часто встречающиеся:

        fld [] - загрузит из памяти в ST0 //fld St1,[] - загрузит в ST1

        stp [] - скопирует из  STO в память

        fstp [] - выгрузит из  STO в память

        ну и так далее...

        

     

    SIMD(окно регистров)

     

    post-3-1281083764,42_thumb.png

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

        Про эти регистры вы можете посмотреть здесь, если будет нужно.

    • Плюс 3
  8. Конечно есть опыт. Я делал на старой игре Академии Джедаев. Надо найти адрес Z координаты, пока я всё её найти не могу. Предположительно этот адрес должен быть в структуре игрока.

    Затем самый простой способ, это в часто обращаемую инструкцию вписывать изменяющийся пользовательский параметр высоты.

    А супер прыжок я не делал. Хотя интересно было бы. Ведь тут нужно найти адрес массы героя из его структуры и изменить его. А на него можно выйти через бряк на запись в координату Z. Изменяем массу и получаем прыжок.

  9. А вы попробуйте сделать так называемый "float - режим" или полёта героя, чтобы можно было подняться из ямы по горячим клавишам. Для этого надо искать координаты перемещения, ставить бряки и т.п.

    Я тоже игру скачал :-P Попробую сделать этот режим. Но я не могу сделать оконный режим (пока не получилось :-[ )

  10. Хотел бы вам указать кое-какую особенность на мой взгляд очень важную. Новичкам будет полезно.

    Уж так получается, что аппаратный бряк пропускает инструкцию, а бряк на памяти не пропускает. Посмотрим на примере.

    post-3-0-56055500-1433676394_thumb.png

    Поменяем настройки
    post-3-0-43410100-1433676418_thumb.png

     

    И будет
    post-3-0-76444900-1433676436_thumb.png

    К примеру аппаратный бряк следующей инструкции от нас скроет значение адреса памяти:
     

    mov eax,[eax] // здесь не известно каким был eax до выполнения инструкции

    Если же мы поставим бряк на память, то мы узнаем регистры до выполнения инструкции, т.е. узнаем чему был равен [eax].

    Так мы узнаем чему равно начало структуры в такой ситуации
     

    mov eax, [eax+edi*esi+8]

    Жаль, что я не обратил внимание на это раньше так много бы времени сэкономил.

     

  11. [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]

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

    Насчёт дробовика, думаю справишься скоро.

  12. hexred.th.png

    Профессиональный 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. Программу, если она вам нужна поищите сами...

  13. SERGANT, странно, у меня на XP нет такого эффекта. Может быть, исправлю, но я обещать не буду, т.к. возится с этим не хочется.

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

  14. Версия игры 1.0; версия трейнера 1.0; +4; дата создания 13.12.2009

    post-3-1295711185,06_thumb.jpg

    Описание:

    1) Здоровье

    2) Без перезарядки

    3) Боеприпасы

    4) Деньги

    Трейнер:DS_trainer.rar

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

    S+ означает, что в данном трейнере есть механизм сканирования сигнатур (проверочных байт)

    Трейнер создан на модифицированной мной версии CE 5.xx RUS (точно какая не помню)

    Есть статья по тому как был сделан этот трейнер.

    Инструкция:

    1. Запустить трейнер и игру

    2. Включить активирующий скрипт (ctrl+0) один раз.

    3. Использовать трейнер, нажимая комбинации горячих клавиш.

    Недостатки:

    1. Изловчиться нажать ctrl+0 только один раз иначе получим сообщение об ошибке. Которое придётся закрыть свернув игру. После этого также можно работать с трейнером.

    2. Нет звукового оповещения активации трейнера.

    3. Большой размер трейнера.

  15. **** Про вкладки *****

    Вкладками я тоже не пользуюсь. Я пробовал сделать закрытие вкладки по курсору и даже Дарк Байт пробовал (он закомментировал свои исходники), но мы похоже оба "плюнули" на эту возню - вылазят ошибки, которые исправлять запаришься.

    За вкладками есть будущие, поэтому я их оставлю. Например, если в трёх вкладках есть скрипты, то пользователь может их одним нажатием кнопки связать с таблицей - в таблицу добавиться одна запись с группой скриптов... Например, создать группу скриптов под названием "Дать все ресурсы", которая содержит 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.

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

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

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