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

Coder

Ветераны
  • Постов

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

  • Посещение

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

    13

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

  1. "тут полное определение типа перехватываемой функции" это "typedef тип_который_возвращает_фун-я (__stdcall* funcPtr)(int count);" Правильно я понял?

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

    1. Указывать нужно тип функции, поэтому добавлять ключевое слово typedef не нужно.

    2. Не за что его боготворить, он облегчает жизнь новичкам, которые не знают как перехватывать функции без детурса.

    3. Русской документации нет, не было и не будет.

    P.S. Если хочешь программировать, то вообще забудь о русском языке.

    Если конечно ты не один из этих... "1C программистов" :-D

  2. Да, верняк, туплю че-то жесть уже с этим всем, -737304 это переполнение переменной, но могло бы и ошибку кинуть шоль, я ж не ставил unchecked()...

    Короче да, адрес прочел, но адрес тот еще вышел, в dec не влазит даже в калькуляторе что б перевести в hex...

    Проблема решена, спасибо.

    Это не переполнение переменной. Это отображение адреса в signed виде. Адреса хранятся в ячейках типа unsigned, потому что процессор не умеет работать с отрицательными числами.

    А второе твоё предложение я понять не смог.

  3. Да я для примера чисто взял, а вот реальный адрес читай ниже описал всю полностью ситуацию..

    Твой способ не работает во обще, по MSDN'ну знаю что пишет что так тоже можно, но не работает во обще...

    Вообщем тут че-то очень косо...

    Короче по CE: В адресе 0x1000A2BC лежит 0xFFF4BFE8.

    BitConverter.ToString(buf) // Выводит "E8-BF-F4-FF"

    BitConverter.ToInt32(buf, 0).ToString() // Выводит "-737304"

    Что это за пиз..ц?

    Адреса в x86 архитектуре хранятся в ячейках памяти типа - unsigned int.

    Следовательно тебе нужно использовать метод - BitConverter.ToUInt32

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

    Ну вот адрес который я пытаюсь прочесть: 0x1000A2BC. Может быть что-то именно с адресом не так? Но вроде все нормально... в CE этот адрес указывает на другой адрес нормально...

    Не хочу тебя разочаровать, но ты не можешь иметь доступ к адресу 0xFFF6525C.

    Начиная с адреса 0x7xxxxxxx начинается адресное пространство библиотек windows.

    Начиная с адреса 0x8xxxxxxx начинается адресное пространство, которое резервирует ядро Windows, и доступа к нему ты не имеешь.

    И CE никак не может отобразить содержимое этого адреса 0xFFF6525C.

  5. CheckBox в OS Windows это разновидность кнопки.

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

    Реализовать твою задумку можно следующим образом на С++:


    #include <windows.h>
    #include <iostream>

    BOOL CALLBACK EnumChildProc(
    HWND hWnd, // handle дочернего окна (контрола)
    LPARAM lParam // здесь пользовательский параметр, в нашем случае это указатель на вектор хэндлов
    )
    {
    std::vector<HWND>* wndCheckBoxes = reinterpret_cast< std::vector<HWND>* > (lParam); // приводим LPARAM к нужному нам типу

    WINDOWINFO info = { 0 }; // инициализруем структуру нулями
    info.cbSize = sizeof(WINDOWINFO); // инициализируем поле струтруры cbSize, так как оно подлежит обязательному заполнению

    GetWindowInfo(hWnd, &info); // получаем информацию об окне

    if (info.dwStyle & BS_CHECKBOX) // если стиль окна содержит BS_CHECKBOX
    {
    wndCheckBoxes->push_back(hWnd); // добавляем handle контрола (чекбокса) в наш вектор
    }

    return TRUE; // возвращаем TRUE, чтобы продложилось перечисление дочерних окон (и контролов)
    }

    void SetCheckBox(
    HWND hWNd, // handle чекбокса, состояние которого мы хотим изменить
    bool check // флаг отвечающий, за то, чтобы чекунуть или анчекнуть чекбокс
    )
    {
    if (check)
    {
    PostMessage(hWNd, BM_SETCHECK, BST_CHECKED, 0); // поставить галочку
    }
    else
    {
    PostMessage(hWNd, BM_SETCHECK, BST_UNCHECKED, 0); // снять галочку
    }
    }

    int main()
    {
    HWND hWnd = FindWindow(0, TEXT("заголовок окна"));
    if (!hWnd)
    {
    printf("Can't find window!\n");
    Sleep(2000);
    return 0;
    }

    std::vector<HWND> windowCheckBoxes; // объявляем вектор (динамический массив), который будет хранить handle'ы чекбоксов
    EnumChildWindows(hWnd, &EnumChildProc, reinterpret_cast<LPARAM> (&windowCheckBoxes)); // начинаем поиск check box'ов

    size_t foundCheckBoxes = windowCheckBoxes.size();

    if (foundCheckBoxes) // если количество найденных чекбоксов больше нуля
    {
    SetCheckBox(windowCheckBoxes[0], true); // поставить галочку первому найденному чекбоксу (индексация в массиве начинается с нуля)
    }

    return 0;
    }

    Использованный материал:

    http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633499.aspx (FindWindow - поиск окна по классу и/или по заголовку)

    http://msdn.microsof...p/ms633494.aspx (EnumChildWindows - перечисление всех дочерних окон окна)

    http://msdn.microsof...p/ms633516.aspx (GetWindowInfo - получение информации об окне)

    http://msdn.microsof...p/bb775951.aspx (Список стилей кнопок)

    http://msdn.microsof...p/bb775989.aspx (BM_SETCHECK - сообщение для установки состояния checkbox'а)

    http://msdn.microsof...p/ms644944.aspx (PostMessage - асинхронная функция отправки сообщения окна)

    P.S. Код не отлаживал, писал в Notepad'е, но думаю он прекрасно демонстрирует нужный тебе алгоритм.

  6. Как хукать с детурсом я уже забыл, но думаю тут всё просто.


    DETOUR_TRAMPOLINE(тут полное определение типа перехватываемой функции), тут адрес перехватываемой функции);
    Тут определяем тело функции перехватчика:
    int WINAPI Hooked_MessageBoxA(....)
    {
    return оригининальная функция(...);
    }

  7. 1. Через что это лучше всего узнавать?

    2. Понял.

    3. Не понял.

    Но меня пока что больше сама логика интересует, что в коде нужно заменить что б это все сработало?

    Допустим я узнал что:

    -Функция принимает следующие параметры: func1(int count);

    -Calling convention функции: __stdcall

    Какие должны быт мои дальнейшие действия?

    З.Ы. Понимаю что вопросы могут показаться нубскими, но что тут поделаешь все ж такими были когда-то.. Но я очень хочу въехать в тему даже если будете меня слать нах..й через каждое слово я все равно хочу все знать :)

    Что тут не понятного?

    typedef тип_который_возвращает_фун-я (__stdcall* funcPtr)(int count);

    Присваиваешь указателю на функцию значение и дальше всё как с перехватом WinAPI функции.

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

    Меня интересует просто сама тема хуков, а то на видео я так понял показали как хукать системные функции, а вот как хукать пользовательские?

    Скажем я написал свою "mydll.dll" которая экпортит функцию myfunc1(), и написал exe'шник(простая форма на C++), который импортит эту dll'ку и вот надо перехватить эту самую функцию когда екзешник ее заюзает.

    Ну или просто игра Need for Speed™ Rivals, хочу перехватить функцию "getBuildInfo()" из "Engine.BuildInfo_Win32_retail.dll" если должна быть именно указана игра...

    Еще раз повторюсь: взламывать цели нету, есть цель научится пользоватся хуками нормально, очень уж крутая штука которую очень бы хотел освоить...

    1) Тебе нужно выяснить какие аргументы принимает функция

    2) calling conversion функции

    3) Объявить прототип функции

    4) Далее всё как с обычным WinAPI или что ты там перехватывал

  9. если честно, мало что понял , что вы сказали(

    Смотри у тебя есть допустим 2 языковых файла формата:

    инглиш:

    AppMainCaption = Hello world

    AppMain_Button1 = Hey

    рашка:

    AppMainCaption = Привет мир

    AppMain_Button1 = Эй

    В зависиммости от языка, который выбрал юзер ты считываешь файл в свой массив строк.

    И из массива строк уже устанавливаешь заголовки контролов)

    Если пишешь на CE LUA, то тебе придется отказать от использования файлов, а хранить данные языков в таких же массивах строк.

  10. Самый простой способ:

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

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

  11. Обновление TrainMe:

    • Убрано мерцание объектов
    • Слегка улучшена физика
    • Сложность ТрейнМи повышена
    Ссылка на скачивание в первом сообщении. P.S. Намутил так, что у меня взломать не вышло ^_^
    За час исследований дальше не продвинулся, может у других получится.

    // формирование строки для вывода очковunsigned int __usercall sub_407B6A<eax>(unsigned int result<eax>, unsigned int a2<edx>, int a3<esi>){unsigned int v3; // ett@2unsigned __int8 v4; // dl@2int v5; // edx@5int i; // esi@6int v7; // [sp-8h] [bp-8h]@1unsigned int v8; // [sp-4h] [bp-4h]@1v8 = a2;v7 = a3;do{v3 = result;result /= 0xAu;--a3;v4 = v3 % 0xA + 48;if ( v4 >= 0x3Au )v4 += 7;*(_BYTE *)a3 = v4;}while ( result );v5 = v8 - (v7 - a3);if ( v8 > v7 - a3 ){LOBYTE(result) = 48;for ( i = a3 - v5; ; *(_BYTE *)(v5 + i) = 48 ){--v5;if ( !v5 )break;}*(_BYTE *)i = 48;}return result;}
  12. Coder, таблица понравилась. Сколько времени ушло на весь взлом, если не секрет?

    Это только проба пера, целью было реализовать основу. Плюс, хотелось начать с самых азов, чтобы ТренМи подошел всем :)

    Про двойную буферизацию совсем забыл, каюсь :)

    P.S. #1

    Увы, но С++ не знаю, т.е. код на сях могу понять, но изучать С++ меня как-то отталкивает из-за обилия IDE, и программ для разработки GUI. Все никак не могу решить, что выбрать.

    P.S. #2

    Посмотрим, может кто-то еще взломает этот ТрейнМи.

    Около 10-15 минут, началось всё со строки, в которую выводится счёт)
  13. Ну что ж, ракетки мне было лень искать...

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

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

    И еще нужно не забывать про двойную буфферезацию (весь контекст в окне мерцает).

    P.S. Ещё дельфи непонятно для чего вообще прицепил, тут же обычная работа с GDI, а твоя прога тянет кучу ненужных зависимостей за собой.

    На C++ такой пинг понг будет килобайт 20-30 весить без UPX'а.

    P.P.S. От меня получаешь плюс :)

    post-8127-0-21223900-1406624507_thumb.jp

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

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

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

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

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