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

Вызов функций приложений.


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

    Всем привет. 
    
    !!!Перед прочтением данной статьи рекомендую прочитать о Соглашении о вызовах(Calling Convention)!!!
    
    Эта небольшая статья о вызове функций из приложения. 
    Если будет не понятно, то могу снять видео гайд по вызову функций.

 

    Подопытным кроликом будет заранее заготовленное приложение.
    Вот его код:

    

Скрытый текст

	#include <Windows.h>
	#include <iostream>

	using namespace std;

	bool function001()
	{
		cout << "We call function001" << endl;
		return false;
	}

	void function002()
	{
	
		cout << "Function002 called!" << endl;
	}

	void function003(char* txt)
	{
		cout << txt << endl;
	}



	int main()
	{
		while (!GetAsyncKeyState(VK_INSERT))
			{
				if (GetAsyncKeyState(VK_F1) & 1)
				{
					if (!function001())
					cout << "Function001 - return false :(" << endl;
				}
			if (GetAsyncKeyState(VK_F2) & 1)
			{
				function002();
				function003("Function003 called! this is char* param of function003");
			}
	}
	return 0;
}

 

 

    Примерно так выглядит наша программа:


     bkt4vsOXI0E.jpg
     
     Думаю и так понятно, что приложение по нажатию на F1 запускает функцию 1, а по нажатию на F2 функцию 2 и 3
     С помощью x64dbg мы попробуем разобратся как вызывается функция:
     Будем искать строчку из функции3. Для этого ищем ссылки на строки, как показано на скрине
     
     Поиск ссылок на строки в x64dbg:
     2Aat_aS6uQU.jpg
     
    Находим там: "Function003 called! this is char* param of function003" 
    
    И смотрим:
    Сдесь PUSH и CALL
    Пологаю это то что нам надо, пушим аргумент в стек(наша строчка) и вызываем функцию.
    Перед прочтением статьи я рекомендовал прочитать про соглашение о вызове.
    Сейчас это бы пригодилось, но я зарание оговорюсь, что это C-Declaration  - __cdecl:
    
    Примерный внешний __cdecl
    push     ebp
    mov        ebp, esp
    // Пушим аргументы вызова
    push arg1
    push arg2
    // вызываем функция
    call ourFunc
    // чистим стек за нашей функцией
    add esp, 8
    
    Давайте посмотрим на скрин:
    
    Интересующая нас функция:
   6zpaPUDUXEk.jpg
    
    Ну что же самое интересное, мы знаем какое используется соглашение о вызове, мы знаем параметры которые принимает функция.
    Давайте теперь узнаем смещение функции относительно базового адреса, для этого открываем калькулятор, выбираем 16тиричную систему,
    Адрес функции у меня 009С24С0.
    Из адреса функции вычитаем Базовый адрес, в моем случае это 009B0000
    009C24C0-009B0000=124C0 Запоминаем, смещение, оно нам понадобится!
    

Давайте напишем dll'ку которая по нажатию на F10 будет запускать функцию3.
    
    Вот код:

     

Скрытый текст

	#include <Windows.h>
	// Теперь нам нужно обьявить портотип функции которую будем вызывать!

	typedef void(_cdecl * CALLFUNC003)(char*);
	CALLFUNC003 fn3;


	// Поток.... 
	DWORD __stdcall NewThread(LPARAM)
	{
		while (!GetAsyncKeyState(VK_INSERT))
		{
			if (GetAsyncKeyState(VK_F10) & 1)
			{
				// Получаем базовый адрес
				DWORD base = (DWORD)GetModuleHandle(NULL);
				// Получаем адрес функции.
				fn3 = (CALLFUNC003)(base + 0x124C0);
				// Вызываем нашу функцию ;)
				fn3("Any text \n");
			}
		}
		return 0;
	}

	BOOL __stdcall DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserverd)
	{
		switch (dwReason)
		{
		case DLL_PROCESS_ATTACH:
			MessageBoxA(NULL, "Injected...", "caption", MB_ICONINFORMATION);
			CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)NewThread, hModule, NULL, NULL);
			break;
		}	

		return TRUE;
	}

 

   

    Код достаточно прост, думаю пояснения тут не нужны. Собираем и иньжектим DLLку, 
    Для проверки можно заиньктить с помощью CE. 
    

 

    Результат:     
   HuOMapRIq6g.jpg
    
    Всем спасибо! :)

 

P.s. Сильно не пинайте если что-то не так, первая статья! С радостью выслушаю конструктивную критику :)

 

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

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

Код достаточно прост, думаю пояснения тут не нужны.

 

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

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

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

С радостью выслушаю конструктивную критику

Ну что же ;) напросился:

1. Знания - это конечно очень хорошо, но подача информация тоже важна.

2. Юмор в виде мата не всегда уместен.

3. Статью лучше было бы разместить в разделе "Статьи для продвинутых". 

 

А за статью - плюс. 

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

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

желательно подписывать

@partoftheworlD хорошо, учту этот момент. 

 

@Garik66 Спасибо, замечания учту, буду стараться) 

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

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

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

Хотел конструктивной критики. Ну вот она:

Статья, в принципе, неплохая, но ценность ее сомнительна. Объясню почему.

1. Статья предподносится как для новичков. Но для новичков слишком много остатается "за кадром". Например, не объяснено, что такое cdecl, в каком порядке при нем на стек передаются параметры, и все с ними связанное, также не объяснено, что такое базовый адрес, и откуда автор его берет. Новичку эти моменты будут непонятны, и он либо пойдет гуглить (если дотошный), либо бросит и подумает, взломы - это не его, и ему не понять.

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

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

12 часа назад, Xipho сказал:

Хотел конструктивной критики. Ну вот она:

Ну на самом деле для обучения все средства хороши, я вообще, подобное изучал на примере исходника бота. А так от прочтения одной статейки никто и не гарантирует успех.

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

12 минуты назад, Dino сказал:

Ну на самом деле для обучения все средства хороши, я вообще, подобное изучал на примере исходника бота. А так от прочтения одной статейки никто и не гарантирует успех.

Обучение строится по типу:
1. Чтение 

2. Просмотр примеров и их понимание

3. Пробы 

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

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

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

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