Skip to content
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Collapse
Brand Logo

CELua[RU]

  1. Главная
  2. Статьи
  3. Приёмы
  4. Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess

Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess

Запланировано Прикреплена Закрыта Перенесена Приёмы
фишкиbreakpointce luadbk
3 Сообщения 2 Posters 45 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    написал в отредактировано MasterGH
    #1

    Обычно, дается 4 аппаратных брейкпоинта на адреса памяти. Их можно включать одновременно и найти инструкции, которые в данный момент срабатывают. Так можно определить тип данных у адресов и найти инструкции. По инструкциям найти смещения внутри дизассемблированной инструкции. По смещениям визуально определить структуры в структурах. Расструтуризовать структуру в dessect data и найти много интересных параметров для читов. Вручную с 4мя бряками делать очень хлопотно.

    Начинается все с установки огромного бряка на структуру из туториала CE.

    3931d315-3242-4905-ac49-8dc56de2c6c3-изображение.png

    \-- Tutorial-x86_64.exe+2B3A9 - 81 BB F0070000 E8030000 - cmp [rbx+000007F0],000003E8 { 1000 }
    
    local addressStructure = 0x000001FB07E391B0
    local sizeStrucure = 0x1000
    local TYPE_BREAKPOINT_ACESS = "READ" -- "READ" "WRITE" режимы брейкпоинта
    local scanTIme = 7000   -- через 7 секунд показать результат
    local stopTimee = true  -- остановить таймер после получения результата
    
    if dbkInited == nil or not dbkInited then
      dbkInited = dbk_initialize()
      dbk_useKernelmodeOpenProcess()
      OpenProcess(getOpenedProcessID())
      if not dbkInited then
         print("Can't load DBK")
         return
      end
      -- Появится диалог, жем "ДА"
      dbvm_initialize(true)
    end
    
    string.format('Start watching address: = %016X  size: %X', addressStructure, sizeStrucure)
    
    local physicalAddress = dbk_getPhysicalAddress(addressStructure)
    print (physicalAddress)
    
    if TYPE_BREAKPOINT_ACESS == "WRITE" then
       IDscannerWrites = dbvm_watch_writes(physicalAddress, sizeStrucure)
    elseif TYPE_BREAKPOINT_ACESS == "READ" then
       IDscannerReads = dbvm_watch_reads(physicalAddress, sizeStrucure)
    end
    
    function PrintResult(IDscanner)
       data = dbvm_watch_retrievelog(IDscanner)
    
       if data == nil then
         print('Inforamtion: Data nil')
        return
       end
    
       if #data <= 0 then
         print('Inforamtion: #data <= 0')
        return
       end
    
       for i=1,#data do
         print(string.format('RIP = %016X',data[i].RIP))
         print(disassemble(data[i].RIP))
       end
    
    end
    
    timer = createTimer(nil, false)
    timer.OnTimer = function(timer)
    
      if TYPE_BREAKPOINT_ACESS == "WRITE" then
        print "Result Writes"
        PrintResult(IDscannerWrites)
      elseif TYPE_BREAKPOINT_ACESS == "READ" then
        print "Result Reads"
        PrintResult(IDscannerReads)
      end
    
      if stopTimee then
        print "Stop Timer"
        timer.Enabled = false
        dbvm_watch_disable(IDscannerWrites)
        dbvm_watch_disable(IDscannerReads)
      end
    
    end
    timer.Interval = 10000
    timer.Enabled = true
    

    Логи

    Result Reads 
    RIP = FFFFF8040E9D5320 
    FFFFF8040E9D5320 - 00 00  - add [rax],al 
    RIP = FFFFF8040E9D5300 
    FFFFF8040E9D5300 - 00 00  - add [rax],al 
    RIP = 000000010002B3A9 
    10002B3A9 - 81 BB F0070000 E8030000 - cmp [rbx+000007F0],000003E8 
    RIP = 000000010009D080 
    10009D080 - 48 83 B8 88050000 00 - cmp qword ptr [rax+00000588],00 
    RIP = 000000010002599D 
    10002599D - 80 B8 02040000 00 - cmp byte ptr [rax+00000402],00 
    RIP = 00000001000259AE 
    1000259AE - 48 8B 00  - mov rax,[rax] 
    RIP = 00000001000A429D 
    1000A429D - 8A 81 00040000  - mov al,[rcx+00000400] 
    RIP = 00000001000259C3 
    1000259C3 - 48 8B 00  - mov rax,[rax] 
    RIP = 000000010001D70C 
    10001D70C - F7 40 50 10000000 - test [rax+50],00000010 
    RIP = 000000010001D71D 
    10001D71D - 80 B8 A1050000 00 - cmp byte ptr [rax+000005A1],00 
    RIP = 000000010001D734 
    10001D734 - 48 8B 00  - mov rax,[rax] 
    RIP = 00000001000AAB40 
    1000AAB40 - 48 83 78 70 00 - cmp qword ptr [rax+70],00 
    RIP = 000000010001D741 
    10001D741 - 48 83 B8 98060000 00 - cmp qword ptr [rax+00000698],00 
    RIP = 000000010001D7F8 
    10001D7F8 - 80 B8 A1050000 00 - cmp byte ptr [rax+000005A1],00 
    RIP = 000000010001D809 
    10001D809 - F7 40 50 10000000 - test [rax+50],00000010 
    RIP = 000000010009B630 
    10009B630 - 48 83 B8 70040000 00 - cmp qword ptr [rax+00000470],00
    

    f7c869d2-f790-4ed0-b7da-d7d1a574cac7-изображение.png

    По логам видим, что какие-то инструкции обращаются и скорее всего обращаются к нашей той самой структуре. Проверим так ли это и заодно увидим к каким другим структурам идет обращение
    df5c8aed-7148-49c0-bba8-bb91fe31d947-изображение.png

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

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

    Также видим, что тип данных автоматически неверно определился в окна DesectData и мы можем его скорективать - это будет 1 байт
    53a9ef34-fbbf-41ab-8c02-505ca89eded1-изображение.png

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

    1 ответ Последний ответ
    0
  • PitronicP Не в сети
    PitronicP Не в сети
    Pitronic Супер модераторы
    написал в отредактировано Pitronic
    #2

    у меня такой вопрос если можно сделать большой бряк на всю структуры, можно ли найти адрес от патронов в обойме на таймер выстрела(на этом адресе можно сделать скорострельный огонь) Я когда делаю rapid fire от адреса патронов всю структуру ручками просматриваю муторно, иногда этот адрес далеко лежит. И так что мы знаем? Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать?

    MasterGHM 1 ответ Последний ответ
    0
  • MasterGHM Не в сети
    MasterGHM Не в сети
    MasterGH Администраторы
    replied to Pitronic on отредактировано
    #3

    Пользователь @Pitronic написал в Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess:

    Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать?

    Я бы сделал без скриптов.

    1. делаешь dessect structure
      6b8ca47d-ed90-46ea-95e7-cd454196cb74-изображение.png
    2. Далее как обычно. Создаешь структуру. Затем вот это (следить за изменениями)
      17867765-a66b-43e9-9242-482b0b8c7cf3-изображение.png
    3. ну а дальше воспроизводишь свой выстрел
    4. потом создаешь структуру из изменившихся данных (потому что их будешь очень много наверняка)
      783b72ad-84e9-4444-9d5f-c02f5beb20c3-изображение.png
    5. затем делаешь lock на структуру, чтобы значения зафиксирвать
      a8243497-20b9-4ad1-9a14-056b452cace1-изображение.png
    6. затем рядом создаешь второй ряд по ctrl +a и смотрим изменения в реальном времени (игра должна быть в оконном режим, чтобы мы видели как цифры скачут)
      227628c2-13fe-485d-8632-0defed52710b-изображение.png
    7. чтобы увидеть изменения менее 100мс нужно поставить интервал меньше
      5dff820a-cb72-45a6-b625-04112696daec-изображение.png

    По идее это должно сработать

    1 ответ Последний ответ
    0

Powered by NodeBB | Contributors
СeLua[RU] 2024©
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Login or register to search.
  • Первое сообщение
    Последнее сообщение
0
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы