Показать сообщение отдельно

  #8  
Старый 26.12.2011, 22:44
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

Репутация: 23
По умолчанию

Всех с наступающим!

по теме:

обязательно если это точка входа в Ваш шеллкод и если она принимает

параметры пишите с модификатором __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))

(просто две разные формулы вычисления одного и того же)

или по абсолютным но вычисленным во время выполнения
 
Ответить с цитированием