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

X86Jumps

Пользователи+
  • Постов

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

  • Посещение

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

    2

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

  1. так надо конкретно какую то игру определить или как типа injector чтоб определил и делал потом hook для разных интерфейсов?

    если второе, то вариант с getmodulehandle в библиотеке не самый плохой

    просто без конкретики как то не очень ясно что нужно))

    например в cheat engine хук d3d делает так: он грузит последовательно d3d11 d3d10 d3d9 библиотеки и создает интерфейсы на болванке созданного окна

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

    а какие не были, получается создаст лишний раз (loadlibrary используется)

    тогда как  getmodulehandle  только вернет handle на существующий модуль. Конечно в игре может быть сразу 2 3 рендерера как в каком-нибудь STALKER

    но это не часто, или как в ue4 где несколько вариантов рендерера (rhi), но он только 1 раз создается, т.е. как в сталкер не меняется рендерер

     

    partoftheworlD ну видеокарта может и d3d12 поддерживать)) а игра tomb raider II будет использовать DirectDevice7))

  2. вариантов не много

    просто тупо запустить игру и через cheat engine посмотреть

    dissect code, посмотреть что используется

    D3D11CreateDevice или Direct3DCreate9

    можно и без dissect, просто в search code написать одну из этих функций или goto перейти на нее и поставить breakpoint

     

    вариант когда через GetModuleHandle тоже подходит, d3d9.dll,d3d11.dll, если один из вариантов возвратит не ноль, значит то и используется

  3. речь идет про direct3d? а то в directx еще другие вещи входят)

    в одной игре может использоваться более 1 библиотеки d3d, хотя такое не часто конечно

    в сталкере последнем вроде было d3d8 d3d9 d3d10 d3d11)

    можно попробовать проверить через GetModuleHandle последовательно библиотеки  d3d

  4. 19 часов назад, MasterGH сказал:

    А что с ним не так было?

    Работает фильтр на конечное условие и на поиск этого условия. На начальное условие не см

    в окне трейса поиск по условиям не пашет, ну по крайне мере в 6.7 так, в 6.5 работало))

  5. 2 часа назад, temtriss сказал:

    У меня так же было)) Для устранения #include <array>

    ошибка правильно выходила, эта не баг

    выше я описал причину. Без #include <array> я бы даже не смог использовать этот контейнер из stl (хотя он еще в tr)

  6. проще было бы использовать тогда уже vector а не array

    а облачать еще в скобки нужно потому что это уже не просто данные массива

    упрощенно array это template<class Ty, size_t Size> struct {Ty[Size] data;}

    а подобные простые классы или структуры (или union) можно инициализировать упрощенно

    у меня уже тут ошибку дает

    std::vector<std::array<int, 2>> data2 = { { 1, 2 } };

    а вот так не дает

    std::vector<std::vector<int>> data = { { 1, 1 } };

    можно присваивать, как ты присвоил a

    с vector of array не пашет упрощение, потому что список инициализации для

    вот тут про это говорится

    https://stackoverflow.com/questions/6041459/c-vector-of-arrays

    из-за того что это уже не просто array, а vector<array> правило для упрощения инициализации не работает

    можно еще тут прочесть (не сказать что я все уяснил)) )

    http://ru.cppreference.com/w/cpp/container/array

    http://ru.cppreference.com/w/cpp/container/vector

    http://ru.cppreference.com/w/cpp/language/aggregate_initialization

    http://ru.cppreference.com/w/cpp/language/list_initialization

    (хотя кажется лучше en версию читать)) )

     

    чтобы понять как он хранится в памяти проще в ide дебаг запустить и посомтреть locals

    (у vector есть allocator,allocator_vals,first,last)

    • Понравилось 2
    • Плюс 2
  7. строки нельзя сравнивать через cmp

    это будет сравнение как чисел,  разве что указатель на него сравнивать (если это const строка)

    а так строки сравнивают через cmps-инструкции или другие

    (хотя не знаю зачем сроки сравнивать для чита)) чаще работаем с указателями или некими перечислениями)

    • Понравилось 1
  8. В видео про спавн врагов в ре6, во второй его части пользователь спросил: могу ли я сделать подобное для ре4, версия 1.1

    Еще в феврале в 10-х числах начал искать. Как-то несколько дней что-то проверял, потом нашел зацепку, потом затянулось и только в марте снова взялся.

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

     

    Версия игры 1.1., это не Ultra HD Remaster или как он там в стим называется, но кажется  в нем все так же работает, разве что указатели в других местах.

    Сделал пробный скрипт спавна врагов. Спавнит в упрощенном варианте, рядом с игроком.

    Если на уровне не предусмотрены враги, то возможен вылет при попытке спавна (возможно файл не загружен в памяти, а при создании объекта не проверяется, что не загружен).

     

    Как обычно работает на Tab. Сначала инициализирует массив со всеми структурами npc/enemy, прописано изначально только на врагов (0x12). При смене уровня обновляет массив заново.

    Можно убрать инициализацию цикла и создавать, заполняя данные вручную.

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

     

    видео

     

    Скрипт

    Спойлер

     

    
    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    alloc(newmem,2048)
    alloc(enemies,2048)
    label(returnhere)
    label(originalcode)
    label(exit)
    label(skip)
    label(tick)
    label(data)
    label(loop)
    //label(initdata)
    label(exitloop)
    registerSymbol(data)
    registerSymbol(enemies)
    newmem: //this is allocated memory, you have read,write,execute access
    //place your code here
    
    test eax, eax
    je originalcode
    
    pushad
    pushf
    
    //cmp [enemies], 0
    //jne exitloop
    mov ecx, [033F6EC4+8] //current object count on level
    mov edi, [leveldata]
    cmp ecx, edi
    je exitloop
    mov [enemies], 0
    xor ebp,ebp
    mov edi,[00A3A280]
    mov ecx, [033F6EC4+8]
    mov [leveldata], ecx //save it
    mov ecx, enemies+4
    
    loop:
    lea esi,[edi+ebp+000063F8]
    cmp byte [esi+1], 12
    jne @f
    inc [enemies]
    mov [ecx], esi
    add ecx, 4
    skiploop:
    add ebp, 20
    cmp ebp, 2000
    jb loop
    
    exitloop:
    
    push 9
    call GetAsyncKeyState
    test eax,eax
    je @f
    
    call GetTickCount
    sub eax, [tick]
    cmp eax, 200
    jb @f
    
    //get random index between 0..enemies count
    call rand
    xor edx, edx
    div [enemies]
    mov ecx, enemies+4
    mov esi, [ecx+edx*4]
    
    movzx eax, [esi+1]
    push eax
    mov ecx, 033F6EC4
    call 00409F93
    
    test eax, eax
    je @f
    
    mov ecx, [data]
    mov [ecx*4+data+4], eax
    inc [data]
    
    mov esi, [033F6EAC]
    mov ecx, [esi+c0]
    mov [eax+c0], ecx
    mov ecx, [esi+c4]
    fld [floats]
    //mov [eax+c4], ecx
    fstp [eax+c4]
    mov ecx, [esi+c8]
    mov [eax+c8], ecx
    
    /*
    mov byte ptr [eax+11d], 4
    //mov [eax+478], 0404
    mov [eax+47a], 0404
    //mov [eax+00000464], 5A0E1BCA
    
    mov [eax+474], 08012420
    */
    
    //mov ecx, eax
    //mov edx, [eax]
    //call [edx+10]
    
    mov ebp, eax
    //get random index between 0..enemies count
    call rand
    xor edx, edx
    div [enemies]
    mov ecx, enemies+4
    mov esi, [ecx+edx*4]
    
    mov eax, ebp
    
    //initdata
    sub esp, 100
    //relocated code 005A943A
    mov dl,[esi+02]
    mov [eax+0000011D],dl
    mov cl,[esi+03]
    mov [eax+00000485],cl
    mov edx,[esi+04]
    mov [eax+00000474],edx
    mov cl,[esi+0B]
    mov [eax+00000492],cl
    //movsx edx,word ptr [esi+1A]
    //mov [esp+14],edx
    //fild dword ptr [esp+14]
    //fmul dword ptr [game.exe+5CEC80] { [1000.00] }
    //fstp dword ptr [eax+0000046C]
    mov cx,[esi+08]
    //fld dword ptr [game.exe+634D00] { [6.28] }
    mov [eax+00000478],cx
    //fmul dword ptr [game.exe+5D6BA8] { [0.00] }
    mov [eax+0000047A],cx
    //movsx ecx,word ptr [esi+12]
    //mov [esp+14],ecx
    //fild dword ptr [esp+14]
    //fmul st(0),st(1)
    //fstp dword ptr [eax+000000D0]
    //movsx edx,word ptr [esi+14]
    //mov [esp+14],edx
    lea edx,[eax+000000C0]
    //mov edi,edx
    //fild dword ptr [esp+14]
    //fmul st(0),st(1)
    //fstp dword ptr [eax+000000D4]
    //movsx ecx,word ptr [esi+16]
    //mov [esp+14],ecx
    //fild dword ptr [esp+14]
    //fmul st(0),st(1)
    //fstp dword ptr [eax+000000D8]
    //movsx ecx,word ptr [esi+0C]
    //mov [esp+14],ecx
    //fstp st(0)
    //fild dword ptr [esp+14]
    //fmul dword ptr [game.exe+5CE9E0] { [10.00] }
    //fstp dword ptr [edx]
    //movsx ecx,word ptr [esi+0E]
    //mov [esp+14],ecx
    //fild dword ptr [esp+14]
    //fmul dword ptr [game.exe+5CE9E0] { [10.00] }
    //fstp dword ptr [eax+000000C4]
    //movsx ecx,word ptr [esi+10]
    //mov [esp+14],ecx
    //lea ecx,[eax+00000130]
    //mov [eax+00000488],bl
    //fild dword ptr [esp+14]
    //fmul dword ptr [game.exe+5CE9E0] { [10.00] }
    //fstp dword ptr [eax+000000C8]
    ////////////////////////////////////////////////
    //....................
    mov ecx,[game.exe+2FF6EAC] { [172A07A0] }
    fld dword ptr [ecx+000000C8]
    fsub dword ptr [eax+000000C8]
    fld dword ptr [ecx+000000C0]
    mov ecx,eax   {ptr as this}
    fsub dword ptr [edx]
    mov edx,[eax]
    mov [eax+00000464],5A0E1BCA { 1510874058 }
    fld st(0)
    fmul st(0),st(1)
    fld st(2)
    fmul st(0),st(3)
    faddp
    fstp dword ptr [eax+00000460]
    fstp st(0)
    fstp st(0)
    call dword ptr [edx+10]
    
    add esp, 100
    
    call kernel32.GetTickCount
    mov [tick], eax
    
    
    skip:
    popf
    popad
    
    originalcode:
    add eax, 000000C0
    
    exit:
    jmp returnhere
    tick:
    dd 0
    floats:
    dd (float)100.00
    leveldata:
    dd   0
    data:
    dd   0        //size
                  //list
    
    enemies:
    dd   0        //size
                  //list
    
    "game.exe"+31E4DE:
    jmp newmem
    returnhere:
    
    
     
     
    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    unregisterSymbol(data)
    unregisterSymbol(enemies)
    dealloc(newmem)
    dealloc(enemies)
    "game.exe"+31E4DE:
    add eax, 000000C0
    //Alt: db 05 C0 00 00 00

     

     

    ссылка на файл

    http://s000.tinyupload.com/?file_id=08064413723196487564

     

    Указатель на объект, который используется для спавна npc/врагов (и игрока единожды) 0x033F6EC4

    +4 указатель на игрока

    +8 максимально возможно количество объектов

    +14 - последний созданный объект

    в каждом объекте +8 - предыдущий объект

    таким образом происходит полный обход всех объектов

     

    0x009D3558 класс врага

    0x009EF690 класс игрока

     

    если кому интересно, допишу подробнее информацию из заметок, что вел

     

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

    • Понравилось 3
    • Плюс 3
  9. чтоб не тормозило то можно ограничить перезапись значения текста, когда надо только

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

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

  10. В 23.01.2018 в 15:11, vadik111 сказал:

    В C++ так нельзя буквами сделать чтобы туда значение записать

    в с/с++ есть разыменовывание указателя, обратная получению адреса (&): *ptr

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

    но т.к. у тебя данные не в своем адресном пространстве, то используются функции записи/чтения в процесс ReadProcessMemory/WriteProcessMemory

    хотя не очень понятно что ты хочешь

  11. в начале не было про то что если меняется переменная, то меняется и в 2й форме

    проще тогда как указатель на переменную делать и присвоить адрес нужной переменной

    тогда что хочешь меняй

    а выводит потому что как он при не видимой 2й форме тебе покажет что то?)))

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

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

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