Всех с наступающим!
по теме:
обязательно если это точка входа в Ваш шеллкод и если она принимает
параметры пишите с модификатором __declspec(dllexport) вот так
Сообщение от
None
__declspec(dllexport)
DWORD __stdcall ShellCode_Start(SHELLCODE_PARAM* Param)
{
// код
}
потому что код заливающий шеллкод и запускающий его надеется на
стандартный сишный порядок передачи аргументов или на __stdcall
а при компиляции шеллкода в режиме агрессивной оптимизации точка
входа может сменить соглашение с __cdecl или __stdcall на __usercall
что значит компилятор в целях оптимизации может как угодно начать
передавать ей аргументы я на это нарывался как то а когда мы пишем
__declspec(dllexport) то создаем некий контракт на соглащение о вызове
потому что предпологаеться что для этой функции в будущем будут
генерировать вывоз по четко определенному сишному или __stdcall
соглашению исходя из прототипа и компилятор не имеет права искажать
вызов в целях оптимизации
Сообщение от
None
2) вызов доп функций может привести к появлению VA, но у нас все функции становятся
подставляются как inline по этому по факту их нет.
по наблюдениям код сгенрированный MSVC делает вызов по абсолютным
предопределенным адресам только когда вызывает API через IAT или
когда явно указатель на функцию передаеш например в функцию
CreateThread это не страшно надо просто прибавлять дельту к такому
указателю например CreateThread(ThreadEntry + Delta) и все
все остальные вызовы например шеллкод состоит из
нескольких функций дергаются по относительным адресам
например call (call_me - ($ + 5)) или
call (0 - ($ + 5 - call_me))
(просто две разные формулы вычисления одного и того же)
или по абсолютным но вычисленным во время выполнения