首页
社区
课程
招聘
[讨论]内核汇编获取调用进程名称
发表于: 2012-4-29 11:20 7513

[讨论]内核汇编获取调用进程名称

2012-4-29 11:20
7513
http://bbs.pediy.com/showthread.php?p=420864#post420864
我想扩展一下这里的HOOK函数

__declspec(naked) MyKiFastCallEntry()
{
       
        _asm
        {
                嵌入汇编查看进程名
        }
       
        __asm {
                jmp [d_origKiFastCallEntry]
        }
}

怎么能用纯汇编的方式获取进程EPROCESS啊?通过FS,kpcr。。。这样进去吗?求一个实例代码

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
送一段代码,XP Professional SP2上测试通过。
DWORD g_dwOrgKiFastCallEntry = 0;
VOID PrintCurrentProcess()
{
	char szImageFileName[16] = {0};    // EPROCESS的UCHAR ImageFileName[ 16 ]含结束符
	PEPROCESS pCurrentProcess = PsGetCurrentProcess();
	memcpy(szImageFileName, (char *)pCurrentProcess + 0x174, 16);
	KdPrint(("%s EPROCESS: %08x\n", szImageFileName, pCurrentProcess));
}

VOID __declspec(naked)MyKiFastCallEntry()
{
	_asm
	{
		pushfd;
		pushad;
		push fs;
		push 0x30;
		pop fs;
		call PrintCurrentProcess;
		pop fs;
		popad;
		popfd;
		jmp [g_dwOrgKiFastCallEntry];
	}
}

VOID HookKiFastCallEntry()
{
	_asm
	{
		mov ecx, 0x176;    // MSR_SYSENTER_EIP
		rdmsr;
		mov g_dwOrgKiFastCallEntry, eax;
		mov eax, MyKiFastCallEntry;
		wrmsr;
	}
}

VOID UnhookKiFastCallEntry()
{
	_asm
	{
		mov ecx, 0x176;    // MSR_SYSENTER_EIP
		mov eax, g_dwOrgKiFastCallEntry;
		wrmsr;
	}
}
2012-4-29 14:23
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
fs:0 得到TEB,TEB0x30偏移处就是PEB了,
PEB结构的0x0c偏移的地方就是_PEB_LDR_DATA,
而_PEB_LDR_DATA结构有一个OrderModuleList成员,
OrderModuleList第一个成员的链表偏移0x8处就是kernel32基址了,
得到kernel32基址就相当于得到了涌泉之水,那你想干嘛就干嘛了.......
2012-4-29 17:45
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
现在在内核中。。FS获得的不是TEB
2012-4-29 18:28
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=yarpee;1068241]送一段代码,XP Professional SP2上测试通过。
DWORD g_dwOrgKiFastCallEntry = 0;
VOID PrintCurrentProcess()
{
        char szImageFileName[16] = {0};    // EPROCESS的UCH...[/QUOTE]

你的代码跟我原先的思路一模一样,但是有个疑惑

push 0x30;
                pop fs;
                call PrintCurrentProcess;
call前保证FS是0x30我不太明白,我没加这玩意蓝了。。这个是什么原因。给个方向指导下
2012-4-29 18:39
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
u KiFastCallEntry和PsGetCurrentProcess你就知道了,进入KiFastCallEntry时fs是未切换到R0的值的,而PsGetCurrentProcess却要用到它。
2012-4-29 21:19
0
雪    币: 228
活跃值: (115)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
PsGetProcessImageFileName 啊  有这么强大的函数要什么EPROCESS啊!!!
2012-4-30 00:28
0
雪    币: 343
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
PsGetProcessImageFileName的参数是PEPROCESS。
2012-4-30 14:07
0
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
我调试了下,发现如果不加上push 0x30,pop fs,FS原来的值也是0x30,但是这样会蓝,不知道为什么
2012-4-30 16:06
0
雪    币: 495
活跃值: (147)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
exediy PsGetProcessImageFileName 啊  有这么强大的函数要什么EPROCESS啊!!!
这个不全啊
2018-12-16 16:47
0
游客
登录 | 注册 方可回帖
返回
//