近段时间国内游戏行业发展一片大好,其衍生产品也是数不剩数.近日拿到一反XX系统的驱动,偷得闲看来玩玩 稍有心得,于此与大家共享
所逆的代码力求尽量忠于源码,驱动某几部分中几个逻辑比较复杂的地方仍然没有做优化,照葫芦画飘的写了出来.如有疏漏 敬请指正
此驱动的大致工作流程就是在DriverDispatch时通过应用层控制Hook SSDT两张表(此部分做的有些问题,貌似在某些情况下对第二张较少使用的表的HOOK会因为没有使用Shadow而无效) HOOK 中断,以及一些其他的反调试技术.
今日贴出其DriverEntry部分代码,其他函数将在近日内贴出.因涉及敏感问题,所以某些重要字符串以及代码作了些修改和省略 重在学习
ULONG OSVesion=0;
#define OS_WIN2K 0x01
#define OS_WINXP 0x02
#define OS_WIN2K3 0x03
#define OS_WINVISTA 0x04
inline VOID SetOSVersion(INT MajorVer,INT MinorVer);
LARGE_INTEGER CurrentTime;
//定义几个WIN32KSSDT表里函数的对应INDEX.具体函数名字省略
ULONG NtFuntion1 ;
ULONG NtFuntion2 ;
ULONG NtFuntion3 ;
ULONG NtFuntion4 ;
ULONG NtFuntion5 ;
ULONG NtFuntion6 ;
//HOOK校验 ,检测有没被脱钩或者2次挂钩
BYTE m_INTHookCheck[20];
PVOID AllocSec;
_declspec(naked) INTHook(VOID);
//此函数功能为检测DR6状态,看是否是由于硬件断点引起
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
NTSTATUS ntStatus;
ULONG MajorVersion=0;
ULONG DeviceObject=0;
ULONG MinorVersion=0;
ULONG BuildNumber=0;
PUNICODE_STRING DeviceNameString;
PUNICODE_STRING SymbolicLinkName;
PUNICODE_STRING NTDeviceName="\\Device\\DeviceName";
PUNICODE_STRING DosDeviceName="\\DosDevices\\DosDeviceName";
PsGetVersion(&MajorVersion,&MinorVersion,&BuildNumber,NULL);
SetOSVersion(MajorVersion,MinorVersion);
if((OSVesion==0)||(OSVersion>4)) ntStatus=STATUS_NOT_SUPPORTED;
else
{
//可识别的OS,首先保存自身断点Hook Handle头DWORD,后边用于检测是否被修改
memcpy(m_INT1HookCheck,INT1Hook,20);
switch(OSVersion)
{
case 1: //Win2K
{
//这里就是对那几个INDEX对应的操作系统里的INDEX硬编码,代码省略.下同
}
break;
case 2://WinXP
{
}
break;
case 3://Win2003
{
}
break;
case 4://Vista
{
}
break;
}
KeQuerySystemTime(&CurrentTime);
AllocSec=MmAllocateNonCachedMemory(0x2000);
if(AllocSec!=NULL) memset(AllocSec,0,0x800);
RtlInitUnicodeString(&DeviceNameString, NTDeviceName);
//安装驱动程序
ntStatus = IoCreateDevice(DriverObject, 0, &DeviceNameString, ????, 0, TRUE, &DeviceObject);
if ( NT_SUCCESS(ntStatus) )
{
// 创建符号链,Win32 apps将其导入链表允许其通过驱动器/驱动程序
RtlInitUnicodeString(&DeviceNameString,DosDeviceName);
ntStatus = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceNameString);
//....
// 创建指针用以驱动程序的控制和创建
DriverObject->MajorFunction[IRP_MJ_CREATE] = DrvDispatch
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DrvDispatch;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;
DriverObject->DriverUnload = DrvUnload;
if ( NT_SUCESS(nStatus) ) KeLowerIrql(KeRaiseIrqlToDpcLevel());
else
{
if( DeviceObject != NULL)
{
IoDeleteSymbolicLink(&SymbolicLinkName);
DeleteDevice(&DeviceObject);
}
}
}
ntStatus = DeviceObject;
};
return nStatus;
}
Dispatch函数在11楼.
- 标 题: 某反XX系统驱动部分逆向(连载)
- 作 者:shrrrr
- 时 间:2007-07-13 00:50
- 链 接:http://bbs.pediy.com/showthread.php?t=47929