首页
社区
课程
招聘
如何判断dll是64位,还是32位
发表于: 2015-4-30 20:55 15798

如何判断dll是64位,还是32位

2015-4-30 20:55
15798
从system32目录里面拷了一个dll,如何判断这个dll是32位,还是64位?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
32位用不了64位DLL,就是这样
2015-4-30 21:02
0
雪    币: 2789
活跃值: (1167)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
LordPE,标题栏标有[PE32+]的就是64为dll,没有的则是32位的
2015-4-30 21:13
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
最简单的办法就是loadlibrary一下,能成功即和程序本身一样
2015-5-1 08:33
0
雪    币: 391
活跃值: (717)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
IMAGE_NT_HEADERS的FileHeader中的Machine可以判断!
IMAGE_FILE_MACHINE_I386为32位
IMAGE_FILE_MACHINE_IA64IMAGE_FILE_MACHINE_AMD64为64位
2015-5-1 09:06
0
雪    币: 70
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
通过Vs.net tools中所带的dumpin命令可以查看:dumpbin /headers <assembly path>
2015-5-1 11:01
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
how to determine whether it is 64bit or 32bit dll ...

use dumpbin to find the header information of dll files...
>dumpbin /headers yourdll.dll |find "machine"

Headers Flags
IMAGE_FILE_MACHINE_I386 (0x014c)
IMAGE_FILE_MACHINE_IA64 (0x0200)
IMAGE_FILE_MACHINE_AMD64 (0x8664)

Thanks
2015-5-2 12:22
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
------------IMAGE_NT_HEADERS的FileHeader-------中的-----Machine-------可以判断
------------IMAGE_FILE_MACHINE_I386----------为32位
------------IMAGE_FILE_MACHINE_IA64IMAGE_FILE_MACHINE_AMD64----------为64位
2015-5-2 14:56
0
雪    币: 250
活跃值: (81)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
我第一印象就是loadlibrary下
2015-5-4 20:19
0
雪    币: 180
活跃值: (80)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
5L正解
2015-5-5 00:17
0
雪    币: 1252
活跃值: (519)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好像上面都有答案了。
2015-5-5 03:18
0
雪    币: 7
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
5L,7L正解
2015-5-5 07:03
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵,上面都有答案了
2015-5-5 14:53
0
雪    币: 4
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
给楼主一个简单明了的答案,只求有看雪币转正。。

PE文件头里有个machine字段指定CPU类型,如果是0x8664就是64位程序,0x14c 表示Intel 386或后继处理器及其兼容处理器
可以用c32asm工具导入dll文件查看
这个是x86的:

这个是x64的


还有个办法可以用lordpe 工具查看,导入dll文件,然后查看特征值里面的“期望是32位系统“前面是否打勾,如果有勾则是32位,没有就是64位。。 望采纳!!
2015-5-5 21:27
1
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看里面的代码就知道了。
你下载的时候会有说明文件,说明你这个动态链接库是32位的还是64位的。
2015-5-6 15:58
0
雪    币: 150
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
WORD GetPeTypeAndPlatform(const TCHAR* pPath, WORD* platfrom)
{
        HANDLE                                                hFile = NULL;
        HANDLE                                                hFileMap = NULL;
        LPTSTR                                                lpMapAddr = NULL;
        WORD                                                bRet = IMAGE_SUBSYSTEM_UNKNOWN;
        PIMAGE_DOS_HEADER                        pDos = NULL;
        PIMAGE_FILE_HEADER                        pFileHeader = NULL;
        PIMAGE_NT_HEADERS64                        pNtHeader64 = NULL;
        PIMAGE_NT_HEADERS32                        pNtHeader32 = NULL;

        if (platfrom)
        {
                *platfrom = IMAGE_FILE_MACHINE_UNKNOWN;
        }

        if (!pPath)
        {
                return IMAGE_SUBSYSTEM_UNKNOWN;
        }

        __try
        {
                hFile = ::CreateFile(pPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL);
                if (hFile == INVALID_HANDLE_VALUE)
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }

                hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
                if (hFileMap == NULL)
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }

                lpMapAddr = (LPTSTR)MapViewOfFile(hFileMap, SECTION_MAP_READ, 0, 0, 0);
                if (!lpMapAddr)
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }

                pDos = (PIMAGE_DOS_HEADER)lpMapAddr;
                if (pDos->e_magic != IMAGE_DOS_SIGNATURE)
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }

                pNtHeader32 = (PIMAGE_NT_HEADERS32)(pDos->e_lfanew + (ULONG_PTR)pDos);
                pNtHeader64 = (PIMAGE_NT_HEADERS64)pNtHeader32;

                if (pNtHeader32->Signature != IMAGE_NT_SIGNATURE)
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }

                if (platfrom)
                {
                        *platfrom = pNtHeader32->FileHeader.Machine;
                }

                if (pNtHeader32->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 || pNtHeader32->FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
                {
                        bRet = pNtHeader64->OptionalHeader.Subsystem;
                        __leave;
                }
                else if (pNtHeader32->FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
                {
                        bRet = pNtHeader32->OptionalHeader.Subsystem;
                        __leave;
                }
                else
                {
                        bRet = IMAGE_SUBSYSTEM_UNKNOWN;
                        __leave;
                }
        }
        __finally
        {
                if (hFile)
                {
                        CloseHandle(hFile);
                }
                if (hFileMap)
                {
                        CloseHandle(hFileMap);
                }
                if (lpMapAddr)
                {
                        UnmapViewOfFile(lpMapAddr);
                }
        }

        return bRet;
}

与这段代码类似,楼主稍稍修改就可以了
2015-5-12 13:51
0
游客
登录 | 注册 方可回帖
返回
//