В начале статьи говорите о том, какие все плохие, не показывают юникод в новичковых курсах, а после показываете 100500 способов вывести смайлик в консоль, из которых переносимых между системами, дайте посчитать….
…ноль.
Я дартаньян, вы все пи…, вот вам пугало, смотрите, любуйтесь!
Куча непонятных телодвижений и танцев с бубном, ради непонятно чего.
Краткий гайд: берем minhook, берем Си, используем обычный ассемблер встраиваемый в код MSVC. Готово. И никаки танцев с бубном с отладчиками, реверс тулзами, и ручной записи опкодов в память, чтобы просто их транслировать в байты
Я конечно не эксперт в линукс тематике, но был ли смысл брать сырую обертку раста для драйверов в линуксе, которая еще и работает с версии ядра 6.1? Не лучше было бы все таки на Си написать, чтобы был бэкпорт в старые версии ядра(если такое вообще возможно)?
Текст выглядит как типичный пример «Школьнику втюхали рекламу раста и теперь он везде трубит у нас тут blazingly fast and ultra mega extra safe code»
Ее ответ ограничен в токенах(4096). 4 английских символа - 1 токен(на сайте написано). Подозреваю что надо рассматривать это как байты UTF-8 символа, тогда +- сходится, вроде
Чем охлаждать такое чудо? Трехсекционные водянки 300вт отводят максимум.
Оригинальный автор молодец, но слишком перестарался с разгоном. На черте в 1.32 вольта можно было бы уже и остановится - дальше каждые 100мгц разгона могут стоит 30вт тепловыделения, что не есть нормально. 1.39 на i5 - сумасшествие.
У меня у самого 12700kf, и моя башня мягко говоря в шоке, от стокового процессора.(200вт в пике)
Я бы мог его еще разогнать, но пока водянки нет - даже рисковать не хочу. А автор видимо жидкий азот использовал))
Почему же? Позволяет например, абстрагироваться от конечной "хукаемой" функции, и написать шаблонную лямбду, которая решит все сама. Как пример, хук на все LoadLibrary. Пример конечно абстрактный, можно было-бы полезть в недра kernel32.dll, и найти там функцию LdrLoadDll, и поставить хук на нее, но все же. На практике даже такие функции иногда полезны.
auto dispatch_load_calls = [](const auto& hook, auto str_ptr, auto&&... args) {
auto in_cef_module = [](std::uintptr_t addr) {
auto dll = reinterpret_cast<std::uintptr_t>(GetModuleHandleA("libcef.dll"));
auto ntheader = reinterpret_cast<IMAGE_NT_HEADERS*>(
dll + reinterpret_cast<IMAGE_DOS_HEADER*>(dll)->e_lfanew);
if (dll < addr && addr < dll + ntheader->OptionalHeader.SizeOfImage) {
return true;
}
return false;
};
if (in_cef_module(hook.get_return_address())) {
constexpr bool is_single_byte = std::is_same_v<decltype(str_ptr), LPCSTR>;
using str_view = std::conditional_t<is_single_byte, std::string_view, std::wstring_view>;
using str = std::conditional_t<is_single_byte, std::string, std::wstring>;
constexpr auto cef_directory = names_choose<is_single_byte>::prefix;
constexpr auto& names_array_ref = names_choose<is_single_byte>::value;
str_view load_name{str_ptr};
for (auto name : names_array_ref) {
if (load_name.find(name) != str_view::npos) {
str fname{cef_directory};
fname += name;
return hook.get_trampoline()(fname.c_str(), args...);
}
}
}
return hook.get_trampoline()(str_ptr, args...);
};
load_liba_hook.set_dest(reinterpret_cast<void*>(GetProcAddress(kernel32, "LoadLibraryA")));
load_libw_hook.set_dest(reinterpret_cast<void*>(GetProcAddress(kernel32, "LoadLibraryW")));
load_libexa_hook.set_dest(reinterpret_cast<void*>(GetProcAddress(kernel32, "LoadLibraryExA")));
load_libexw_hook.set_dest(reinterpret_cast<void*>(GetProcAddress(kernel32, "LoadLibraryExW")));
load_liba_hook.set_cb(dispatch_load_calls);
load_libw_hook.set_cb(dispatch_load_calls);
load_libexa_hook.set_cb(dispatch_load_calls);
load_libexw_hook.set_cb(dispatch_load_calls);
Если бы не было абстракции от глобального состояния, пришлось бы коллбэк под каждую функцию писать. Также уход от глобального состояния позволяет делать проект модульным, и внутри разных модулей использовать хуки на одну и ту же конечную функцию. Чего, например, нельзя сделать используя MinHook, или PolyHook
Не совсем понимаю о чем вы. Hot pathing присутствует во всех системных библиотеках Windows. Ничего не надо перекомпилировать.
Процитирую себя еще раз, и дополню:
Ага. А что делать с кодом, к которому нет доступа, и перекомпилировать с включенным Hot Patching нет возможности?И даже если так. Писать отдельный велосипед для винды, и отдельный для unix'ов? Мне кажется все же проще один общий велосипед написать, чем два отдельных, зависящих от настроек компиляции кода
Зачем писать разный код для выполнения одного и того же действия на разных платформах. Гораздо проще описать общий принцип, нет?
И все еще остается проблема с перехватами стороннего кода, вне стандартных библиотек Windows, или например на Linux. Или например мне захочется добавить функциональность к существующей функции игры(гейммоддинг). Игры с Hot Patching'ом никто не компилирует. Предлагаете сидеть с разбитым корытом, из-за того, что библиотека прикручена к функции Hot patching?
Также, не у всех системных библиотек и их функций есть HotPatching. Как пример - d3d9.dll, а именно функция IDirect3DDevice9::Present.
По тому как описывали новый стандарт ранее, казалось, что выйдет самый гнусный и скучный стандарт. А тут сразу и модули, и дополнения к ренжам которых так не хватало, assume, #warning и много еще плюшек
start_lifetime_as особенно порадовал. Только недавно в procxx «воевали» на этот счет =)
Передавать в обработчик хука какие то лишние параметры? Странная идея. Тем более, что, обработчик один, стало быть указатель на обьект будет всегда один и тот же. Смысл его передавать?
Вроде в самом начале статьи же про глобальное состояние...
Что бы не приходилось пересобирать инструкции в трамплине и суспендить потоки, лучше использовать Hot Patching в Windows, он для этого и был создан.
Ага. А что делать с кодом, к которому нет доступа, и перекомпилировать с включенным Hot Patching нет возможности? И даже если так. Писать отдельный велосипед для винды, и отдельный для unix'ов? Мне кажется все же проще один общий велосипед написать, чем два отдельных, зависящих от настроек компиляции кода
Примеры в README к сожалению полуактуальные. В какой-то момент сделал глобальный рефакторинг, но не поправил readme. Слишком объемная работа на тот и в данный момент. Наверное лучше в tests смотреть.
Не знаю, какие вы там новости читаете, но даже ГазПромБанк не отключен от свифта
и без мака
Мак есть и сейчас, просто под другим названием. А еще, считаю важно уточнить, что у Макдоналдса на ближайшие два года эксклюзивное право выкупа нынешнего «мака» обратно
Турецкие ключи прекрасно покупаются на неназываемых площадках
Где нашли дырку, там и пролезли, разве нет?
В начале статьи говорите о том, какие все плохие, не показывают юникод в новичковых курсах, а после показываете 100500 способов вывести смайлик в консоль, из которых переносимых между системами, дайте посчитать….
…ноль.
Я дартаньян, вы все пи…, вот вам пугало, смотрите, любуйтесь!
Не смешно самому?
А в чем вообще смысл статьи? Пожаловаться на 32 битную компиляцию?
Вы бы еще задали ему «Летели два верблюда - один лысый, другой налево. Сколько весит килограмм асфальта если ежику 4 года?»
Управление производительностью с Python 3.12 или Как с помощью профилировщика имитировать бурную деятельность в поисках проблемного участка кода
150 ватт? Не смешите мои подковы!
У меня 12700kf греется под 210, а официально 170 написано, если не ошибаюсь. А тут процессор «в 2 раза мощнее», и всего 150
Куча непонятных телодвижений и танцев с бубном, ради непонятно чего.
Краткий гайд: берем minhook, берем Си, используем обычный ассемблер встраиваемый в код MSVC. Готово. И никаки танцев с бубном с отладчиками, реверс тулзами, и ручной записи опкодов в память, чтобы просто их транслировать в байты
В Notepad++ можно включить зацикленный поиск, чтобы обойти весь документ
Я конечно не эксперт в линукс тематике, но был ли смысл брать сырую обертку раста для драйверов в линуксе, которая еще и работает с версии ядра 6.1? Не лучше было бы все таки на Си написать, чтобы был бэкпорт в старые версии ядра(если такое вообще возможно)?
Текст выглядит как типичный пример «Школьнику втюхали рекламу раста и теперь он везде трубит у нас тут blazingly fast and ultra mega extra safe code»
Ее ответ ограничен в токенах(4096). 4 английских символа - 1 токен(на сайте написано). Подозреваю что надо рассматривать это как байты UTF-8 символа, тогда +- сходится, вроде
Ввести законы чтобы стало всем хорошо? Нее
Ввести законы чтобы потом их временно отключать? - Yea, haha
или бекэнд на плюсах, в которых это единственный +- адекватный способ сериализации данных
400 ватт на 12700….
Чем охлаждать такое чудо? Трехсекционные водянки 300вт отводят максимум.
Оригинальный автор молодец, но слишком перестарался с разгоном. На черте в 1.32 вольта можно было бы уже и остановится - дальше каждые 100мгц разгона могут стоит 30вт тепловыделения, что не есть нормально. 1.39 на i5 - сумасшествие.
У меня у самого 12700kf, и моя башня мягко говоря в шоке, от стокового процессора.(200вт в пике)
Я бы мог его еще разогнать, но пока водянки нет - даже рисковать не хочу. А автор видимо жидкий азот использовал))
Почему же? Позволяет например, абстрагироваться от конечной "хукаемой" функции, и написать шаблонную лямбду, которая решит все сама. Как пример, хук на все LoadLibrary. Пример конечно абстрактный, можно было-бы полезть в недра kernel32.dll, и найти там функцию LdrLoadDll, и поставить хук на нее, но все же. На практике даже такие функции иногда полезны.
Если бы не было абстракции от глобального состояния, пришлось бы коллбэк под каждую функцию писать. Также уход от глобального состояния позволяет делать проект модульным, и внутри разных модулей использовать хуки на одну и ту же конечную функцию. Чего, например, нельзя сделать используя MinHook, или PolyHook
Процитирую себя еще раз, и дополню:
Зачем писать разный код для выполнения одного и того же действия на разных платформах. Гораздо проще описать общий принцип, нет?
И все еще остается проблема с перехватами стороннего кода, вне стандартных библиотек Windows, или например на Linux. Или например мне захочется добавить функциональность к существующей функции игры(гейммоддинг). Игры с Hot Patching'ом никто не компилирует. Предлагаете сидеть с разбитым корытом, из-за того, что библиотека прикручена к функции Hot patching?
Также, не у всех системных библиотек и их функций есть HotPatching.
Как пример - d3d9.dll, а именно функция IDirect3DDevice9::Present.
По тому как описывали новый стандарт ранее, казалось, что выйдет самый гнусный и скучный стандарт. А тут сразу и модули, и дополнения к ренжам которых так не хватало, assume, #warning и много еще плюшек
start_lifetime_as особенно порадовал. Только недавно в procxx «воевали» на этот счет =)
Вроде в самом начале статьи же про глобальное состояние...
Ага. А что делать с кодом, к которому нет доступа, и перекомпилировать с включенным Hot Patching нет возможности?
И даже если так. Писать отдельный велосипед для винды, и отдельный для unix'ов? Мне кажется все же проще один общий велосипед написать, чем два отдельных, зависящих от настроек компиляции кода
Благодарю за внимательность! Обновил парсинг в библиотеке под FreeBSD
На момент написания, казалось что оно одинаковое для всех unix-like систем. Оказывается у Linux свое, у FreeBSD свое.
Примеры в README к сожалению полуактуальные. В какой-то момент сделал глобальный рефакторинг, но не поправил readme. Слишком объемная работа на тот и в данный момент.
Наверное лучше в tests смотреть.
Не знаю, какие вы там новости читаете, но даже ГазПромБанк не отключен от свифта
Мак есть и сейчас, просто под другим названием. А еще, считаю важно уточнить, что у Макдоналдса на ближайшие два года эксклюзивное право выкупа нынешнего «мака» обратно