首页
社区
课程
招聘
[原创+源码+图已修复]利用DbgHelp取的NT内核符号信息示例
发表于: 2010-7-26 08:40 18187

[原创+源码+图已修复]利用DbgHelp取的NT内核符号信息示例

2010-7-26 08:40
18187
[SIZE=3]//打印出指定结构的元素名称及偏移[/SIZE]
[SIZE=3]//利用DbgHelp的SymGetTypeInfo函数先取得结构ID,然后取[/SIZE]
[SIZE=3]//结构元素个数,最后取得元素名称和偏移[/SIZE]
bool HySymPrintStructElements(DWORD64 ModBase,const char *StructName)
{
    bool bRet = false;
    PSYMBOL_INFO pSI = malloc(sizeof(SYMBOL_INFO)+MAX_SYM_NAME);
    if(!pSI) goto QUIT;
    pSI->SizeOfStruct = sizeof(SYMBOL_INFO);
    pSI->MaxNameLen = MAX_SYM_NAME;
    pSI->ModBase = ModBase;
    
    if(!HySymGetTypeInfo(ModBase,StructName,pSI))
    {
        PRINT("[%s]err : Get Struct Info Failed!\n",__func__);
        goto QUIT;
    }
    else
    {
        PRINT("[%s]msg Struct TypeIndex is %d\n",__func__,\
            pSI->TypeIndex);
    }
    
    UINT ElementCount;
    PVOID pData = &ElementCount;
    if(!SymGetTypeInfo(GetCurrentProcess(),\
        ModBase,pSI->TypeIndex,TI_GET_CHILDRENCOUNT,pData))
    {
        PRINT("[%s]err : Get Type Element Count Failed!\n",\
            __func__);
        goto QUIT;
    }
    PRINT("[%s]msg : Element Count is %d\n",__func__,\
        ElementCount);
    TI_FINDCHILDREN_PARAMS *pCP = malloc(sizeof(ULONG)*(2+ElementCount));
    if(!pCP) goto QUIT;
    
    memset(pCP,'\0',sizeof(ULONG)*(2+ElementCount));
    pCP->Count = ElementCount;
    if(!SymGetTypeInfo(GetCurrentProcess(),ModBase,\
        pSI->TypeIndex,TI_FINDCHILDREN,pCP))
    {
        PRINT("[%s]err : Get Type Element Failed!\n",__func__);
        goto QUIT;
    }
    
    WCHAR *pNameW = NULL;
    for(int i = 0;i < ElementCount;++i)
    {
        PRINT("[%02d] TypeIndex is %d\n",i,pCP->ChildId[i]);
        if(SymGetTypeInfo(GetCurrentProcess(),ModBase,\
            pCP->ChildId[i],TI_GET_SYMNAME,&pNameW))
        {
            wprintf(L"Name is %s\n",pNameW);
            LocalFree(pNameW);
        }
        else
            PrintErr();
    }
    
    bRet = true;
QUIT:
    free(pCP);
    free(pSI);
    return bRet;
}

[SIZE=3]//返回PE文件中指定段的文件偏移地址。
//因为Win32k所支持的SSDTSdw表在Win32k.sys文件中的偏移地址
//就在其数据段的文件偏移0处。(2k,xp,2k3,win7)
//注意在某些版本的xp(sp2)下有问题,不排除第三方程序干扰的原因。[/SIZE]
static PVOID GetPESectionOffset(FILE *pf,const char *SectionName)
{    
    PVOID RetDO = NULL;
    size_t SectionCount = 0;
    PVOID pNTHeader;
    IMAGE_NT_HEADERS ImgNTHeaders;
    
    if(!SectionName) return RetDO;
    //定位IMAGE_NT_HEADERS结构的位置信息
    fseek(pf,offsetof(IMAGE_DOS_HEADER,e_lfanew),SEEK_SET);
    //读取IMAGE_NT_HEADERS的位置
    fread(&pNTHeader,sizeof(long),1,pf);
    //将文件指针定位到IMAGE_NT_HEADERS的位置
    fseek(pf,(long)pNTHeader,SEEK_SET);
    //读取IMAGE_NT_HEADERS结构
    fread(&ImgNTHeaders,sizeof(IMAGE_NT_HEADERS),1,pf);
    //取得SECTION数目
    SectionCount = ImgNTHeaders.FileHeader.NumberOfSections;
    PRINT("[%s]msg : SectionCount is %d\n",__func__,SectionCount);
    
    //不需要显式fseek到SECTION TABLE,前面fread已经移动到正确的偏移了。
    //fseek(pf,(long)sizeof(IMAGE_NT_HEADERS),SEEK_CUR);
    IMAGE_SECTION_HEADER ImgSecHeaders[SectionCount];
    
    //读取SECTION数组
    fread(ImgSecHeaders,sizeof(ImgSecHeaders),1,pf);
    for(size_t i = 0;i<SectionCount;++i)
    {
        if(strstr(ImgSecHeaders[i].Name,SectionName))
        {
            RetDO = (PVOID)ImgSecHeaders[i].PointerToRawData;
            break;
        }
    }
    return RetDO;
}

[SIZE=3]//从Win32k.sys中获得原始SSDTSdw表中的项目。[/SIZE]
static bool GetSSDTSdwOrg(PVOID buf,size_t size)
{
    bool bRet = false;
    if(!buf || !size) goto QUIT;
    FILE *pf = fopen(g_Win32kFilePath,"rb");
    if(!pf) goto QUIT;
    
    //获取Win32k.sys中data段的文件偏移,SSDTSdw就放在该偏移。
    PVOID SSDTSdwFileOffset = GetPESectionOffset(pf,".data");
    if(!SSDTSdwFileOffset) goto QUIT;
    
    fseek(pf,(long)SSDTSdwFileOffset,SEEK_SET);
    fread(buf,size,1,pf);
    bRet = true;
QUIT:
    if(pf) fclose(pf);
    return bRet;
}

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
虽然看不懂,但是支持一下
2010-7-26 09:52
0
雪    币: 101
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
精品呐
2010-7-26 09:58
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
4
大师兄,把你csdn的图转到论坛上来吧,都显示不出来。
2010-7-26 11:19
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
5
貌似不是图床的问题,有时可以显示有时不行,论坛的原因???
2010-7-26 11:40
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
刷了好几遍都不能显示的
2010-7-28 01:22
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
这个不错,支持一下~~
2010-7-28 21:47
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
牛B,cmd居然也可以红黑相间
2010-7-29 00:29
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
下载代码学习一下,多谢分享。
2010-7-29 00:40
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
10
前面有几处goto QUIT,此时pCP还未分配,却执行了free(pCP)
2010-7-29 09:58
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
11
谢谢你的细心。
2010-7-29 10:09
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
等待此贴变成精华
2010-7-29 10:16
0
雪    币: 442
活跃值: (107)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
13
你的头像是欧拉吧?独眼巨人!
2010-7-29 10:40
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习。。。谢谢楼主
2010-12-2 14:37
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
试一下。看好用不。谢谢楼主分享
2010-12-2 21:06
0
雪    币: 312
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
奇人,简直!不mark 一下不行
2010-12-2 22:32
0
雪    币: 34
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
侯老师是csdn汇编版主的那个侯老师么?
强烈顶
2011-7-28 11:07
0
雪    币: 29
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好东东啊 以前怎么没看到?Mark了收藏!
2011-7-28 11:36
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
19
有源码就要顶~,支持一个~~
2011-7-28 12:00
0
游客
登录 | 注册 方可回帖
返回
//