可能大家对任务管理器里最熟悉功能要数进程管理了常常我们在怀疑中了病毒/木马时候都会看看任务管理器里有没有什么特别进程在运行所以进程查看器应该是个非常重要功能我们除了需要获得进程名称外还有什么呢?当然包括它进程标识符(ProcessID)用户信息(UserName)CPU使用时间(CPUTime)和存储器使用情况(MemoryUsage)还有它优先权(BasePriority)CPU和Memory信息可以帮助我们分析进程运行情况而优先权可以表示进程在CPU分配处理器使用时优先情况这些都是通用进程信息让我们再看看其他信息吧进程父进程标识符(Parent Process ID)创建时间(Create Time)名称等在很多情况下也是我们关心信息我们再看看进程相关性能信息在Windows下通常有两种模式:内核模式(Kernel: Level 0)和用户模式(User: Level 3)进程往往在两种模式中来回切换所以可以获得进程在内核模式和用户模式各自使用时间同时还包括进程相关工作集(WorkingSet)分页池(PagedPool)非分页池(NonePagedPool)和页面文件(PageFile)信息进程相关I/O操作包括读/写/其他等动作我们可以获得这些操作次数和传送数据数量
如果您怀疑某个进程是木马那您还想获得哪些信息呢?简单进程名称应该是不够吧!我们希望获得进程实际路径这样可以帮助我们判断究竟是那个在运行前段时间不是在讨论什么进程隐藏其中种就是“创建远程线程”而注体往往又是以动态链接库(DLL)形式存在我们就希望看到某个具体进程所包含所有模块(Module)常常是DLL也“线程”是个大家熟悉名字它是Windows系统中实现体而进程则是线程运行环境个进程到底创建了多少线程了?我们同样可以枚举进程内部所有线程信息如果您发现个木马进程下面动作就应该是分析它运行机制(如果您对它感兴趣)不过最终您还是要将它结束吧在Windows2k下很多系统关键进程在TaskMgr里是不能被结束不过现在您不用担心了好对进程操作当然就包括结束进程如果您用过中文XP您是否常常遇到任务栏“假死”情况虽然您电脑没有挂掉但却动弹不得那好我们也同样可以将任意进程挂起来不管您对它做什么动作(除了结束)它都不会有任何反应有了挂起进程同样我们也可以将进程从“挂起”状态激活
桌面窗口是大家接触得最多交互界面了您是否想获得每个窗口标题信息呢?当然我们还可以获得和窗口关联进程线程和窗口句柄属性如果大家对VC比较熟悉就应该知道其中个SPY工具吧它就可以获得桌面窗口进程和线程详细信息不过现在就不用打开这个打开那个了通通搞定了!
系统性能是每个用户关心话题它包括整个系统当前创建句柄进程以及线程数目还有物理存储器(Physical Memory)总量和使用情况系统高速缓存Cache( Cache)大小存储器保留和提交(Commit Charge)状况当然还有核心分页/非分页池(Kernel Memory)使用情况几乎包括了Windows系统下存储器管理大部分信息
虽然现在硬盘价格已经很低了不过我还是在用6.4G小东东所以常常遇到“Low Disk”!我们常常要看看硬盘使用情况不过每次都要进入我电脑太麻烦了而我们现在可以次了解所有磁盘容量和当前使用情况同时还有它们格式类型(如FAT,NTFS,CDFS等)和磁盘标签
说到环境块或许不是那么熟悉吧它包含些环境变量而每个环境变量对应个/多个串您可以在控制面板SYSTEM/Advanced(系统/高级)里对它们进行设置包括添加新环境变量删除和编辑系统环境变量
事件记录对我们分析系统使用情况有很大帮助事件记录分为 3种:应用系统和安全而对应每种事件又可以分为几种类型它们分别是常规信息警告和其中包括记录序号(Record Number)事件类型(Type)标识符(Event ID)来源(Source)产生时间(Time Generated)用户名(User)和相关描述信息(Description)有时间大家可以多看看事件信息当然每个网络管理员对它们应该是很熟悉不过还包括其他事件日志信息
Windows系统下ipconfig /all这个命令我是常常用我们使用是DHCP没事看看自己IP地址变了没有其中包括详细网络适配器信息包括适配器名称描述硬件地址和类型IP地址及相应子网掩码网关和DHCP服务器地址等不过您是否对网络流量也感兴趣呢?我们当然可以获得主机接受/发送了多少(非)广播数据报出现了多少共接受/发送了多少信息这些对每个网友都是有用信息哟
网络共享往往是大家注意地方您究竟共享了多少信息它们文件路径是什么还有它们共享类型信息我们在不需要某些共享资料时当然不要忘了将其删除以免泄露自己机密信息
WindowsNT是个多用户系统允许多种类型用户存在我们希望获得用户账号使用期限(Password Expired)记住要不定时修改用户密码哟以及用户标识符(User ID)组标识符(Group ID)还有用户账号类型(Type)区别类型有区别权限我们当然希望有最High权力哟!看看系统对某个账号磁盘空间使用情况是否有限制(Max Storage)账号登录次数(Number Of Logon)和登录时间信息(Logon Hours)等对我们分析用户使用情况也有帮助
系统Win32服务和设备驱动信息也是很重要我们希望探测每个服务/设备启动具体路径状态类型启动方式等等信息我们还希望对服务进行控制比如停止启动和删除操作
关机也不是那么单调您可以注销自己系统如果您要离开当然就需要锁定了最近大家都不喜欢关机太麻烦了所以都习惯使用冬眠系统将会为我们保留当前信息不过还有支持电源管理关机和休眠Windows2000用户注意了我们同样可以使用XP系统下带有到记时和消息提示关机和重启功能了
系统版本信息是比较固定主要包括操作系统指纹注册组织/用户主机名和系统相关目录等信息
说了这么多我们也该谈谈如何实现了
1.窗口信息
MS为我们提供了打开特定桌面和枚举桌面窗口
hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);
//打开我们默认Default桌面;
EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);
//枚举打开桌面上所有窗口由回调实现
BOOL __stdcall EnumWindowProc(HWND, LPARAM);
//在回调中我们可以获得窗口标题和相关进程线程信息;
GetWindowText(hWnd,szWindowText,dwMaxCount);
GetWindowThreadProcessId(hWnd,&dwPID);
2.设备驱动器信息(服务和设备驱动器差不多在此不做重复)
设备驱动信息有服务控制管理器(SCM)来管理我要打开服务控制管理器并枚举所有设备驱动器
OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
//以所有权限打开服务控制管理器;
EnumServicesStatus(schManager,dwDeviceType,dwDeviceState,
EnumStatus,dwBufSize,&dwBytesNeeded,
&dwDevicesReturned,&dwResumeHandle))
//枚举所有设备当前状态;
CloseServiceHandle(schManager);
//记住在结束访问后要关闭服务句柄;
OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS);
//打开特定设备驱动器;
QueryServiceConfig(schDevice,lpDeviceConfig,
1024*8,&dwBytesNeeded);
//查询驱动器服务配置信息;
QueryServiceStatus(schDevice,&DeviceStatus);
//查询设备驱动器当前状态;
QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION,
(LPBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded)
//查询设备描述信息;
StartService(schDevice,0,NULL);
//启动设备;
ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus);
//停止设备;
DeleteService(schDevice);
//删除设备;
3.磁盘信息
我们希望获得系统所有磁盘信息包括软盘硬盘光盘等等;
GetLogicalDriveStrings(dwBufferLength,lpBuffer);
//获得逻辑设备信息;
GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,
dwVolumeNameSize,&dwVolumeSerialNumber,
&dwMaximumComponentLength,&dwFileFlags,
lpFileNameBuffer,dwFileNameSize);
//获得磁盘卷信息包括卷名称和格式类型;
GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable,
&TotalNumberOfBytes,&TotalNumberOfFreeBytes);
//探测磁盘空间使用情况;
4.环境变量
我们可以从注册表中获得环境块信息:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment当然要使用注册表
RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_VALUE,&hKey);
//打开注册表键;
RegEnumValue(hKey,dwIndex,EnvironVariable,
&dwVariableLength,NULL,NULL,NULL,NULL);
//查询我们需要信息值;
GetEnvironmentVariable(EnvironVariable,EnvironString,1024);
//获得环境变量串信息;
5.事件记录信息
OpenEventLog(NULL,szLog);
//打开时间日志记录;
GetOldestEventLogRecord(hEvent,&dwThisRecord);
//获得最新日志信息以便继续查找;
ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,
0,pEventLogRecord,1024*32,&dwRead,&dwNeeded)
//读去日志信息;
LookupAccountSid(NULL,pSid,szName,&dwName,szDo,&dwDo,&SNU);
//获取账户SID以便获得账户用户名称;
GetNumberOfEventLogRecords(hEvent,&dwTotal);
//获得事件日志总数;
CloseEventLog(hEvent);
//不要忘记关闭事件句柄;
6.网络共享
我们使用第 2等级网络共享搜索;
NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume);
//列举所有共享目录及相关信息;
NetApiBufferFree(pBuf);
//释放缓冲区;
NetShareDel(NULL,(char *)lpShareNameW,0);
//删除网络共享目录;
7.网络适配器信息
我们要探测NIC信息和网络流量;
GetAdaptersInfo(&AdapterInfo,&OutBufLen);
//获取适配器信息;
8.系统性能
获取系统存储器使用情况;
GetPerformanceInfo(&PerfInfo,(PERFORMACE_INFORMATION))
//获取系统性能信息;
9.进程/线程/模块信息
在此我们使用工具帮助(ToolHelp32)和系统
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken);
//打开进程令牌提升权限;
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,(TOKEN_PRIVILEGES),NULL,NULL);
//将进程权限提升到支持调试(Debug);
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//创建进程快照;
Process32First(hProcessSnap,&ProcessEntry32);
Process32First(hProcessSnap,&ProcessEntry32);
//枚举所有进程;
OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID);
//打开特定进程以查询进程相关信息;
GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime);
//获取进程时间信息;
GetProcessMemoryInfo(hProcess,&PMCounter,(PMCounter));
//获取进程存储区信息;
GetPriorityClass(hProcess);
//获取进程优先权;
GetProcessIoCounters(hProcess,&IoCounters);
//获取进程IO使用情况;
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);
//创建模块快照;
Module32First(hModuleSnap, &ModuleEntry32);
Module32Next(hModuleSnap, &ModuleEntry32);
//枚举进程模块信息;
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
//创建线程快照;
Thread32First(hThreadSnap, &ThreadEntry32);
Thread32Next(hThreadSnap, &ThreadEntry32);
//枚举线程信息;
OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID);
//打开线程须自己获得此地址;
TerminateProcess(hProcess,0);
//终止进程;
SuspendThread(hThread);
//悬挂线程;
ResumeThread(hThread);
//激活线程;
10.关机
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,(TOKEN_PRIVILEGES),NULL,NULL);
//调整进程令牌使其支持关机;
ExitWindowsEx(EWX_LOGOFF,0);
//注销系统;
LockWorkStation();
//锁定系统;
InitiateShutdown(NULL,szMessage,dwTimeout,FALSE,bSig);
//支持到记时和消息显示关机/重启;
SetPowerState(bSig,FALSE);
//系统休眠/冬眠;
11.用户信息
NetUserEnum(NULL,dwLevel,FILTER_NORMAL_ACCOUNT,(LPBYTE*)&pBuf, dwPrefMaxLen,&dwEntriesRead,&dwTotalEntries,&dwResumeHandle);
//枚举系统用户信息;
NetUserDel(NULL,lpUserNameW);
//删除指定用户;
12.系统版本信息
GetVersionEx((LPOSVERSIONINFO)&osviex);
//获取操作系统版本信息;
我们也可以通过注册表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion)获取相关信息:
GetTickCount();
//获取开机时间;
GetComputerName(szInfo,&dwInfo);
//获取计算机名称;
GetUserName(szInfo,&dwInfo);
//获取计算机用户名;
GetWindowsDirectory(szInfo,MAX_PATH+1);
//获取Windows目录;
GetDirectory(szInfo,MAX_PATH+1);
//获取系统目录;
小结:
虽然我们现在已经实现了任务管理器各项功能甚至比Windows自带功能还要强大不过却没有什么兴奋感觉看看我们代码您就会发现那些都是直接Win32API但是我们清楚系统底层究竟是如何实现吗?不管我们是否只是为了实现个功能还是对操作系统感兴趣我们都应该更多对系统底层进行研究而不仅仅是只会使用高层员虽然微软为我们隐藏了很多内部细节但正是这种底层秘密激发了我们对其进行深入研究兴趣和动力
最新评论