首页
社区
课程
招聘
[旧帖] [求助]GetDllFunctionAddress 蓝屏 0.00雪花
发表于: 2009-12-17 21:41 7281

[旧帖] [求助]GetDllFunctionAddress 蓝屏 0.00雪花

2009-12-17 21:41
7281
ssdt  hook  ,hook了zwcreateprocessex
其中取service id 用了网上流行的GetDllFunctionAddress函数
别人用的好好的,我用了,加载驱动可以,启动服务就蓝屏,windbg看dump文件说是这个函数的某一行有问题

蓝屏提示
page fault in nonpaged area
错误号  stop:  0x00000050 (0x803c346c,0x00000000,0xf9f4384d,0x00000000)
于是给GetDllFunctionAddress函数加 #pragma  pagedcode 也不行

别人都用好好的,我怎么用就不行呢,没改过呀。请各位帮忙给看看,多谢了。
我用的是xp sp3 加载的驱动。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可能跟你系统有关系~
2009-12-18 10:20
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我的系统 xp sp3   ,有人和我遇到过一样的问题没
2009-12-18 10:58
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
多加 try , 到处捕获异常,看看到底怎么回事
2009-12-18 20:26
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
dump+pdb+src还不知道怎么蓝的?????????????
2009-12-19 06:02
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
说是下面这句蓝的,可是我实在看不出有什么不对,别人也都这么用啊
functionAddress = (DWORD)((BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);

我是新手,不会调试,麻烦指点我下吧,停在这里无法前进了
2009-12-19 13:08
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
232个人看帖,没人帮我调试下看看么,我真的被难倒这了
2009-12-19 17:46
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我终于不蓝了,憋了快一个星期,
functionAddress = (DWORD)((BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
这句之所以不对,是因为functonOrdinal取得不对,这个在经典getdllfunctionaddress函数里面定义的是
Dword类型,但是arrayOfFunctionOrdinals定义的是word*;我看了那个地址里面是 07 00 08 00...
取到的functonOrdinal是0x80007,多取了一个word;

我的头文件里定义错了word类型(这个应该是主要原因)
#define    word  unsigned  int  // 占4字节  原来写错的
#define    word  unsigned  short  //2字节,应该是这个

------------------------------------------------------------------------------------------------------------------
DWORD GetDllFunctionAddress(char* lpFunctionName, PUNICODE_STRING pDllName)
{
        HANDLE hThread, hSection, hFile, hMod;
        SECTION_IMAGE_INFORMATION sii;
        IMAGE_DOS_HEADER* dosheader;
        IMAGE_OPTIONAL_HEADER* opthdr;
        IMAGE_EXPORT_DIRECTORY* pExportTable;
        DWORD* arrayOfFunctionAddresses;
        DWORD* arrayOfFunctionNames;
        WORD* arrayOfFunctionOrdinals;
        DWORD functionOrdinal;
        DWORD Base, x, functionAddress;
        char* functionName;
        STRING ntFunctionName, ntFunctionNameSearch;
        PVOID BaseAddress = NULL;
        SIZE_T size=0;

        OBJECT_ATTRIBUTES oa = {sizeof oa, 0, pDllName, OBJ_CASE_INSENSITIVE};

        IO_STATUS_BLOCK iosb;

        //_asm int 3;
        ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);

        oa.ObjectName = 0;

        ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);

        ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE);

        ZwClose(hFile);

        hMod = BaseAddress;

        dosheader = (IMAGE_DOS_HEADER *)hMod;

        opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);

        pExportTable =(IMAGE_EXPORT_DIRECTORY*)((BYTE*) hMod + opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress);

        // now we can get the exported functions, but note we convert from RVA to address
        arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfFunctions);

        arrayOfFunctionNames = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfNames);

        arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hMod + pExportTable->AddressOfNameOrdinals);

        Base = pExportTable->Base;

        RtlInitString(&ntFunctionNameSearch, lpFunctionName);

        for(x = 0; x < pExportTable->NumberOfFunctions; x++)
        {
                functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);

                RtlInitString(&ntFunctionName, functionName);

                functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1; // always need to add base, -1 as array counts from 0
                // this is the funny bit.  you would expect the function pointer to simply be arrayOfFunctionAddresses[x]...
                // oh no... thats too simple.  it is actually arrayOfFunctionAddresses[functionOrdinal]!!
                functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
                if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0)
                {
                        ZwClose(hSection);
                        return functionAddress;
                }
        }

        ZwClose(hSection);
        return 0;
}
2009-12-21 17:29
0
游客
登录 | 注册 方可回帖
返回
//