2011年参赛用的。。。。写了4个月的晚上时间。。。很久没再修改了
开始写这个程序的时候,其实才开始学驱动。。。。所以基础打得并不牢固,当时看了SSDT原理就直接连抄加改直接来了。地址有效性检测啦,同步什么的貌似都没有,不是计算机相关专业,时间有限,数据结构、算法都没学过,代码也不规范。。。。比较烂
。
环境:WIN XP SP3 + VC6 SP6
程序的思路:
1、通过SSDT HOOK一些注册表操作函数、文件操作函数、进程线程操作函数并读取其操作值和进程PID
2、在应用层 维护3个容器,分别存储一些 文件值、进程值、注册表敏感值,这些值通过采集一些常见病毒得到,提取 经常修改的注册表值、经常操作的文件目录、经常创建的进程等
3、驱动层将PID和操作值发往应用层,应用层为每一个PID维护一个容器
应用层调用Check_In_Vector(ProcessName,iPid,Type,String,Kind,PID); 为每一个PID填充以下结构:
struct Query_Pass
{
char ProcessName[256];
int PID; //进程PID
int TID; //线程TID
int LoadDriver; //是否加载驱动
int CreateRemoteThread; //是否创建远程线程
int CreatePro; //是否创建敏感进程
int FileOperation; //是否操作敏感文件夹
int RegOperation; //是否操作敏感注册表
int ConnectInternet;
char Pid[16];
char Tid[16];
BOOL IsMulware;
};
接着调用
Check_PID_Operations(iPid);判断违规情况
调用DealWithProcess(iPid,PID);对进程进行处理,当时时间有限,处理不好,结束进程和挂起进程都有问题
最后显示警告对话框 Pro_Waring(iPid,PID);
其他:
扩展性不佳
A、在驱动FakeFunction里面填充发往应用层的信息格式如下:
strcat(aPathName,"^^<>");
BOOL GoOrNot(char *fathername,char *procname,char *Pid)
{
char buff[512] = {0};
ULONG a;
LARGE_INTEGER li; li.QuadPart=-10000;
KeWaitForSingleObject(&event,Executive,KernelMode,0,0);
strcpy(buff,fathername);
strcat(buff,procname);
strcat(buff,Pid);
strncpy(&output[8],buff,sizeof(buff));
a = 1;
memmove(&output[0],&a,4);
while (1)
{
KeDelayExecutionThread(KernelMode,0,&li);
memmove(&a,&output[0],4);
if (!a)
{
break;
}
}
memmove(&a,&output[4],4);
KeSetEvent(&event,0,0);
return a;
}
在应用层要分离这种特殊符号会很麻烦
B、而曾经尝试这种方式:
void ProGoOrNot(int kind,int type,int Pid,char *cPid,char *ProcessPath,char *Value1,char *Value2)
{
PDEVICE_EXTENSION deviceExtension;
KdPrint(("ProGoOrNot"));
deviceExtension=(PDEVICE_EXTENSION)g_pDriverObject->DeviceExtension;
deviceExtension->kind=kind;
deviceExtension->type=type;
deviceExtension->Pid=Pid;
strcpy(deviceExtension->cPid,cPid);
strcpy(deviceExtension->Value1,Value1);
strcpy(deviceExtension->Value2,Value2);
strcpy(deviceExtension->ProcessPath,ProcessPath);
KeClearEvent(ProAppEvent);
KeSetEvent(deviceExtension->ProEvent,0,FALSE);
KeClearEvent(deviceExtension->ProEvent);
KeWaitForSingleObject(ProAppEvent,Executive,KernelMode,0,NULL);
KeClearEvent(ProAppEvent);
}
在应用层也好提取,但是使用了CString类使得程序死卡死,不知为何,MessageBox测试也很卡
while (::WaitForSingleObject(hProcessEvent, INFINITE)==WAIT_OBJECT_0)
{
DWORD dwRet;
BOOL bRet;
bRet = ::DeviceIoControl(
FileMon.hDriver,
IOCTL_GET_RING0_INFO,
NULL,
0,
&callbackinfo,
sizeof(callbackinfo)+64,
&dwRet,
NULL);
if (bRet)
{
MessageBox(0,"删除文件 ","",MB_OK); 这里会很卡,半天不弹出来
//MessageBox(0,callbackinfo.Value1,"",MB_OK);
//MessageBox(0,callbackinfo.cPid,"",MB_OK);
//MessageBox(0,callbackinfo.ProcessPath,"",MB_OK);
}
2、进行了一些进程关联处理,比如A调用B加载驱动,可以选择同时结束A和B
3、还有一个修改于寒江独钓的TDI驱动,用于记录网络行为,但是时间有限,最后没有加入规则当中
4、1、驱动卸载蓝屏BUG未解决
2、未对Esc按键进行屏蔽,可能导致程序退出而驱动未卸载
5、效果如下
6、源文件
可执行程序.rar
源代码.rar
7、界面的点滴变化
界面.pdf
[课程]Android-CTF解题方法汇总!
上传的附件: