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

    @8iKS Автор вопроса
    rPman, понятное дело что код требует инжекта dll, в этом и заключалась суть вопроса))))
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    Wataru, еще раз спасибо за помощь и объяснение!
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    Wataru, только не бросайте камнями)) я решил с недостаточным количеством знаний полезть в ассемблер и работу с памятью, а в последующем и хуками. Только что изменил код exe файла, чтобы вывести адрес функции и быть на 100% уверенным, что офсет верный, как оказалось, не зря.

    измененный код exe:
    #include <iostream>
    #include <windows.h>
    
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    void auth()
    {
    	cout << "CALLED FUNCTION auth()" << endl;
    }
    
    
    int main()
    {
    	void (*funcPtr)() = &auth;
    	cout << "Address of auth: " << (void*)funcPtr << endl;
    
    	while (true)
    	{
    		if (GetAsyncKeyState(VK_F8) & 1)
    		{
    			auth();
    		}
    	}
    
    	return 0;
    }


    Address of auth: 00007FF688FF1000

    дальше зашел в ассемблер и увидел это
    image.png
    image.png

    я до сих пор не понимаю почему до изменения кода функции auth() не было видно ни в отладочных символах, ни должным образом в дебагере. Неужели так работает оптимизация?

    P.S. Теперь все работает как надо, остался только вопрос почему не удавалось сделать тоже самое перед тем, как я добавил 2 строчки в main функцию

    void (*funcPtr)() = &auth;
    cout << "Address of auth: " << (void*)funcPtr << endl;


    P.S.2 Во всяком случае, большое спасибо за помощь!
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    вот ассемблированныйкод функции auth().

    решил добавить чуть больше вывода в 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 = nullptr;
    
    DWORD WINAPI MainThread(LPVOID param)
    {
        uintptr_t modBase = (uintptr_t)GetModuleHandle(NULL);
        auth = (_auth)(modBase + 0x1040);
    
        cout << "[+] MOD BASE: 0x" << std::hex << modBase << endl;
        cout << "[+] FUNCTION ADDRESS: 0x" << std::hex << (uintptr_t)auth << endl;
    
        MEMORY_BASIC_INFORMATION mbi;
        if (VirtualQuery((LPCVOID)auth, &mbi, sizeof(mbi)))
        {
            if (mbi.Protect & (PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE))
            {
                cout << "[+] CAN BE EXECUTED" << endl;
            }
            else
            {
                cout << "[-] CANNOT BE EXECUTED" << endl;
            }
        }
        else
        {
            cout << "[-] ERROR VirtualQuery for auth function address" << endl;
        }
    
        while (!GetAsyncKeyState(VK_END))
        {
            if (GetAsyncKeyState(VK_F9) & 1)
            {
                __try
                {
                    //cout << "0x" << std::hex << modBase << endl;
                    auth();       
                }
                __except (EXCEPTION_EXECUTE_HANDLER)
                {
                    DWORD errorCode = GetExceptionCode();
                    cout << "[-] EXCEPTION auth() CALL, CODE ERROR: 0x" << std::hex << errorCode << endl;
                }
    
            }
        }
        FreeLibraryAndExitThread((HMODULE)param, 0);
        return 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;
    }
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    rPman, это не решение проблемы. Здесь ChatGPT подразумевает то, что у меня есть доступ в исходному коду программы, но на деле я его предоставил лишь для простоты задачи, приложение уже скомпилировано
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    Inviz Custos, пробовал менять на fastcall и на cdecl, проблема осталась.

    Исключение срабатывает в этом месте:
    image.png
    image.png

    касаемо вопроса адреса функции
    вот вывод из под Dll
    image.png

    адрес 0x00007FF60BFA1040 совпадает с адресом функции из дебагера (call 0x00007FF60BFA1040)
    Написано
  • Чем вызван краш программы?

    @8iKS Автор вопроса
    адрес точно верный, проверял несколько раз с помощью дебагера. если к modBase прибывать офсет, то попадаешь на функцию. следовательно и адрес и офсет верны
    Написано
  • Почему не удается получить адрес функции?

    @8iKS Автор вопроса
    не много не понимаю причем здесь экспорт функций из динамической библиотеки. Вопрос заключается в том, что dll не может получить адрес функции в приложении в которое было загружено

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

    второй участок кода - сама библиотека в которой и возникает проблема, вот в этом участке
    original_auth = (auth_type)GetProcAddress(NULL, "auth");
    . original_auth равняется nullptr, хотя должно равняться адресу функции auth()
    Написано
  • Как "склеить" два файла?

    @8iKS Автор вопроса
    Wataru, Дополнительных условий нету, размер и откат неважен. В данном случае мне нужно соединить два файла чтобы они выполнились по очереди. Hello, World! - это пример простой программы для склейки, но на деле это будут программы с более сложными и запутанными алгоритмами к исходному коду которых у меня нет доступа. Если еще раз пройтись по вопросу и описать все очень кратко, то мне надо склеить два файла в один таким образом, чтобы они выполнились поочередно. Использовать упаковщики, архиваторы, инсталяторы и другое ПО я не могу, следовательно, из того, что пришло в голову, так это просто добавить байты второй программы в первую и дописать инструкцию на ее запуск, с этим как раз-таки и возникли проблемы
    Написано
  • Как "склеить" два файла?

    @8iKS Автор вопроса
    В сути вопроса указано
    Как «склеить» два файла?
    Для инъекции понадобиться сам инжектор который зарезервирует память и запишет байты, а мне нужен на выходе один файл ;)
    Написано
  • Как "склеить" два файла?

    @8iKS Автор вопроса
    mayton2019, первый файл работает с файлами создает/редактирует/удаляет, второй - запускает приложения

    можно ведь сделать так, как это описал я? добавить байты в конец первого файла и дописать инструкцию вызова второго
    Написано
  • Как "склеить" два файла?

    @8iKS Автор вопроса
    да, но что если речь идет о более сложных инструкциях, а не простой вывод строк?
    Написано