.386
.Model Flat,StdCall
Include ..\Include\Kernel32.inc
IncludeLib ..\Lib\Kernel32
.Code
DLLMain:
Cmp DWord Ptr[ESP+8],DLL_Process_Attach
JNZ StdExit
XOr EBX,EBX
Invoke GetModuleHandle,EBX
Add EAX,[EAX+60]
Add EAX,92
;Здесь лежит Word,определяющий тип подсистемы.Его и надо анализировать
StdExit:XOr EAX,EAX
Inc EAX
Ret 12
End DLLMain
Определение типа подсистемы приложения из DLL
Путём обсуждения в IRC были предложены следующие методы решения:
0)я–определение по полю Subsystem в PE-заголовке
Код:
2)вызовом из приложения функции в DLL,которая будет оповещать о типе приложения.Вполне возможно,но минус в том,что это будет невозможно,если DLL сама должна будет загружаться в процесс(например,как ловушка или по механизму Windows NT)
3)вроде ещё что-то было,сейчас не упомнить
Меня интересуют другие методы,желательно более лёгкие(если есть).Может,есть API для определения типа подсистемы(типа IsUserAnAdmin,но в другой плоскости,конечно же).В общем,если есть возможность сделать короче,чем я,буду рад увидеть варианты.Впрочем,если не короче–тоже:)
Microsoft предлагает только нулевой вариант :)
..ибо чем консольное приложение отличается от GUI? Да тем что консольному по-умолчанию системой создается консоль. Как раз по этому флажку в заголовке. Но если захочешь - сделаешь консоль для GUI приложения или окно для консольного.
Код:
function GetImageSubSystem(): ULONG; register;
asm
xor eax,eax
mov eax,fs:[eax+30h]
mov eax,[eax+0b4h]
end;
asm
xor eax,eax
mov eax,fs:[eax+30h]
mov eax,[eax+0b4h]
end;
Вот только,насколько я знаю,структура PEB…ммм…как бы сказать.Нестабильна,что ли,и может меняться от версии к версии
Не знаю. Всё она стабильна. Просто эти поля есть в Windows NT 4.0 и выше и всё работает, в Windows 9x\ME их нет. А чтобы проверить NT-система или нет можно поглядеть значение PEB.Ldr - если 0 то это не NT.