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

partoftheworlD

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

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

  • Посещение

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

    172

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

  1. 22 минуты назад, Xhayla сказал:

    верно?

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

    Чтобы посчитать адрес возврата достаточно воспользоваться стеком, например так, сразу перед записью нового EIP.

    jmp_original = (DWORD)(pExceptionInfo->ContextRecord->Esp);

     

  2. 14 минут назад, Xhayla сказал:

    а откуда Вы взяли значение  INS_SIZE  = 10, почему 10?

     

    10 байт размер инструкций, но защита все равно поставится на весь регион памяти.

     

    14 минут назад, Xhayla сказал:

    в конце нужно будет возвращаться на оригинал?

    Да, хотя не уверен, проблем не должно быть, ведь по идее ведь код одинаковый везде будет, но желательно вернуть управление оригинальному коду.

  3. 26 минут назад, Xhayla сказал:

    @partoftheworlD, Жду, очень нужно, 2 день в тупике, сперва пробовал на игре, ничего не получалось, потом подумал, неужели вообще не работает, решил ТУПА попробовать на приложение где 3 строчки когда, ЦИКЛ - СООБЩЕНИЕ - ЗАДЕРЖКА, даже тут не получилось... Вы хорошо знаете C++?

    https://pastebin.com/4tXXM0av

     

     

     

     

    Думаю подставить вместо &value адрес указывающий на копию куска памяти не составит труда.

     

    26 минут назад, Xhayla сказал:

    Вы хорошо знаете C++?

    Нет

    • Плюс 1
  4. 2 часа назад, Xhayla сказал:

    Я хочу понять, как делается PageGuard Hooking на C++, а это программа просто для проверка, работает или нет.

    По тому коду, который ты используешь оно даже работать не будет. Сейчас код напишу и закомментирую.

  5. 7 часов назад, Xipho сказал:

    Это тоже можно отреверсить

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

  6. 13 минут назад, Xhayla сказал:

    Изначально код который Вы мне написали был рассчитан на DLL? 

    нет, это код из обработки исключений отладчиком.

     

    13 минут назад, Xhayla сказал:

    Изначально мне нужен был аналог функции StealthEdit на CE

    Почему бы просто не убивать поток с проверкой целостности?

     

    Вроде так, думаю переписать на C++ не составит труда тут все тоже самое за исключением скобок

    Спойлер
    
    if WaitForDebugEvent(&lpDebugEvent,INFINITE):
     	h_thread = open_thread(lpDebugEvent->dwThreadId)
     	context = get_thread_context(h_thread)
    
     if lpDebugEvent->dwDebugEventCode == EXCEPTION_DEBUG_EVENT:
     	exception = lpDebugEvent->Exception->ExceptionRecord->ExceptionCode
     	exception_address = lpDebugEvent->Exception.ExceptionRecord->ExceptionAddress
    
     if exception == EXCEPTION_GUARD_PAGE:
     	print "Guard page"
     elif exception == EXCEPTION_SINGLE_STEP:
     	print "Single Stepping."
     ContinueDebugEvent( lpDebugEvent->dwProcessId, lpDebugEvent->dwThreadId, DBG_CONTINUE ) 

     

     

  7. 11 минут назад, Xhayla сказал:

    UnhandledExceptionFilte в другой вообще никак нельзя?

     

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

  8. 5 часов назад, Xhayla сказал:

    еще там аргумент pExceptionInfo, что нужно туда указывать?


    EXCEPTION_POINTERS* pExceptionInfo

     

    4 часа назад, Xhayla сказал:

    почему не работает

    Без понятия, ведь ты не указал какую ошибку выдает твой код или какое поведение у кода, что говорит отладчик? 
    Если так с ходу, то не работает потому, что где-то ошибка или не правильный отлов исключения.

     

    UnhandledExceptionFilter вообще написан странно у тебя в коде и не будет ничего отлавливать.

    Кусок кода с подменой адресов должен быть примерно такой.

     

    Спойлер
    
    LONG WINAPI UnhandledExceptionFilter(EXCEPTION_POINTERS *pExceptionInfo)
    {
        if(pExceptionInfo->ExceptionRecord->ExceptionCode == UNK) //или if(pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
        {
            if(pExceptionInfo->ExceptionRecord->ExceptionAddress == (DWORD)GetModuleHandle("Game.dll")+0x13163B)
            {
                pExceptionInfo->ContextRecord->Eip = (DWORD)address; 
                 
                return EXCEPTION_CONTINUE_EXECUTION;
            }
        }
    
        return EXCEPTION_CONTINUE_SEARCH;
    }

     

     

  9. 2 часа назад, DabBoGame сказал:

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

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

     

    Лучше использовать шифрованный с помощь ключа контейнер, где ключ состоит из соли + железа, который сверяет ключ по хешу, например тому же SHA-1, а файлы сжаты каким-нибудь lzma2 с ключом. 
     

     

    В 19.08.2019 в 20:18, DabBoGame сказал:

    Буду благодарен, если кто-то в комментариях напишет небольшой отрывок кода как это  сделать.

    https://www.codeproject.com/Tips/5098831/Reading-Compressed-LZMA-Files-on-the-fly-using-a-C
     

  10. В 18.08.2019 в 16:27, nRaiver сказал:

    а судя по скрину из CE, то "client.dll" находится далеко за адресным пространством игры. 

     

    Может для начала стоит изучить основы и прочитать про динамическое выделение памяти? ASLR не имеет никакого отношения к тому что на скрине и не понятно, зачем надо было его приплетать, а на скрине глобальный адрес указывающий на структуру, указатель на которую выделяется в куче, а как происходит выделение?

    1. Функция просматривает список занятых/свободных областей памяти, размещённых в куче, в поисках свободной области подходящего размера;
    2. В случае нехватки свободной памяти может запросить дополнительную память у ОС;
    3. Добавляет найденную область в список занятых областей (или помечает область как занятую);
    4. Возвращает указатель на начало области памяти;
    5. Записывает данные по этому указателю.
  11. 1 час назад, Vlad2 сказал:

    error.iosAdapter.getTargets.getDeviceVersion.failed.fallback, device=[object Object]

     

    На винде вообще не стоит ничего отлаживать(горький опыт), когда-то надо было сайт отладить, делал по этой статье на убунте в виртуалке.
    https://medium.com/@nikoloza/how-to-debug-remote-ios-device-using-chrome-devtools-f44d697003a7
    Все работало.

     

    50 минут назад, partoftheworlD сказал:

    Все работало.

     

    До сих пор работает.(без джейлбрейка)

     

    Спойлер

    1895835634_Ubuntu64-bit-2019-08-17-16-50-35.thumb.png.499e10f507773d7b567027e048a76894.png890641003_Ubuntu64-bit-2019-08-17-17-04-17.thumb.png.1aba38ca22fcbfe9ee6af60d871168e4.png


     

     

    • Понравилось 1
  12. 5 часов назад, TheErel сказал:

    я не знаю что с этим делать, ну тоже хорошо.

     

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

  13. 2 часа назад, Japonamat сказал:

    Можно ли с помощью Cheat Engine автоматизировать процесс?

    Да, напиши обычный CE скрипт запихни туда цикл и перебирай в отдельном потоке. Если не хочется возиться с asm, используй lua.

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

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

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