免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 进程防火墙驱动开发的再次挖掘(4)

进程防火墙驱动开发的再次挖掘(4)

时间:2012-03-25 15:05来源:未知 整理:寂涯网络 点击:


if ( hFile )
ZwClose(hFile);
if ( ObjectNameInformation ) ExFreePoolWithTag(ObjectNameInformation, 0);
return result;
}
//加载黑白名单
BOOLEAN LoadRule(IN LPWSTR RuleFilePathw)
{
HANDLE hFile; NTSTATUS status; IO_STATUS_BLOCK iosb={0};
CHAR RuleContent[0x200]={0}; //如果空间设置过大(比如:0x1000=4K),会导致局
部堆栈溢出,提示 unresolved external symbol  chkstk referenced in function
ULONG BytesLen;
PCHAR Temppos,FilePos,SignPos; ULONG slen;
BOOLEAN result;
PPROCESS_RULE ProcessRule=NULL; PCHAR TempRule;
result = FALSE;
hFile = MyOpenFile(RuleFilePathw);
if (hFile)
{
//简单一些,大小被固定,后面可以修正
 

status = ZwReadFile(hFile,NULL,NULL,NULL,&iosb,&RuleContent,0x200,NULL,NULL);
if (NT_SUCCESS(status))
{
BytesLen =(ULONG)iosb.Information; Temppos =  RuleContent;
if (BytesLen>0)
{
ProcessRule = ExAllocatePoolWithTag(NonPagedPool,sizeof(PROCESS_RULE),0);
if (!ProcessRule)
return FALSE;
memset(ProcessRule,0,sizeof(PROCESS_RULE));
}
g_policyRule = ProcessRule;
while (TRUE)
{
FilePos = strchr(Temppos,0x3D);
SignPos = strchr(Temppos,0x3B);
slen = SignPos-FilePos;
RtlCopyMemory(&ProcessRule->ProcessName[0],(PCHAR)(FilePos+1),slen-1); ProcessRule->IsNotProtected =*(CHAR*)(SignPos+1);
Temppos = SignPos+2;
if (*(CHAR*)Temppos==NULL)
break;
if ( (!ProcessRule->Next))
{
TempRule
= ExAllocatePoolWithTag(NonPagedPool,sizeof(PROCESS_RULE),0);
if (!TempRule)
return FALSE; memset(TempRule,0,sizeof(PROCESS_RULE)); ProcessRule->Next = TempRule;
ProcessRule = ProcessRule->Next;
}
}
result = TRUE;
}
}
if (hFile) ZwClose(hFile); return result;
}
//找到 ZwProtectVirtualMemory 的地址
ULONG Find_ZwProtectVirtualMemory_Address(ULONG ZwPulseEvent_Address)
{
BYTE StartInstruction[4]={0}; ULONG  result;
int i;
 

ULONG  FindAddress,EndAddress;
result=0;
// 这里 ZwProtectVirtualMemory 的起始指 令 :mov EAX, 89 ,前面四 个字节为
0x0000b889
StartInstruction[0] = *(CHAR *)ZwPulseEvent_Address; StartInstruction[1] = ((*(CHAR *)((PCHAR)ZwPulseEvent_Address +1))-1); StartInstruction[2] = (*(CHAR *)((PCHAR)ZwPulseEvent_Address +2)); StartInstruction[3] = (*(CHAR *)((PCHAR)ZwPulseEvent_Address +3)); FindAddress = ZwPulseEvent_Address - 0x800;
EndAddress = ZwPulseEvent_Address;
for(i=FindAddress;i<=EndAddress;i++)
{
if (StartInstruction[0] == *( BYTE *)i && StartInstruction[1] == *( BYTE *)((PCHAR)i+1) &&
StartInstruction[2] == *( BYTE *)((PCHAR)i+2) &&
StartInstruction[3] == *( BYTE *)((PCHAR)i+3) )

{
result = i; DbgPrint("funcaddress=0x%X\n",i); break;
}
}

return result;
}
这里给的 ProcessRule.dat 文件必须放在 C 盘根目录下,其文件格式如下:
[PROCESS NAME]
=winword.exe;0
=notepad.exe;0
=qq.exe;0
=calc.exe;1 这里采取进程文件名字判定来分辨是否为黑白名单上的进程,其中文件名请全部小写,0 代表禁止,1 代表运行,这里面只分配 0x400 的空间,注意局部函数的变量不要太大,否则
造成堆栈溢出。 测试环境:WINXP SP3+WDK7600
文章到这里就结束,此时结束进程不会再有任何错误提示框出现,当然我给出的也只是 其中一部分代码,比如修改策略文件,应用层与内核通信,通过文件 MD5 值校验的黑白名 单等,这些我没有给出也不能给出,因为具体到项目还要根据客户的需求;但是我已经给 出最核心的代码和原理,你可以自己修改完善,在网上我找了一下这方面的工具,做的都 不太完善,虽然有的也使用 md5 校验来判定,但是由于挂钩函数的问题,最后仍然会提示 错误的消息框,本文给出的方案应该是比较正确的,是主流安全工具采取的方式,写驱动 防火墙也是相同原理,也可以 Patch 入口地址,驱动防火墙更加简单些,直接修改内核地 址,其实还可以修改 pe 文件的导入表地址来加载 dll,这是后话那,这里要感谢 xikug 大 牛的指导,由于赶写毕业论文在即,所以仓促之间难免错误,请读者不吝批评指教。

本页地址 http://www.jybase.net/biancheng/20120325808.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com