Гость Gekas Опубликовано 25 октября, 2017 Поделиться Опубликовано 25 октября, 2017 Здравствуйте! Есть приложение x64 c++ приложение и dll, которая инжектится к этому процессу. Подмена виртуальных функций удаётся на ура: bool setFalse() { return false; } uintptr_t** VtTest; uintptr_t** VtTest = (uintptr_t**)SlideAddress(0x1A90BB8);//SlideAddress прибавляет к базовому адресу приложения передаваемый параметр и убирает защиту памяти VtTest[43] = (uintptr_t*)&setFalse; Но тут дело дошло до вызова функций из атакуемого процесса, сделал это примерно так: typedef int fp(std::string const&); int(*TestFunction)(std::string const&) = (fp*)(SlideAddress(0xB37E40)); TestFunction("String"); Приложение не вылетает, НО вызова функции по факту не происходит (если поставить брекпоинт на это адрес, то приложение продолжит работу после инжекта), хотя если написать другой адрес, то вылет всё таки произойдёт. Функции, которые делают что-то видимое, принадлежат классам, вызов их будет посложнее, поэтому сейчас я остановился на простой. Если кто знает в чём проблема, прошу разъяснить. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 25 октября, 2017 Поделиться Опубликовано 25 октября, 2017 1 час назад, Gekas сказал: Если кто знает в чём проблема, прошу разъяснить. Не показан весь код, так что тут могу быть только догадки. 1.Функция должна вызываться отдельным потоком. 2.Возможно, не все аргументы переданы/не верный прототип, так же стоит проверить в какой кодировке принимается текст. Хотя есть одно решение которое всегда работает. Взять отладчик и посмотреть что происходит от инжекта до вызова функции и найти проблему. Ссылка на комментарий Поделиться на другие сайты Поделиться
temtriss Опубликовано 25 октября, 2017 Поделиться Опубликовано 25 октября, 2017 5 часов назад, Gekas сказал: вызова функции по факту не происходит а вы уверены в правильности передачи параметров функции?) я в портотипе не вижу конвенции вызова. Я не знаю на 100 процентов, но могу предположить, что по умолчанию плюсы будут использовать cdecl Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 25 октября, 2017 Поделиться Опубликовано 25 октября, 2017 22 минуты назад, temtriss сказал: по умолчанию плюсы будут использовать cdecl Мне кажется компилятор в этом случае сам выбирает соглашение о вызове основываясь на прототипе.(но это не точно) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Gekas Опубликовано 28 октября, 2017 Поделиться Опубликовано 28 октября, 2017 В 25.10.2017 в 15:45, partoftheworlD сказал: Хотя есть одно решение которое всегда работает. Взять отладчик и посмотреть что происходит от инжекта до вызова функции и найти проблему. Благодарю, исправил проблему новым потоком. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения