首页
社区
课程
招聘
[求助]求助下查找内核未导出函数的问题
发表于: 2019-12-10 22:05 7436

[求助]求助下查找内核未导出函数的问题

2019-12-10 22:05
7436
研究几天,网上的代码复制黏贴,确实能够打印出一堆函数了,但是自己想要的函数还是没有打印出来,然后把打印出来的函数跟IDA里内核导出的函数一对比,发现一模一样,一共打印出来2185个,也就是说,我打印出来的全是内核导出的,未导出的一个也没有打印出来,代码如下,哪位朋友看看哪里有问题了.

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <DbgHelp.h>

#pragma comment(lib , "DbgHelp.lib")
#pragma comment(lib , "ImageHlp.lib")

typedef BOOL(__stdcall *SYMGETSYMBOLFILE)(
__in_opt HANDLE hProcess,
__in_opt PCSTR SymPath,
__in PCSTR ImageFile,
__in DWORD Type,
__out_ecount(cSymbolFile) PSTR SymbolFile,
__in size_t cSymbolFile,
__out_ecount(cDbgFile) PSTR DbgFile,
__in size_t cDbgFile
);
EXTERN_C PLOADED_IMAGE IMAGEAPI ImageLoad(
__in PSTR DllName,
__in PSTR DllPath
);

HANDLE hProcess;
char* url = "http://msdl.microsoft.com/download/symbols";

HANDLE hIn;
HANDLE hOut;

void ChangeOutputTextColor(
DWORD rgbColor)
{
SetConsoleTextAttribute ( hOut , FOREGROUND_RED);
}

BOOLEAN InitSymHandler()
{
HANDLE hfile;
char Path[MAX_PATH]={0};
char FileName[MAX_PATH]={0};
char SymPath[MAX_PATH*2]={0};

if (!GetCurrentDirectoryA( MAX_PATH ,Path))
{
printf ("cannot get current directory \n");
return FALSE;
}
strcpy( FileName , Path);
strcat(FileName ,"\\symsrv.yes");
printf ("%s \n",FileName);
hfile = CreateFileA ( FileName,
FILE_ALL_ACCESS,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hfile == INVALID_HANDLE_VALUE)
{
printf ("create or open file error: 0x%X \n",GetLastError());
return FALSE;
}
CloseHandle (hfile);

hProcess = OpenProcess( PROCESS_ALL_ACCESS,
FALSE,
4);
if (hProcess == INVALID_HANDLE_VALUE)
{
printf ("Cannot open system process \n");
return FALSE;
}
SymSetOptions ( SYMOPT_CASE_INSENSITIVE | SYMOPT_DEFERRED_LOADS | SYMOPT_UNDNAME);
strcat(Path,"\\symbols*");
strcpy(SymPath,"SRV*");
strcat(SymPath,Path);
strcat(SymPath,url);

printf ("%s \n",SymPath);
SymInitialize( hProcess,
SymPath,
FALSE);
return TRUE;
}

BOOLEAN LoadSymModule(
char* ImageName,
DWORD ModuleBase)
{
SYMGETSYMBOLFILE pSymGetSymbolFile;
HMODULE hDbgHelp;
DWORD64 tmp;
char SymFileName[MAX_PATH]={0};
PLOADED_IMAGE pli = ImageLoad ( ImageName , NULL);

if (pli == NULL)
{
printf ("cannot get loaded module of %s \n",ImageName);
return FALSE;
}
hDbgHelp=LoadLibraryA("dbghelp.dll");
if (!hDbgHelp)
return FALSE;
pSymGetSymbolFile = (SYMGETSYMBOLFILE)GetProcAddress(hDbgHelp,"SymGetSymbolFile"); 
if (!pSymGetSymbolFile){
printf("SymGetSymbolFile 导出failed %X\r\n",pSymGetSymbolFile);
return FALSE;
}
if (!pSymGetSymbolFile( hProcess,
NULL,
pli->ModuleName,
sfPdb,
SymFileName,
MAX_PATH,
SymFileName,
MAX_PATH))
{
printf ("cannot get symbol file of %s ,error: 0x%x \n",ImageName,GetLastError());
return FALSE;
}

tmp = SymLoadModule64( hProcess,
pli->hFile,
pli->ModuleName,
NULL,
(DWORD64)ModuleBase,
pli->SizeOfImage);

if (!tmp)
{
printf ("cannot load module , error : %X \n",GetLastError());
return FALSE;
}

return TRUE;
}

BOOLEAN EnumSyms(
char* ImageName,
DWORD ModuleBase,
PSYM_ENUMERATESYMBOLS_CALLBACK EnumRoutine,
PVOID Context)
{
BOOLEAN bEnum;

if ( !LoadSymModule( ImageName , ModuleBase) )
{
return FALSE;
}

bEnum = SymEnumSymbols( hProcess,
ModuleBase,
NULL,
EnumRoutine,
Context);
if (!bEnum)
{
printf ("cannot enum symbols ,error: %x \n",GetLastError());
}

return bEnum;
}

BOOLEAN CALLBACK EnumSymRoutine(
PSYMBOL_INFO psi,
ULONG         SymSize,
PVOID         Context)
{
   char cBuf[120]={0};
   wsprintf(cBuf,"打印函数:%s : 0x%X \n",psi->Name,psi->Address);
   OutputDebugString(cBuf);
return TRUE;
}
int main(void)
{

hIn = GetStdHandle ( STD_INPUT_HANDLE);
hOut = GetStdHandle (STD_OUTPUT_HANDLE);

if (!InitSymHandler ())
{
goto __exit;
}
EnumSyms("ntkrnlpa.exe", 0x83c0f000,(PSYM_ENUMERATESYMBOLS_CALLBACK)EnumSymRoutine,NULL);
__exit:
getchar();
}


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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
逗。。。。
2019-12-10 22:44
0
雪    币: 45
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上的朋友,本人只是个业余选手,建筑专业的,有啥地方让你见笑了,能否说一下.
2019-12-11 09:05
0
雪    币: 1420
活跃值: (2281)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
没符号的 就是不想让你看到的,只能手工自己分析了
2019-12-11 09:32
0
雪    币: 45
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
青丝梦 没符号的 就是不想让你看到的,只能手工自己分析了
可是我看别人的代码,都是用符号文件来解析出未导出的函数的啊,他们代码里面比较的函数也是未导出的函数名字,比如这个帖子
http://www.bubuko.com/infodetail-2708508.html
还有这个帖子
https://bbs.pediy.com/thread-247443.htm
2019-12-11 10:40
0
雪    币: 45
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
而且我看了下老V那个AGP的代码,这部分解析函数地址的代码
if (!strcmpi(SymbolName,"_DbgkMapViewOfSection@16")||!strcmpi(SymbolName,"_DbgkMapViewOfSection@20"))
       {
               LogFile.WriteStringWithTime(_T("DbgkMapViewOfSection Find ok\r\n"));
               inaddr.DbgkMapViewOfSection = Address;
               FindCount++;
       }
他这个代码比较的函数,都是经过编译器修饰过的名字,而我打印出来的,一只能打印出导出的,二,打印出来的是函数没有经过编译器修饰的函数名字.所以比较困惑,到底哪里弄错了.
2019-12-11 10:43
0
雪    币: 45
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最困惑的是我的代码把设置搜索符号文件这部分代码注释掉,或者删除掉下载的PDB文件,也能解析,只不过都一样,都是导出的那些函数,所以我在想,是不是我的代码哪里错误,然后压根就没有解析PDB文件.
最后于 2019-12-11 10:48 被yhjlikeyhj编辑 ,原因:
2019-12-11 10:47
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
楼主解决了吗
2021-12-8 16:26
0
雪    币: 205
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我也遇到这个问题了
2022-10-6 16:11
0
雪    币: 205
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
有没有大佬出来解答下?我直接复制一份 能成功导出所有地址的代码到我自己写的程序中,就不行,奇了怪了,代码都是复制的啊,难道需要特定的项目配置?
2022-10-6 16:13
0
雪    币: 205
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
找到是哪 的问题了
2022-10-6 16:20
0
雪    币: 205
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不能用系统目录内核文件,需要复制一份到程序目录
2022-10-6 16:33
0
雪    币: 950
活跃值: (9946)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
13
mb_oamxlmfj 不能用系统目录内核文件,需要复制一份到程序目录
谢谢分享 后人遇到会感谢你的.
2022-10-7 09:33
0
游客
登录 | 注册 方可回帖
返回
//