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

imaginary

Помогаторы
  • Постов

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

  • Посещение

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

    43

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

  1. 7 часов назад, Senpai сказал:

    ну, если я хочу для gta san andreas

    Конечно есть! Если коротко - берёшь объект - узнаёшь его размер. После - делаешь "луч" как его можно назвать - От объекта двигаешься координатами к игроку по прямому вектору, проверяешь не стоит ли там чего - если стоит (стена например) проверяешь левый угол объекта, потом правый, верх низ, все дела. (Это всё жрёт кучу времени и памяти) и так ты узнаешь только видимость центра объекта и его сторон, (делать больше лучшей это убиться веником). Так же тебе надо проверить находится ли объект в видимости камеры. Если все условия удовлетворены - объект видим, если нет - не видим (или за какой нибудь стеклом и тд). Можно пойти другим путём. Узнать каждые координаты тайлов вокруг персонажа, стены, пол и тд. Их размер и геометрию. После = исходя из этого, опять же по всяким сложным формулам вычисляешь находится ли часть объекта в зоне видимости, лучше проверять по периметру, это тоже будет жрать кучу ресурсов. А и не забывай что у тебя не 1 объект (вероятно) а куча, так что с такими проверками игра станет слайд шоу =).

  2. 6 минут назад, Garik66 сказал:

    ещё как запишется

    Оно может и запишется, но не в байт, а 4 займёт, если большое число то в любом случае в байт не влезет ведь.
    а ещё, в 64 даже инструкции в 4 байта внедряются с пропусками занятыми нопами, куча места тратится зря

     

  3. В данном руководстве описано как использовать xmm регистры, а так же некоторые команды.
     

    Список некоторых команд (напоминалка):
     

    Спойлер

    Регистры
    xmm0
    xmm1
    xmm...
    xmm15
    Выполняют те же функции что и обычные регистры, но могут хранить в разы больше. Могут быть приёмником и источником для команд MMX.

    Команды записи
    movd *,* - записывает 4 байта из переменной в приёмник.
    movq *,* - записывает 8 байт.
    movss *,* - записываем float (4 байта) из переменной в приёмник
    movsd *,* - записывает doble (8 байт) их переменной в приёмник
    Массивные
    movups *,* - записывает 4 элемента массива в том порядке в котором они идут в приёмник
    movaps *,* - записывает выравненные 4 элемента массива
    movhlps *,* - записываем 2 левых элемента из источника в 2 правых приёмника
    movlhps *,* - записываем 2 правых элемента из источника в 2 левых приёмника
    movhps *,* - записывает 2 левых элемента из источника в 2 левых приёмника.
    movlps *,* - то же что и выше но 2 правых элемента.

    Арифметические команды. Любые действия выполняются в следующем порядке - приёмник на источник, запись в приёмник. (приёмник это первая *, источник - вторая *)
    addsd *,* - сложение двух чисел с плавающей запятой, типа doble (8 байт).
    subsd *,* - то же что выше но вычитание.
    mulsd *,* - Умножение.
    divsd *,* - Деление.
    sqrtsd *,* - Корень из doble
    addss *,* - Сложение двух float (4 байта)
    subss *,* - Вычитание float
    mulss *,* - Умножение float
    divss *,* - Деление float
    sqrtss *,* - Корень из float
    Массивные
    addps *,* - складывает 2 массива
    subps *,* - вычитает массив из массива
    divps *,* - делит массив на массив.
    mulps *,* - умножает массив на массив.
    sqrtps *,* - корни из массива

    Команды сравнения
    comiss - сравнение двух float
    comisd - сравнение doble

    Команды преобразования
    cvtsi2ss - преобразовать целое в float
    cvtsi2sd - преобразовать целое в doble
    cvttss2si - преобразовать вещественное в целое с округлением.

     


    О регистрах:
    Регистры в этих дополнениях сопроцессора очень похожи на основные, но в отличии от них могут содержать целых четыре элемента, и даже работать сразу со всеми четырьмя!

    Арифметические операции с регистрами:
    Все функции сложения, вычитания, и другие могут быть совершены только с регистрами.
    Такая инструкция сработает:

    addss xmm0,[MyLabel]

    А такая - нет.

    addss [MyLabel],xmm0

    Потому следует все операции производить после записи регистров.
    Например, если необходимо прибавить что нибудь к переменной можно использовать такой код:

    movss xmm0,[MyLabel] //Записываем в xmm0 наше число
    addss xmm0,[MyAddValue] //Добавляем к нему другое
    movss [MyLabel],xmm0 //Записываем из xmm0 назад в число.

    Так же нужно помнить что регистры это не стек, и потому значения свои сохраняют после записи.

    Как уже было сказано выше, эти регистры могут содержать целых 4 элемента - работа с массивами:
    Массив должен состоять из четырёх элементов, например такой:

    MyMassiv:
    dd (float)2
    dd (float)7
    dd (float)29324.126
    dd (float)8261.3

    Что бы записать этот массив в xmm мы можем использовать следующий код:

    movups xmm0,[MyMassiv]

    После чего получим в xmm0 все четыре числа по порядку.
    Теперь мы можем сделать что нибудь с этим массивом, например умножить его на другой массив. К примеру вот такой:

    MyMassivMul:
    dd (float)1
    dd (float)2
    dd (float)0.5
    dd (float)2

    Умножаем:

    movups xmm0,[MyMassiv] //Загружаем наш массив
    movups xmm1,[MyMassivMul] //Загружаем массив на который умножим
    mulps xmm0,xmm1 //Умножаем
    movups [MyMassiv],xmm0 //Возвращаем в наш массив.

    После выполнения этого кода, массив примет такой вид:
    2; 14; 14662,063; 16522,6.
    Так же можно вычитать, делить, находить корень, складывать, и многое другое.

    • Понравилось 1
    • Плюс 2
  4. 29 минут назад, Redear сказал:

    Что то не работает,

    Всё не работает, например ты пустой адрес записываешь в ebx, после в [00000000](ebx) записываешь edx, и соответственно вылет.
    AOB - когда выбираешь как сделать инъекцию кода, есть выбор AOB. Это инъекция с поиском байт - CE ищет байты и после туда внедряет код.
    Лучше всего тебе пойти посмотреть самые начальные уроки.
    Какое название у игры?

  5. 47 минут назад, Redear сказал:

    они становятся недействительны

    Для этого и существуют скрипты, берёшь какую нибудь инструкцию которая работает с твоим игроком, например с его здоровьем, типа такой
    Пример:

    mov [eax+123],ecx

    На неё делаешь скрипт, в скрипте создаёшь метку, вроде такого:

    Спойлер
    
    [ENABLE] //В этом разделе метку
    label(MyPlayer) //Метку делаем
    registersymbol(MyPlayer) //Регистрируем её
    
    //Всякий код ---
    //Твой код
    mov [MyPlayer],eax //Предположим что ты сделал на mov [eax+123]. //Записываем в метку наш адрес игрока.
    
    //Тут после кода и возвратного прыжка пишем:
    MyPlayer:
    dd 0 //Выделяем памяти под метку, что бы хватило на адрес игрока, обычно 4 байта, если 64 бит то может быть 8.
    
    [DISABLE] //Прямо сразу после
    unregistersymbol(MyPlayer) //Снимаем регистрацию с метки.

     


    Теперь, добавляешь в таблицу MyPlayer (в строку адреса вписываешь).
    В итоге получаешь при активации адрес своего игрока, и наплевать на обновления. (инъекцию AOB делать надо).
    Но учти, что инструкция должна работать только с твоим игроком.

    • Понравилось 1
  6. 24 минуты назад, Redear сказал:

    пустые адреса памяти, в которые можно записывать

    Создай скрипт типа такого:

    Спойлер
    
    [ENABLE]
    alloc(newmem,200) //выделяем память под наш код (newmem)
    registersymbol(newmem) //Регистрируем наш код
    
    [DISABLE]
    dealloc(newmem) //отменяем вылеоение памяти
    unregistersymbol(newmem) //Снимаем регистрацию

     


    Всё, теперь ты можешь писать в newmem всё что хочешь, в пределах выделенного места. То есть например:

    Спойлер
    
    //Пишем в наше место что нибудь
    mov [newmem],1 
    mov [newmem+4],5
    mov byte ptr [newmem+8],1
    mov byte ptr [newmem+9],1 

     


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

    mov [ebp-10],edx //В место edx что то своё


     

    • Плюс 1
  7. 26 минут назад, Redear сказал:

    через veh, игра просто закрывается. в виндовс отладчике такого не было

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

  8. 1 час назад, inturist сказал:

    Тратим стамину и.... ничего

    Ты слишком банально себе это всё представляешь, тк ты искал адрес который (ключевое слово) храниться в другом, совсем не обязательно что там инструкции будут руководствоваться той же логикой что и предыдущие. Попробуй сделать скрипт и уже дальше смотри, если прямо проблема то повесь опять же скрипт на одну из первых инструкций и получай оттуда адрес игрока.

  9. 20 минут назад, inturist сказал:

    все сводится к тому самому ebx, [ebx]

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

    your_code:
    mov [labelw],ebx
    code:
    mov ebx,[ebx]

     

  10. 38 минут назад, inturist сказал:

    обращается к нему независимо от того, делаю ли я в игре хоть что либо.

    Всё правильно, там же есть элементы здоровья и тд? Игре же надо знать сколько и по какому адресу, что бы показать тебе на экран. Так что это то как раз не удивительно. На счёт отладчика, попробуй изменить тип в настройках.

  11. 17 часов назад, inturist сказал:

    вида mov ebx,[ebx]. От моих действий не меняется абсолютно ничего

    Заметь, дебагер показывает только конечный адрес, то есть после выполнения mov ebx,[ebx] он покажет тебе не нужное смещение, а твой же адрес.
    Потому перейди в отладчик - поставь бряк на этот адрес, и как только бряк поймает поток посмотри вправо - там появятся все регистры. Скопируй оттуда ebx, в нём должен быть правильный адрес. Это смещение +0. После можешь убрать бряк и запустить выполнение. Все нужные функции найдёшь в Debug.

  12. FreeCam - свободная камера, подразумевает возможность полёта камеры отдельно от объекта/персонажа и тому подобного, используется в самых разных целях, для обнаружения противников, для создания красивых снимков, для нахождения секретов и тому подобного.

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

    Создание свободной камеры на примере игры "WarThunder":
     

    Спойлер

     


    Видео где показан принцип работы формул: тык

     

    • Понравилось 6
    • Плюс 1
  13. 4 минуты назад, mumut сказал:

    А как понять что сигнатура уникальная ?

    Ставишь тип поиска Array of byte (Массив байт) ставишь "без разницы" в Writable и CopyOnWrite (синие квадратики вместо галочки), ставишь галочку hex у строки поиска, вставляешь массив и ищешь.

    Дам тебе ещё совет как там можно очень просто реализовать бесконечные патроны. Замени в своём скрипте

    ja Borderlands2.exe+A189C2

    На

    jb Borderlands2.exe+A189C2

    Только это еще сделает врагов бессмертными, и тебя ?
     

  14. Только что, mumut сказал:

    То есть я могу попробовать сделать так

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

  15. 8 минут назад, mumut сказал:

    А можешь показать пример

    Например у тебя в коде есть какая нибудь сигнатура допустим (случайные числа) 23 7B 26 22, CE ищет эту сигнатуру. У тебя есть ещё один скрипт, он при поиске
    использует её же. Первый скрипт изменяет сигнатуру своим jmp *название метки*. Например он меняет первые 2 байта. (23 7B). Тебе надо найти вторые 2 байта и туда поставить скрипт, но первые байты изменены. Вместо этих байтов ставишь ** ** 26 22. Но так сигнатура может потерять свою уникальность, потому смотришь что есть выше в отладчике - например A5. Добавляешь A5 ** ** 26 22. Проверяешь поиском - уникально - используешь. Но вообще не стоит делать 2 скрипта которые работают в одном месте, сделай всё в одном скрипте. И к тому же, у тебя один скрипт может перезаписывать кусок jmp от другого, скорее всего будет просто вылет программы.

  16. Найти сигнатуру для поиска вручную, байты которые изменяются можешь обозначить ? или *, тогда CE будет принимать любые байты там, но при этом ты должен
    сохранить уникальность сигнатуры.

  17. В видео показано как сделать моментальную башню у танка, а так же что еще можно сделать моментальным.

    Скрипт на башню (64 бит):

     

    Спойлер
    
    [ENABLE]
    aobscanmodule(BashnyaForcer,aces.exe,F3 0F 10 43 38 E8)
    alloc(newmem,$124,"aces.exe"+175FFE)
    
    label(code)
    label(return)
    
    newmem:
    cmp [rbx+38],0
    je code
    
    push eax
    mov eax,[rbx+60]
    mov [rbx+38],eax
    mov eax,[rbx+64]
    mov [rbx+3C],eax
    pop eax
    
    code:
      movss xmm0,[rbx+38]
      jmp return
    
    BashnyaForcer:
      jmp newmem
    return:
    registersymbol(BashnyaForcer)
    
    [DISABLE]
    BashnyaForcer:
      db F3 0F 10 43 38
    
    unregistersymbol(BashnyaForcer)
    dealloc(newmem)

     

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


    Видео:
     

    Спойлер

     

     

    • Плюс 3
  18. В этом руководстве показан принцип работы стека FPU и обращение с ним, рассмотрены команды загрузки, записи, проверки, и другие.


    Первая часть:
     

    Спойлер

     


    Вторая часть:
     

    Спойлер

     

     

    SoCommands.txt

    • Понравилось 1
    • Плюс 3
  19. *Длинное видео к тому же содержит кучу моих ошибок, советую посмотреть полностью, (если будете сразу что то делать) , возможно такой опыт вам пригодится ?

    В этом видео показано как сделать сбор предметов с области (на сервере тоже) область регулируется (квадрат).


    Скрипт (поиск персонажа):

     

    Спойлер
    
    [ENABLE]
    alloc(newmem,100)
    label(returnhere)
    label(originalcode)
    label(exit)
    
    label(PlayerAddr)
    registersymbol(PlayerAddr)
    
    newmem:
    mov [PlayerAddr],edx
    
    originalcode:
    fild dword ptr [edx+00000340]
    
    exit:
    jmp returnhere
    
    PlayerAddr:
    db 0
    
    Terraria.Main::DrawInterface_Resources_Life+510:
    jmp newmem
    nop
    returnhere:
    
     
     
    [DISABLE]
    unregistersymbol(PlayerAddr)
    dealloc(newmem)
    Terraria.Main::DrawInterface_Resources_Life+510:
    fild dword ptr [edx+00000340]

     


     

    Скрипт (сбор) с пояснениями:
     

    Спойлер
    
    [ENABLE]
    alloc(newmem,600)
    label(returnhere)
    label(originalcode)
    label(exit)
    
    label(GrabSize)
    registersymbol(GrabSize)
    label(Control)
    registersymbol(Control)
    
    newmem:
    cmp byte ptr [Control],1 //Если не включено не делать ничего
    jne originalcode
    //Тут сделаем сразу преобразование координат
    fld dword [eax] //Берем координаты предмета.
    fistp dword [GrabSize+8]
    
    push ecx //Теперь нужно
    push ebx
    mov ecx,[PlayerAddr] //Адрес игрока в ecx, нам нужны его координаты! =)
    fld dword [ecx+20]
    fistp dword [GrabSize+C] //переводим в 4 байта
    mov ebx,[GrabSize+C]
    add ebx,[GrabSize] //Размер зоны поиска(проверяем в право)
    cmp [GrabSize+8],ebx
    jg noGrab //Если больше чем зона которую мы задаем вправо, то не собирать.
    mov ebx,[GrabSize+C]
    sub ebx,[GrabSize] //Размер зоны поиска проверяем влево.
    cmp [GrabSize+8],ebx //Если меньше зоны то не собирать.
    jl noGrab
    
    fld dword [ecx+20] //Заносим в стек Х координаты игрока
    fstp dword [eax] //Записываем в координаты предмета.
    
    fld dword [eax+4] //Берем координаты предмета Y.
    fistp dword [GrabSize+8]
    
    fld dword [ecx+24] //Берем координаты игрока по Y
    fistp dword [GrabSize+C] //переводим в 4 байта
    mov ebx,[GrabSize+C]
    add ebx [GrabSize+4] //Это вниз, чем ниже тем больше число
    cmp [GrabSize+8],ebx //Ниже чем зона то не трогать.
    jg noGrab
    mov ebx,[GrabSize+C]
    sub ebx [GrabSize+4] //Это вверх.
    cmp [GrabSize+8],ebx //Выше чем зона то не трогать.
    jl noGrab
    
    fld dword [ecx+24] //Заносим в стек Y координаты игрока
    fstp dword [eax+4] //Записываем в координаты предмета.
    
    mov byte ptr [eax+101],1
    
    noGrab:
    pop ebx
    pop ecx
    
    originalcode:
    fld dword ptr [eax]
    mov eax,[ebp-000004E4]
    
    exit:
    jmp returnhere
    
    Control:
    db 0
    
    GrabSize:
    db 0 0  0 0 //Это будет промежуточное значение
    
    
    Terraria.Main::DrawItem+50:
    jmp newmem
    nop
    nop
    nop
    returnhere:
     
    [DISABLE]
    unregistersymbol(Control)
    unregistersymbol(GrabSize)
    dealloc(newmem)
    Terraria.Main::DrawItem+50:
    fld dword ptr [eax]
    mov eax,[ebp-000004E4]

     

     

    Видео (2 часа):
     

    Спойлер

     

     

    • Понравилось 1
    • Плюс 1
×
×
  • Создать...

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

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