c# - 如何从可执行文件中确定应用程序子系统

标签 c# executable file-format

我正在尝试从我计算机上安装的可执行文件列表中检测控制台应用程序。

如何实现?

每个应用程序都有一个“子系统”(Windows 应用程序、控制台应用程序或库;我认为作为选项指定给链接器)。如何仅使用可执行文件检测它?

是否有替代方法来检测应用程序特性?另外,有什么方法可以检测文件是否是真正的可执行文件?

JAR 可执行文件有任何问题吗?

最佳答案

无需任何编程,您就可以从

dumpbin.exe /headers filename

一些信息为您提供了 GetBinaryType 和 SHGetFileInfo 函数。您需要的所有信息都可以在每个可执行文件的 header 中找到。请参阅 http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx 中的 Microsoft 可移植可执行文件和通用对象文件格式规范.

也可以使用 DbgHelp.dll 中的 Debug Help Library API(参见 http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx)。 IMAGE_DOS_HEADER、IMAGE_DOS_SIGNATURE 和 IMAGE_NT_HEADERS32 结构为您提供完整信息。

更新(添加一些代码): 或者您可以只使用 WinNT.h 中定义的结构。相应的代码可以像下面这样开始

// Open source file
hSrcFile = CreateFile (pszSrcFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hSrcFile == INVALID_HANDLE_VALUE)
    __leave;

// Map the source file in memory
hMapSrcFile = CreateFileMapping (hSrcFile, NULL, PAGE_READONLY, 0, 0, NULL);    // SEC_IMAGE
if (!hMapSrcFile || hMapSrcFile == INVALID_HANDLE_VALUE)
    __leave;

// Map the entire of the source file is memory
pSrcFile = (PBYTE) MapViewOfFile (hMapSrcFile, FILE_MAP_READ, 0, 0, 0);
if (!pSrcFile)
    __leave;

pDosHeader = (IMAGE_DOS_HEADER *)pSrcFile;

if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
    printf ("it is not a EXE file.\n");
    return 1;
}
printf ("IMAGE_DOS_HEADER size %d (0x%X) bytes\n",  sizeof(IMAGE_DOS_HEADER), sizeof(IMAGE_DOS_HEADER));

DumpDosHeader (pDosHeader);
pDosExeStart = (PBYTE)pDosHeader + pDosHeader->e_cparhdr*16;

if (g_bDump)
    HexDump (1, pDosExeStart, pDosHeader->e_lfanew - pDosHeader->e_cparhdr*16, (DWORD)pDosExeStart);

if (pDosHeader->e_lfanew) {
    IMAGE_NT_HEADERS32 *pNtHeader = (IMAGE_NT_HEADERS32 *)((PBYTE)pDosHeader + pDosHeader->e_lfanew);
    //IMAGE_NT_HEADERS64 *pNtHeader64 = (IMAGE_NT_HEADERS64 *)((PBYTE)pDosHeader + pDosHeader->e_lfanew);
    IMAGE_SECTION_HEADER *pFirstSectionHeader = (IMAGE_SECTION_HEADER *)((PBYTE)&pNtHeader->OptionalHeader +
                                                                            pNtHeader->FileHeader.SizeOfOptionalHeader);

    if (pNtHeader->Signature == IMAGE_NT_SIGNATURE) {
        int i;

        printf ("\nPE signature\n");
        printf ("\nIMAGE_FILE_HEADER: size %d (0x%X) bytes, offset from the begin of the file: %d (0x%X)\n",
                sizeof(IMAGE_FILE_HEADER), sizeof(IMAGE_FILE_HEADER),
                ((PBYTE)&pNtHeader->FileHeader - (PBYTE)pDosHeader), ((PBYTE)&pNtHeader->FileHeader - (PBYTE)pDosHeader));
        DumpFileHeader (1, &pNtHeader->FileHeader);
        switch (pNtHeader->OptionalHeader.Magic) {
            case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
                printf ("\nIMAGE_OPTIONAL_HEADER32: size %d (0x%X) bytes, offset from the begin of the file: %d (0x%X)\n",
                        sizeof(IMAGE_OPTIONAL_HEADER32), sizeof(IMAGE_OPTIONAL_HEADER32),
                        ((PBYTE)&pNtHeader->OptionalHeader - (PBYTE)pDosHeader), ((PBYTE)&pNtHeader->OptionalHeader - (PBYTE)pDosHeader));
                DumpOptionalHeader32 (1, &pNtHeader->OptionalHeader);
                break;
            case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
                break;
            case IMAGE_ROM_OPTIONAL_HDR_MAGIC:
                break;
        }

关于c# - 如何从可执行文件中确定应用程序子系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2776676/

相关文章:

java - 在 Java 中运行带有参数的可执行命令?

open-source - 读取专有文件类型

c# winforms datagridview checkbox - 将可点击区域增加到整个列宽

c# - 您如何才能在 Xamarin.iOS UITableView 上仅圆化 2 个角?

c# - ScrollViewer 本身的垂直偏移量与 PropertyChangedEventArgs 的垂直偏移量有什么区别

C# 错误? - System.NullReferenceException 未被用户代码处理

r - 在 R 中用户定义的时间后终止计算程序

linux - 在多个参数上应用 Linux 可执行文件

python - 从numpy数组创建nifti文件

c++ - 尝试生成文件 C++ 时出错