首页
社区
课程
招聘
[原创]Tp已经pass Only win7 32下面讲解方法
发表于: 2013-8-7 16:46 36319

[原创]Tp已经pass Only win7 32下面讲解方法

2013-8-7 16:46
36319

TP技术难点:
1.双机调试
2.TesSafe自身模块硬断检测和自身CRC检测
3.DebugOjbetType权值清零
4.DebugPort清零

1解决了  2放弃  3Pass  4Pass  a half

讲解3.
直接上笔记和码
nt!NtDebugActiveProcess+0x9a:
84cb8e4a 341b            xor     al,1Bh

nt!NtCreateDebugObject+0x60:
84cb7f53 341b            xor     al,1Bh

nt!NtWaitForDebugEvent+0xb5:
84cb920a 341b            xor     al,1Bh

nt!NtDebugContinue+0x82:
84cb94f3 341b            xor     al,1Bh

nt!NtRemoveProcessDebug+0x6d:

这里使系统函数调用了dbgkdebugobjecttype我们要替换他  
换成我们自己造好的

#ifndef VALIDACCESSMASK
#define VALIDACCESSMASK


#define OBJECT_TO_OBJECT_HEADER( o ) CONTAINING_RECORD( (o), OBJECT_HEADER_WIN7, Body ) 


typedef struct _OBJECT_DIRECTORY_ENTRY_WIN7{
	struct _OBJECT_DIRECTORY_ENTRY_WIN7 *ChainLink;
	PVOID Object;
	ULONG HashValue;
} OBJECT_DIRECTORY_ENTRY_WIN7, *POBJECT_DIRECTORY_ENTRY_WIN7;


typedef struct _OBJECT_TYPE_INITIALIZER_WIN7 {

	USHORT Length     ;
	USHORT type       ;
	//+0x002 ObjectTypeFlags  : UChar
	//+0x002 CaseInsensitive  : Pos 0, 1 Bit
	//+0x002 UnnamedObjectsOnly : Pos 1, 1 Bit
	//+0x002 UseDefaultObject : Pos 2, 1 Bit
	//+0x002 SecurityRequired : Pos 3, 1 Bit
	//+0x002 MaintainHandleCount : Pos 4, 1 Bit
	//+0x002 MaintainTypeList : Pos 5, 1 Bit
	PVOID ObjectTypeCode   ;
	PVOID InvalidAttributes ;
	GENERIC_MAPPING GenericMapping   ;
	PVOID ValidAccessMask  ;
	PVOID RetainAccess     ;
	POOL_TYPE PoolType      ;
	PVOID DefaultPagedPoolCharge ;
	PVOID DefaultNonPagedPoolCharge ;
	PVOID DumpProcedure    ;
	PVOID OpenProcedure    ;
	PVOID CloseProcedure   ;
	PVOID DeleteProcedure  ;
	PVOID ParseProcedure   ;
	PVOID SecurityProcedure ;
	PVOID QueryNameProcedure ;
	USHORT OkayToCloseProcedure ;

} OBJECT_TYPE_INITIALIZER_WIN7, *POBJECT_TYPE_INITIALIZER_WIN7;

typedef struct _OBJECT_CREATE_INFORMATION_WIN7 { 
	ULONG Attributes; 
	HANDLE RootDirectory; 
	KPROCESSOR_MODE ProbeMode; 
	ULONG PagedPoolCharge; 
	ULONG NonPagedPoolCharge; 
	ULONG SecurityDescriptorCharge; 
	PVOID SecurityDescriptor; 
	PSECURITY_QUALITY_OF_SERVICE SecurityQos; 
	SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService; 
} OBJECT_CREATE_INFORMATION_WIN7, *POBJECT_CREATE_INFORMATION_WIN7;

typedef struct _OBJECT_TYPE_WIN7 {
	LIST_ENTRY TypeList;         //         : _LIST_ENTRY
	UNICODE_STRING Name;         //             : _UNICODE_STRING
	PVOID DefaultObject;         //    : Ptr32 Void
	ULONG Index;         //            : UChar
	ULONG TotalNumberOfObjects;         // : Uint4B
	ULONG TotalNumberOfHandles;         // : Uint4B
	ULONG HighWaterNumberOfObjects;         // : Uint4B
	ULONG HighWaterNumberOfHandles;         // : Uint4B
	OBJECT_TYPE_INITIALIZER_WIN7 TypeInfo;         //         : _OBJECT_TYPE_INITIALIZER
	PVOID TypeLock;         //         : _EX_PUSH_LOCK
	ULONG Key;         //              : Uint4B
	LIST_ENTRY CallbackList;         //     : _LIST_ENTRY
} OBJECT_TYPE_WIN7, *POBJECT_TYPE_WIN7;

typedef struct _OBJECT_HEADER_WIN7 {
	//对象头部的指针计数,对对象头指针引用的计数
	LONG_PTR PointerCount;
	union {
		//句柄引用计数
		LONG_PTR HandleCount;
		PVOID NextToFree;
	};
	POBJECT_TYPE Type;
	//OBJECT_HEADER_NAME_INFO相对于此结构的偏移
	UCHAR NameInfoOffset;
	//OBJECT_HEADER_HANDLE_INFO相对于此结构的偏移
	UCHAR HandleInfoOffset;
	//OBJECT_HEADER_QUOTA_INFO相对于此结构的偏移
	UCHAR QuotaInfoOffset;
	UCHAR Flags;

	union {
		//创建对象是用于创建对象附加头的结构
		//里面保存了和附加对象头类似的信息
		PVOID ObjectCreateInfo;
		PVOID QuotaBlockCharged;
	};
	PSECURITY_DESCRIPTOR SecurityDescriptor;
	QUAD Body;
} OBJECT_HEADER_WIN7, *POBJECT_HEADER_WIN7;






EXTERN_C
{
	NTKERNELAPI 
		NTSTATUS
		ObCreateObjectType(
		__in PUNICODE_STRING TypeName,
		__in POBJECT_TYPE_INITIALIZER_WIN7 ObjectTypeInitializer,
		__in_opt PSECURITY_DESCRIPTOR SecurityDesorintor,
		__in POBJECT_TYPE_WIN7 *ObjectType

		);


	NTKERNELAPI 
		PVOID
		ObGetObjectType(
		__in PVOID pObject
		);


}


ULONG DbgkDebugObjectType=NULL;
ULONG DbgkMyDebugObjectType=NULL;

POBJECT_TYPE_WIN7 MyDebugObjectType=NULL;

OBJECT_TYPE_INITIALIZER_WIN7 ObjectTypeInitializer;


void CreateMyDebugObjectType(POBJECT_TYPE_WIN7 tmpObjectType,UNICODE_STRING MyObjectTypeName)
{




	RtlZeroMemory(&ObjectTypeInitializer,sizeof(ObjectTypeInitializer));
	ObjectTypeInitializer.Length=tmpObjectType->TypeInfo.Length;
	ObjectTypeInitializer.ObjectTypeCode=tmpObjectType->TypeInfo.ObjectTypeCode;
	ObjectTypeInitializer.InvalidAttributes=tmpObjectType->TypeInfo.InvalidAttributes;
	ObjectTypeInitializer.GenericMapping=tmpObjectType->TypeInfo.GenericMapping;
	ObjectTypeInitializer.ValidAccessMask=(PVOID) 0x001fffff;
	ObjectTypeInitializer.RetainAccess=tmpObjectType->TypeInfo.RetainAccess;
	ObjectTypeInitializer.PoolType=tmpObjectType->TypeInfo.PoolType;
	ObjectTypeInitializer.DefaultPagedPoolCharge=tmpObjectType->TypeInfo.DefaultPagedPoolCharge;
	ObjectTypeInitializer.DefaultNonPagedPoolCharge=tmpObjectType->TypeInfo.DefaultNonPagedPoolCharge;


	ObjectTypeInitializer.DumpProcedure=tmpObjectType->TypeInfo.DumpProcedure;
	ObjectTypeInitializer.OpenProcedure=tmpObjectType->TypeInfo.OpenProcedure;
	ObjectTypeInitializer.CloseProcedure=tmpObjectType->TypeInfo.CloseProcedure;
	ObjectTypeInitializer.DeleteProcedure=tmpObjectType->TypeInfo.DeleteProcedure;
	ObjectTypeInitializer.ParseProcedure=tmpObjectType->TypeInfo.ParseProcedure;
	ObjectTypeInitializer.SecurityProcedure=tmpObjectType->TypeInfo.SecurityProcedure;
	ObjectTypeInitializer.QueryNameProcedure=tmpObjectType->TypeInfo.QueryNameProcedure;
	ObjectTypeInitializer.OkayToCloseProcedure=tmpObjectType->TypeInfo.OkayToCloseProcedure;


	ObCreateObjectType(&MyObjectTypeName,&ObjectTypeInitializer,(PSECURITY_DESCRIPTOR)NULL,&MyDebugObjectType);

}


void InitMyDebugOjbetType(ULONG pObjectType)
{
		UNICODE_STRING MyObjectTypeName;
		POBJECT_TYPE_WIN7 tmpObjectType=(POBJECT_TYPE_WIN7)*(ULONG *)pObjectType;
		RtlInitUnicodeString(&MyObjectTypeName,L"MyDebugObject");
		if(MyDebugObjectType==NULL)
		{

			CreateMyDebugObjectType(tmpObjectType,MyObjectTypeName);
			DbgPrint("CreateMyDebugObjectType is succeed!!\n");
		}
		if (MyDebugObjectType!=NULL)
		{
			//*(DWORD *)pObjectType=(ULONG)MyFirstType;
			DbgPrint("pObObjectType is %x !\n",(ULONG *)pObjectType);
		}
		else
		{
			DbgPrint("CreateMyDebugObjectType is failed!\n");
		}
}
bool PickUpObjectType(ULONG pObjectType,PWCH Name)
{
	UNICODE_STRING CmpName;
	POBJECT_TYPE_WIN7 tmpObjectType=(POBJECT_TYPE_WIN7)*(ULONG *)pObjectType;
	CmpName.Length=tmpObjectType->Name.Length;
	CmpName.Buffer=Name;//如果字符串2超过字符串1长度,那么不管超出部分怎么填都是对的
	//DbgPrint("TestObjectType is %S!\n",CmpName.Buffer);
	if(RtlEqualUnicodeString(&tmpObjectType->Name,&CmpName,FALSE))
	{
		
		return true;
		
		
	}
	return false;
}

POBJECT_TYPE GetObpTypeObjectType_Win7()
{
	PUCHAR addr,p;
	UNICODE_STRING usObCreateObjectType;
	POBJECT_TYPE _ObpTypeObjectType=NULL;
	RtlInitUnicodeString(&usObCreateObjectType,L"ObCreateObjectType");
	addr=(PUCHAR)MmGetSystemRoutineAddress(&usObCreateObjectType);
	ASSERT(addr!=NULL);
	DbgPrint("ObCreateObjectType=0x%08x\n",addr);
	for (p=addr;p<addr+PAGE_SIZE;p++)
	{
		if ((*(PUCHAR)p==0xa1) && (*(PUCHAR)(p+5)==0xbb))
		{
			_ObpTypeObjectType=(POBJECT_TYPE)(*(PULONG)(p+1));
			DbgPrint("ObpTypeObjectType=0x%08x\n",_ObpTypeObjectType);
			return _ObpTypeObjectType;
		}
	}
	if (p==addr+PAGE_SIZE)
		DbgPrint("Cannot find ObpTypeObjectType!\n");
	return NULL;
}

void EnumObjectType_Win7()
{
	ULONG OffsetObjectTypeName;
	ULONG OffsetCreatorInfoObject;
	ULONG OffsetObjectIndexObjectType;
	POBJECT_TYPE ObpTypeObjectType;
	ULONG ObjectTypeTable[50]={0};
	int i=0;

	ULONG_PTR TypeObjectAddr;
	PLIST_ENTRY TypeObjectCreatorInfo;
	PLIST_ENTRY NextEntry;
	RTL_OSVERSIONINFOW VersionInformation;

	RtlGetVersion(&VersionInformation);

	if (VersionInformation.dwMajorVersion==6)//win7
	{
		OffsetObjectTypeName=0x08;
		OffsetCreatorInfoObject=0x28;
		OffsetObjectIndexObjectType=0x14;
		ObpTypeObjectType=GetObpTypeObjectType_Win7();
	}
	for(i=0;i<50;i++)
	{
		ObjectTypeTable[i]=(ULONG)ObpTypeObjectType+sizeof(ULONG)*i;
		
	}
	i=3;
	TypeObjectAddr=*(PULONG_PTR)ObpTypeObjectType;
	TypeObjectCreatorInfo=(PLIST_ENTRY)(TypeObjectAddr-OffsetCreatorInfoObject);
	NextEntry=TypeObjectCreatorInfo;
	while (NextEntry->Flink!=TypeObjectCreatorInfo)
	{
		
		if (PickUpObjectType(ObjectTypeTable[i],L"DebugObject"))
		{
			InitMyDebugOjbetType(ObjectTypeTable[i]);
		}
		if (PickUpObjectType(ObjectTypeTable[i],L"MyDebugObject"))
		{
			DbgkMyDebugObjectType=ObjectTypeTable[i];
			DbgPrint("DbgkMyDebugObjectType is %x !\n",DbgkMyDebugObjectType);
		}
		DbgPrint("TypeAddr=0x%08x,TypeName=%wZ,TypeIndex=%d\n",
			(ULONG_PTR)NextEntry+OffsetCreatorInfoObject,
			(PUNICODE_STRING)((ULONG_PTR)NextEntry+OffsetCreatorInfoObject+OffsetObjectTypeName),
			*(PUCHAR)((ULONG_PTR)NextEntry+OffsetCreatorInfoObject+OffsetObjectIndexObjectType));
		NextEntry=NextEntry->Flink;
		i++;

	}

}

void DeleteMyDebugObjectType()
{
	if (MyDebugObjectType!=NULL)
	{
		//ObMakeTemporaryObject(MyDebugObjectType);
		ObfDereferenceObject(MyDebugObjectType);
	}
}

void PatchDebugObjectType()

{

	DbgkDebugObjectType=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
	DbgkDebugObjectType=*(PULONG)DbgkDebugObjectType;
	ULONG PassNtDebugActiveProcess=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
	ULONG PassNtCreateDebugObject=(ULONG)GetSSDTFunctionAddr(61)+0x60;
	ULONG PassNtWaitForDebugEvent=(ULONG)GetSSDTFunctionAddr(387)+0xb5;
	ULONG PassNtDebugContinue=(ULONG)GetSSDTFunctionAddr(97)+0x82;
	ULONG PassNtRemoveProcessDebug=(ULONG)GetSSDTFunctionAddr(289)+0x6d;
	DbgPrint("DbgkDebugObjectType is %x!\n",*(PULONG)DbgkDebugObjectType);
	DbgPrint("PassNtDebugActiveProcess is %x!\n",*(PULONG)PassNtDebugActiveProcess);
	DbgPrint("PassNtCreateDebugObject is %x!\n", *(PULONG)PassNtCreateDebugObject);
	DbgPrint("PassNtCreateDebugObject is %x!\n",*(PULONG)PassNtWaitForDebugEvent);
	DbgPrint("PassNtWaitForDebugEvent is %x!\n",*(PULONG)PassNtDebugContinue);
	DbgPrint("PassNtRemoveProcessDebug is %x!\n",*(PULONG)PassNtRemoveProcessDebug);
	DbgPrint("DbgkMyDebugObjectType is %x!\n",DbgkMyDebugObjectType);
	if(DbgkMyDebugObjectType!=NULL)
	{
		WPOFF();
		KIRQL uKirql;
		uKirql =KeRaiseIrqlToSynchLevel();
		*(PULONG)PassNtDebugActiveProcess=DbgkMyDebugObjectType;
		*(PULONG)PassNtCreateDebugObject=DbgkMyDebugObjectType;
		*(PULONG)PassNtWaitForDebugEvent=DbgkMyDebugObjectType;
		*(PULONG)PassNtDebugContinue=DbgkMyDebugObjectType;
		*(PULONG)PassNtRemoveProcessDebug=DbgkMyDebugObjectType;
		KeLowerIrql(uKirql);
		WPON();
		DbgPrint("PatchDebugObjectType is succeed!\n");
	}
	else
	{
		DbgPrint("PatchDebugObjectType is failed!\n");
	}


}
void UnPatchDebugObjectType()
{


	ULONG PassNtDebugActiveProcess=(ULONG)GetSSDTFunctionAddr(96)+0x9a;
	ULONG PassNtCreateDebugObject=(ULONG)GetSSDTFunctionAddr(61)+0x60;
	ULONG PassNtWaitForDebugEvent=(ULONG)GetSSDTFunctionAddr(387)+0xb5;
	ULONG PassNtDebugContinue=(ULONG)GetSSDTFunctionAddr(97)+0x82;
	ULONG PassNtRemoveProcessDebug=(ULONG)GetSSDTFunctionAddr(289)+0x6d;

	if(DbgkDebugObjectType!=NULL)
	{
		WPOFF();
		KIRQL uKirql;
		uKirql =KeRaiseIrqlToSynchLevel();
		*(PULONG)PassNtDebugActiveProcess=DbgkDebugObjectType;
		*(PULONG)PassNtCreateDebugObject=DbgkDebugObjectType;
		*(PULONG)PassNtWaitForDebugEvent=DbgkDebugObjectType;
		*(PULONG)PassNtDebugContinue=DbgkDebugObjectType;
		*(PULONG)PassNtRemoveProcessDebug=DbgkDebugObjectType;
		KeLowerIrql(uKirql);
		WPON();
		DbgPrint("UnPatchDebugObjectType is succeed!\n");
	}
	else
	{
		DbgPrint("UnPatchDebugObjectType is failed!\n");
	}


}

void AntiValidAccessMask()
{
	EnumObjectType_Win7();
	PatchDebugObjectType();
}


void UnAntiValidAccessMask()
{
	UnPatchDebugObjectType();
	DeleteMyDebugObjectType();
}

#endif

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (42)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排招租!!!
2013-8-7 16:47
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
前排顶一下
2013-8-7 16:52
0
雪    币: 27
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
马克一下。
2013-8-7 17:01
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
自己构建调试子系统的路过...
至于非法的问题,是因为没有隐藏好
2013-8-7 17:02
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
你是指隐藏什么?非法是因为debugprot!
2013-8-7 17:04
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
进程,对象,窗口,句柄...
很多很多,包括调试对象,调试句柄...
它为什么非法?因为它可以识别到你
为什么它可以识别?因为你是用系统的东西,由系统机制创建的进程和系统的调试机制
而系统的东西,作为驱动保护,它会不知道吗?
所以最好的方式就是自己去构建,根本就不用系统的东西,可以少用,敏感的东西都不用
这样一来它就不认识你或很难识别,只能自己识别,所以也只能自己用
能达到这种程度,是要下很大功夫的,但是好处就是可以ANTI很多驱动保护,这可是很诱人的
2013-8-7 18:00
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
自己构建调试子系统的理论依旧能说下
或者发个科普贴

我想说说我的看法
1.ring3的应用程序原来是调用系统的调试机制的,但是我想让他调用我的,那么ring3那套api要HOOK
2.既然调试机制自己写,那么可以拷贝ring0的那些函数
3.但是拷贝了ring0的函数 结构还得拷贝
4.这样的好处是不会蓝屏  只对某个进程有效就行了 稳定性不用担心
求指证?真心求解!
2013-8-7 18:16
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
http://bbs.pediy.com/showthread.php?t=142443&highlight=GalaxyAP

复制是没用的,关键是要自己去深刻理解...
2013-8-7 18:22
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
怎么构建
怎么隐藏好
2013-8-7 18:22
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
11
看你好像 应该 也许 是超级模块作者?
2013-8-7 18:23
0
雪    币: 46
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好吧
我 不假装了
其实他说的就是重建内核
仿照360挂钩KIFASTCALLENTRY
2013-8-7 18:25
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
不是 ,当我还没学计算机专业 我很喜欢易语言 很喜欢小烦的模块
2013-8-7 18:26
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
KIFASTCALLENTRY是ring3进入内核的大门吗?
2013-8-7 18:30
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
那我HOOK这个函数判读是OD 就让od进入我拷贝的内核 是不是可以呢?
2013-8-7 18:33
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
啊哦……正准备在win7上过tp
2013-8-7 18:33
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
你真的是只过了DebugPort清零一半,

非法的原因很简单,tp扫描内核,发现你Patch了内核就非法了.
2013-8-7 18:50
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
我想知道他怎么扫的 扫的方法是什么原理?为什么他就不扫ssdt呢?
那我觉得可能堆栈回溯过了【ebp+???】 不等于  xxx+ec
2013-8-7 18:55
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19

扫描内存还不简单,先获取内核基址,然后就匹配已经设定好了的特征码,就是 你提取的DebugPort函数的特征码,你一修改,TP自然就发现不对劲,搜索不到特征码了,就爆非法,

我已经过了TP的特征码扫描,当然知道TP怎么干的.
不得不夸奖TP,真聪明的做法,直接把PatchDebugPort端口过清零的方法秒杀了.
2013-8-7 19:19
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
扫特征的话肯定得读取周边地址  我去断断看 。。。这么说来 的确
2013-8-7 19:29
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
你这么一说。。。既然他要读那么假如我能在内核制造异常,他读的时候就出异常,那么把ec给他,恢复异常如此循环  
如果内核异常处理搞懂了 相信drx也过了  crc也无视了

不知大神是否也是通过制造异常  HOOK idt  的方法Pass的?
2013-8-7 19:38
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
不是用的硬件断点方法,我用的某淫 荡的手法过的,具体,当然不会公开,公开必和谐.
2013-8-7 19:46
0
雪    币: 167
活跃值: (190)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
没说硬断啊  我是说异常中断让他进入蓝屏函数
我HOOK蓝屏函数
2013-8-7 19:49
0
雪    币: 6723
活跃值: (1199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
顶一下楼主
2013-8-7 19:51
0
雪    币: 9687
活跃值: (2491)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
mark一下
2013-8-7 23:35
0
游客
登录 | 注册 方可回帖
返回
//