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

CTIGRA

Стажёры
  • Постов

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

  • Посещение

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

  1. Вот что получилось, но не работает...

    что я делаю не так?

    [ENABLE]
    alloc(newmemZ,2048)
    label(returnhereZ)
    label(cheatByteCodeZ)
    label(QWordValueZ)
    label(QWordValue)
    label(cheatZ)
    registersymbol(cheatZ)
    aobscan(aob_scanZ,DD 40 18 DD 5F 18 8B)

    newmemZ:

    newmemZ + 64:
    QWordValueZ:
    dq (double)10000

    QWordValue:
    dq (double)10

    cheatByteCodeZ:

    fld qword ptr [eax+18]
    fstp qword ptr [edi+18]

    push eax
    fld [QWordValueZ]
    fcomp qword ptr [edi+08]
    fnstsw ax
    test ah,0x41
    jne returnhereZ

    fld [QWordValueZ]
    fcomp qword ptr [edi+10]
    fnstsw ax
    test ah,0x41
    jne returnhereZ

    fld qword ptr [QWordValue]
    fstp qword ptr [edi+08]
    fld qword ptr [QWordValue]
    fstp qword ptr [edi+10]

    jmp returnhereZ

    aob_scanZ:
    cheatZ:
    jmp cheatByteCodeZ
    nop

    returnhereZ:
    pop eax

    [DISABLE]
    cheatZ:
    fld qword ptr [eax+18]
    fstp qword ptr [edi+18]

    unregistersymbol(cheatZ)
    dealloc(newmemZ)

  2. спасибо, попробую. Надо только студио скачать будет...

    Ещё 2 вопроса если можно )

    1) По условию будет прыжок, а у нас eax в стеке. Как же достать его из стека? ставить ещё метку или можно сделать это после returnhere?

    2) автоассемблер переходит на метку cheat, потом прыгает на cheatByteCode

    в результате имеем такой код

    cheat:
    jmp cheatByteCode
    nop

    получается что данный код это 6 байт?

    (потому что это 6ть байт

    fld qword ptr [eax+08] // значение
    fstp qword ptr [edi+08] // запись в структуру

    )

    таким образом, мне нужно ещё добавить nop'ов после jmp cheatByteCodeпо формуле (кол-во байт на выполнение условия минус 6)?

    или можно не добавлять nop? просто перезаписать значения в адресах [edi+08] и [edi+10] согласно условию?

    в результате я хочу менять значения в X и Y но при условии что описано выше.

  3. Подскажите пожалуйста как задать вот такое условие при работе с FPU (double)

    Если X<10000 AND Y<10000

    где

    X

    fld qword ptr [eax+08]   // значение
    fstp qword ptr [edi+08] // запись в структуру

    Y

    fld qword ptr [eax+10]
    fstp qword ptr [edi+10]

    пробовал наподобии


    push eax
    fld [ValueX]
    fcom [ValueY]
    fstsw ax
    sahf
    jl Rezult1 -если X<Y
    jnle Rezult2 -если X>Y
    je Rezult3 -если X=Y
    pop eax

    но тут получается только ИЛИ

    к тому же встает вопрос как доставить из стека eax в случае ELSE (когда условие не выполняется)

  4. в общем смысл понятен.

    однако когда я вешаю на fstp qword ptr [edi+18]

    поиск адресов по доступу, получаю кучу мусора, при этом значения нельзя изменить...

    Тоесть с примерно одинаковой координатой Y (тип double) вижу много адресов как своих так и ботов, и не знаю какие правильные (какие нужно сравнивать)

  5. Я правильно понял что идея в том, чтобы поставить бряк "повыше" и начать отладку при этом смотреть значения регистров?

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

  6. А как просматривать регистры в отладчике СЕ?

    я вобще пробовал как написано тут http://forum.gamehac...ока-id-players/ (однако в моем случае у каждого игрока должен быть свой ID тк у кажного свои координаты)

    так же пробовал НОПить команды типа cmp находящиеся выше

  7. Здравствуйте,

    нашел не мало информации по поиску ИД, но все равно что-то не получается.

    Я нашел некий буфер через который проходят координаты всех игроков.

    что-то вроде


    push ebp
    mov ebp,esp
    mov esi,[ebp+0C]
    mov edi,[esi+08]
    mov ebx,[ebp+08]
    mov eax,[ebx+08]
    cmp eax,[edi]
    // ниже XYZ
    fld qword ptr [eax+08]
    fstp qword ptr [edi+08]
    fld qword ptr [eax+10]
    fstp qword ptr [edi+10]
    fld qword ptr [eax+18]
    fstp qword ptr [edi+18]

    Мне нужно отделить координаты ботов и свои. Работаю в CheatEngine

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

    Подскажите пожалуйста алгоритм действий. Потратил уже много времени, интересно разобраться )

  8. Подскажите пожалуйста, как реализовать такую логику на автоассемблере и тренер-генераторе:

    кнопка + = прибавляет опред. число в st(0)

    кнопка - = вычитает

    Проблема в том, что нужно сделать так чтобы скрипт работал "одну итерацию".

    Иначе он будет прибавлять значение с частатой "тиканья" игры.

  9. Действительно работает! Спасибо огромное.

    Правда работает не совсем так - камера игрока сдвигается чуть выше "модели игрока"

    Осталось только разобраться, как работает код и возможно немного скорректировать )

    Я так понимаю DQ преобразует (double)7000 в HEX 8байт

    далее вынимаем из стека st(0) в edi+18 (некий m32real, я так понимаю это что-то вроде sram)

    далее что-то читаем из [esi+0C] в ecx

    далее кладем в стек QWordValue

    и сразу же вынимае это значение в [edi+18]

    тоесть получается некий эквивалент mov [edi+18],[QWordValue] // хз так можно вобще? )

    и я так понимаю в ecx попадает неверное значение? (точнее не производное от фейкового)

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

    Пытаюсь разобраться с масмом.

    Вобщем что хочу получить:

    Трейнер и две кнопки "+" = прибавляет 1000 " - "= вычетает 1000

    соотв. пытался сделать что-то вроде


    QWordValue:
    dq (double)1000

    cheatByteCode:
    fadd qword ptr [QWordValue]
    fstp qword ptr [edi+18]
    mov ecx,[esi+0C]

    но разумеется такое не работает, ибо каждую итерацию прибавляется 1000.

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

    как то отслеживать "отпускание" кнопки в трейнере и по событию сбрасывать этот флаг.

  10. Вобщем, все скомпилилось, спасибо!

    но не работает ) Просто ничего не происходит.

    Я ещё раз нашел нужное значение, сделал скрипт на с помощью автоассамблера, пока без aob

    И все равно, скрипт просто не работает. (включаю его через таблицу заморозкой)



    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    alloc(newmem,2048) //2kb should be enough
    label(returnhere)
    label(originalcode)
    label(exit)

    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here

    originalcode:
    fstp qword ptr [edi+18]
    mov [edi+18],(double)7000.0
    mov ecx,[esi+0C]

    exit:
    jmp returnhere

    01B133C9:
    jmp newmem
    nop
    returnhere:




    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    dealloc(newmem)
    01B133C9:
    fstp qword ptr [edi+18]
    mov ecx,[esi+0C]
    //Alt: db DD 5F 18 8B 4E 0C

  11. Tiger

    Ругался на лейбел, поправил немного скрипт

    Теперь говорит что не может скомпилировать это

    mov qword ptr [edi+18],(double)7000.0

    Хотя у меня норм компилило такое (double)7000.0

    Честно, хз как правильно double в hex переводить.

    У меня вот что получилось 40BB580000000000, но все равно ругается на данную инструкцию

    [ENABLE]

    alloc(newmem,2048)

    label(returnhere)

    label(cheat)

    registersymbol(cheat)

    aobscan(aob_scan,DD 5F 18 8B 4E 0C 8B 73 0C 51 56 B8 D8 D7 F5 08)

    newmem:

    fstp qword ptr [edi+18]

    mov qword ptr [edi+18],(double)7000.0 // or 0x40BB580000000000

    mov ecx,[esi+0C]

    jmp returnhere

    aob_scan:

    cheat:

    jmp newmem

    nop

    returnhere:

    [DISABLE]

    fstp qword ptr [edi+18]

    mov ecx,[esi+0C]

    unregistersymbol(cheat)

    dealloc(newmem)

    //Alt: db DD 5F 18 8B 4E 0C

    Это ты так жизнь героя увиличивал?

    Нет, это координата Z, по сути высота

    Как игра называется?

    это корпоративная игрушка, без названия

    В программированиия я не новичек, но с реверсингом второй день пытаюсь разобраться. АСМ знаю на уровне атмеловских контроллеров )

    Вполне мог что-то напутать.

    Голова уже кипит.

  12. fstp qword ptr [edi+18] - найдено по брей поинту на запись.

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

    [ENABLE]

    //code from here to '[DISABLE]' will be used to enable the cheat

    alloc(newmem,2048) //2kb should be enough

    label(returnhere)

    label(originalcode)

    label(exit)

    aobscan(obs,DD 5F 18 8B 4E 0C 8B 73 0C 51 56 B8 D8 D7 F5 08)

    newmem: //this is allocated memory, you have read,write,execute access

    //place your code here

    mov [edi+18],(double)7000.0

    originalcode:

    fstp qword ptr [edi+18]

    mov ecx,[esi+0C]

    exit:

    jmp returnhere

    obs:

    01B14589:

    jmp newmem

    nop

    returnhere:

    [DISABLE]

    //code from here till the end of the code will be used to disable the cheat

    dealloc(newmem)

    01B14589:

    fstp qword ptr [edi+18]

    mov ecx,[esi+0C]

    //Alt: db DD 5F 18 8B 4E 0C

  13. Здравствуйте,

    Использую CE, нахожу нужное значение тип double.

    Оно в динамической памяти, поэтому пытаюсь найти указатель.

    Пытался использовать search pointer нашел очень много указателей, но все они отсеялись.

    Поставил брейк поинт на запись, вот что он нашел

    704b2960ab6837951ae810eaa50207d5.jpeg

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

    Пытался использовать ReClass - но он не работает с double и показывает что-то непонятное.

    Игра написана на смеси c++ и java

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

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

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