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

Вызов функции по адресу c++ x64


Рекомендуемые сообщения

Здравствуйте!

Есть приложение 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");

Приложение не вылетает, НО вызова функции по факту не происходит (если поставить брекпоинт на это адрес, то приложение продолжит работу после инжекта), хотя если написать другой адрес, то вылет всё таки произойдёт. Функции, которые делают что-то видимое, принадлежат классам, вызов их будет посложнее,  поэтому сейчас я остановился на простой. Если кто знает в чём проблема, прошу разъяснить. 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Gekas сказал:

Если кто знает в чём проблема, прошу разъяснить. 

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

 

1.Функция должна вызываться отдельным потоком.

2.Возможно,  не  все аргументы переданы/не верный прототип, так же стоит проверить в какой кодировке принимается текст.

 

Хотя есть одно решение которое всегда работает. Взять отладчик и посмотреть что происходит от инжекта до вызова функции и найти проблему.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Gekas сказал:

вызова функции по факту не происходит

а вы уверены в правильности передачи параметров функции?) я в портотипе не вижу конвенции вызова. Я не знаю на 100 процентов, но могу предположить, что по умолчанию плюсы будут использовать cdecl

Ссылка на комментарий
Поделиться на другие сайты

22 минуты назад, temtriss сказал:

по умолчанию плюсы будут использовать cdecl

 

Мне кажется компилятор в этом случае сам выбирает соглашение о вызове основываясь на прототипе.(но это не точно)

Ссылка на комментарий
Поделиться на другие сайты

В 25.10.2017 в 15:45, partoftheworlD сказал:

Хотя есть одно решение которое всегда работает. Взять отладчик и посмотреть что происходит от инжекта до вызова функции и найти проблему.

Благодарю, исправил проблему новым потоком.

Ссылка на комментарий
Поделиться на другие сайты

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

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

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