temtriss Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 Всем привет. !!!Перед прочтением данной статьи рекомендую прочитать о Соглашении о вызовах(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; } Примерно так выглядит наша программа: Думаю и так понятно, что приложение по нажатию на F1 запускает функцию 1, а по нажатию на F2 функцию 2 и 3 С помощью x64dbg мы попробуем разобратся как вызывается функция: Будем искать строчку из функции3. Для этого ищем ссылки на строки, как показано на скрине Поиск ссылок на строки в x64dbg: Находим там: "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 Давайте посмотрим на скрин: Интересующая нас функция: Ну что же самое интересное, мы знаем какое используется соглашение о вызове, мы знаем параметры которые принимает функция. Давайте теперь узнаем смещение функции относительно базового адреса, для этого открываем калькулятор, выбираем 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. Результат: Всем спасибо! P.s. Сильно не пинайте если что-то не так, первая статья! С радостью выслушаю конструктивную критику 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 19 минут назад, temtriss сказал: Код достаточно прост, думаю пояснения тут не нужны. Код может и прост, но если выкладываешь статьи в разделе для новичков, то желательно подписывать что каждая из функций делает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 23 минуты назад, temtriss сказал: С радостью выслушаю конструктивную критику Ну что же напросился: 1. Знания - это конечно очень хорошо, но подача информация тоже важна. 2. Юмор в виде мата не всегда уместен. 3. Статью лучше было бы разместить в разделе "Статьи для продвинутых". А за статью - плюс. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 2 минуты назад, Garik66 сказал: Статью лучше было бы разместить в разделе "Статьи для продвинутых". Там уже одна такая есть Ссылка на комментарий Поделиться на другие сайты Поделиться
temtriss Опубликовано 9 сентября, 2017 Автор Поделиться Опубликовано 9 сентября, 2017 14 минуты назад, partoftheworlD сказал: желательно подписывать @partoftheworlD хорошо, учту этот момент. @Garik66 Спасибо, замечания учту, буду стараться) Ссылка на комментарий Поделиться на другие сайты Поделиться
Dejavu Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 Почему так много грамматических ошибок? Ссылка на комментарий Поделиться на другие сайты Поделиться
temtriss Опубликовано 9 сентября, 2017 Автор Поделиться Опубликовано 9 сентября, 2017 @Dejavu Ну наверно по тому, что я не очень грамотный человек Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 сентября, 2017 Поделиться Опубликовано 9 сентября, 2017 Посмотри уроки кенга, а точнее как он объясняет, как по мне такое объяснение дойдёт до каждого. Хотят это сложно так все разжевывать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 10 сентября, 2017 Поделиться Опубликовано 10 сентября, 2017 Хотел конструктивной критики. Ну вот она: Статья, в принципе, неплохая, но ценность ее сомнительна. Объясню почему. 1. Статья предподносится как для новичков. Но для новичков слишком много остатается "за кадром". Например, не объяснено, что такое cdecl, в каком порядке при нем на стек передаются параметры, и все с ними связанное, также не объяснено, что такое базовый адрес, и откуда автор его берет. Новичку эти моменты будут непонятны, и он либо пойдет гуглить (если дотошный), либо бросит и подумает, взломы - это не его, и ему не понять. 2. Если все же эта статья не для новичков, а для продвинутых, то им она вообще в принципе не нужна, так как продвинутые все эти моменты давно уже знают. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 10 сентября, 2017 Поделиться Опубликовано 10 сентября, 2017 12 часа назад, Xipho сказал: Хотел конструктивной критики. Ну вот она: Ну на самом деле для обучения все средства хороши, я вообще, подобное изучал на примере исходника бота. А так от прочтения одной статейки никто и не гарантирует успех. Ссылка на комментарий Поделиться на другие сайты Поделиться
ReWanet Опубликовано 10 сентября, 2017 Поделиться Опубликовано 10 сентября, 2017 12 минуты назад, Dino сказал: Ну на самом деле для обучения все средства хороши, я вообще, подобное изучал на примере исходника бота. А так от прочтения одной статейки никто и не гарантирует успех. Обучение строится по типу: 1. Чтение 2. Просмотр примеров и их понимание 3. Пробы Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения