Задать вопрос
@8iKS

Чем вызван краш программы?

я пробую сделать вызов функции программы из под dll загружая ее в память. Я определил офсет функции и теперь имею ее адрес

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <Windows.h>
#include <string>
#include <iostream>

using namespace std;

typedef void(__stdcall* _auth)();
_auth auth;

DWORD WINAPI MainThread(LPVOID param)
{
    uintptr_t modBase = (uintptr_t)GetModuleHandle(NULL);
    auth = (_auth)(modBase + 0x1040);

    cout << "0x" << std::hex << auth << endl;

    while (!GetAsyncKeyState(VK_END))
    {
        if (GetAsyncKeyState(VK_F9) & 1)
        {
            try
            {
                //cout << "0x" << std::hex << modBase << endl;
                auth();
                
            }
            catch (exception& ex)
            {
                cout << "Exception caught while calling auth() " << ex.what() << endl;
            }

        }
    }

    FreeLibraryAndExitThread((HMODULE)param, 0);
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:

        CreateThread(0, 0, MainThread, hModule, 0, 0);

        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


допустим мы не знаем кода программы функцию которой мы хотим вызвать, но для простоты задания я написал маленькое консольное приложение

void auth()
{
	cout << "CALLED FUNCTION auth()" << endl;
}


int main()
{
	while (true)
	{
		if (GetAsyncKeyState(VK_F8) & 1)
		{
			auth();
		}
	}

	return 0;
}


проблема заключается в том, что при попытке вызвать auth() через Dll программа просто крашиться. Пробовал поймать ошибку блоками try catch, но ошибка банально не выводится, приложение закрывается.

image.png
Это main() функция программы. В 7 строке идет вызов функции auth() и вывод сообщения, а последующий колл, как я понял, отвечает за перенос строки. Решил ради эксперимента убрать последнюю call инструкцию и получил в точности ту же ошибку что и при попытке запустить функцию из под Dll. Я не совсем понимаю как тогда должна выглядеть конструкция Dll файла, мне надо сделать еще один call сразу после вызова по адресу функции auth() или как-то полностью изменить инструкцию?
  • Вопрос задан
  • 220 просмотров
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
А как вы адрес получали? Похоже, что с ним фигня.

Попробуйте запустить вашу программу в отладчике с брейкпоинтом по загрузке (видимо, нужно будет windbg использовать какой-нибудь. Не знаю, как это сделать в IDE). Пропустите загрузку всех модулей и потом ставьте брейкпойнт в вашем MainThread. Там пройдитесь до, собственно, вызова auth и посмотрите, по какому адресу оно сделает вызов. Потом, посмотрите в отладчике же, а какой же адрес у auth. Они точно совпадают?

Еще, а не рабатает ли, если auth в вашем взламываемом экзешнике объявить тоже _stdcall? Не помню, какое там соглашение по вызову по стандарту применяется, но надо чтобы они были одинаковы в коде экзешника и в вашей дллке.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы