• XSS.stack #1 – первый литературный журнал от юзеров форума

Динамическое определение типов?

atavism

HalReturnToBorderline
Premium
Регистрация
03.05.2020
Сообщения
150
Реакции
85
Депозит
0.0016
В общем, пытаюсь сделать подгрузку функций по хешу в сишке. Додумался в итоге до функций с переменными параметрами. Для аргументов решил воспользоваться макросом _Generic, но в итоге получается ошибка:
1634159226700.png
И не могу додуматься как её пофиксить. Или может есть варианты с определением и пушем типов в функцию получше? Не очень бы хотелось рыться с асмом, на самом деле.. но в принципе и с ним побороться готов.
Код прилагаю. Ах, да, строка с ошибкой помечена комментарием "err"...

C:
#include <Windows.h>
#include <libloaderapi.h>
#include <stdarg.h>

#include "crypto.h"
#include "libloader.h"

#pragma region generictypename
// Список типов (специфичные определения также присутствуют), пополняется по мере необходимости.
enum _typename {
    TYPENAME_BOOL,
    TYPENAME_CHAR,
    TYPENAME_BYTE,
    TYPENAME_WCHAR,
    TYPENAME_WORD,
    TYPENAME_DWORD,
    TYPENAME_LPWSTR,
    TYPENAME_LPDWORD,
    TYPENAME_LPBYTE,
    TYPENAME_PDWORD,
    TYPENAME_LPSTR,
    TYPENAME_LPCSTR,
    TYPENAME_UINT,
    KEY_HKEY,
    KEY_REGSAM,
    KEY_PHKEY
};

#define __typename(x) _Generic((x),            \
        BOOL:        TYPENAME_BOOL,            \
        CHAR:        TYPENAME_CHAR,            \
        BYTE:        TYPENAME_BYTE,            \
        WCHAR:        TYPENAME_WCHAR,            \
        WORD:        TYPENAME_WORD,            \
        DWORD:        TYPENAME_DWORD,            \
        LPWSTR:        TYPENAME_LPWSTR,        \
        LPDWORD:    TYPENAME_LPDWORD,        \
        LPBYTE:        TYPENAME_LPBYTE,        \
        PDWORD:        TYPENAME_PDWORD,        \
        LPSTR:        TYPENAME_LPSTR,            \
        LPCSTR:        TYPENAME_LPCSTR,        \
        UINT:        TYPENAME_UINT,            \
        HKEY:        KEY_HKEY,                \
        REGSAM:        KEY_REGSAM,                \
        PHKEY:        KEY_PHKEY                \
)       
#pragma endregion

/*    Прототип, но жалко удалять
inline LPVOID noArg(HMODULE hModule, DWORD hash) {
    typedef LPVOID(WINAPI* newfnc)();
    newfnc fnc = (newfnc)GetProcAddress(hModule, hash);

    return fnc();
}
*/

inline LPVOID fncCall(HMODULE hModule, DWORD hash, unsigned int argNum, ...) {
    va_list args;
    unsigned int control = 0;
    va_start(args, argNum);

    while(argNum--) {
        control += va_arg(args, __typename(argNum)); // err
        if(control >= argNum) {
            // ...
            typedef LPVOID(WINAPI* fncCall)();
            // ...
        } else {
            DWORD dwErr = GetLastError();
            return dwErr;
        }
    }
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну я не хочу тебе расстраивать, но это не будет работать так, как ты думаешь. Можешь для примера посмотреть, как FFI решается в каком-то скриптовом языке, например в AngelScript: https://github.com/IngwiePhoenix/AngelScript/blob/master/sdk/angelscript/source/as_callfunc_x86.cpp (спойлер, без ассемблерной вставки адекватного решения вряд ли получится).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Если пишешь на плюсах , юзай шаблоны (template). Могу показать как.
Если на си - переходи на плюсы или заранее нагенерь хидеров. Там не сделаешь универсально.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх