首页
社区
课程
招聘
[原创]巧妙的伪装系统版本号和系统位数
发表于: 2012-9-25 16:03 41003

[原创]巧妙的伪装系统版本号和系统位数

2012-9-25 16:03
41003
最近working比较busy,于是没时间发帖子,现在回来发一帖,关于伪装系统版本号与系统位数的~
具体什么用途,我想会有人知道了~(某些软件在x64上会不xxx那啥你懂得,比如360的安装程序)
直接上代码,思路已经ok了,其他内容都是基本的东西(主体代码复用了我以前发的TimeMachine)~
#include "stdafx.h"
#include "nameTools.h"
typedef NTSTATUS (NTAPI *T_ZwQueryInformationProcess)(
	__in HANDLE ProcessHandle,
	__in PROCESSINFOCLASS ProcessInformationClass,
	__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
	__in ULONG ProcessInformationLength,
	__out_opt PULONG ReturnLength
	);
typedef NTSTATUS (NTAPI *T_ZwQuerySystemInformation) (
	IN SYSTEM_INFORMATION_CLASS SystemInfoClass,
	OUT PVOID SystemInfoBuffer,
	IN ULONG SystemInfoBufferSize,
	OUT PULONG BytesReturned OPTIONAL
	);

#define KI_USER_SHARED_DATA         0xffdf0000
#define SharedUserData  ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)

ULONG HookSSDT(ULONG Id,ULONG Addr)
{
	ULONG ulOldAddr;
	ULONG  Address;

	ulOldAddr =*(PULONG)((PCHAR)KeServiceDescriptorTable->ServiceTableBase +Id*4);
	Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + Id * 4;
	ulOldAddr = *(ULONG*)Address;

	// hook system calls
	__asm
	{//去掉内存保护
		cli
			mov  eax,cr0
			and  eax,not 10000h
			mov  cr0,eax
	}

	*((ULONG*)Address) = (ULONG)Addr;//HOOK SSDT

	__asm
	{//恢复内存保护  
			mov  eax,cr0
			or   eax,10000h
			mov  cr0,eax
			sti
	}
	return ulOldAddr;
}


ULONG NtQuerySystemInformationId=0;
ULONG NtQueryInformationProcessId=0;


T_ZwQuerySystemInformation OldNtQuerySystemInformation=NULL;
T_ZwQueryInformationProcess OldNtQueryInformationProcess=NULL;


NTSTATUS NTAPI OnNtQuerySystemInformation(
	IN SYSTEM_INFORMATION_CLASS SystemInfoClass,
	OUT PVOID SystemInfoBuffer,
	IN ULONG SystemInfoBufferSize,
	OUT PULONG BytesReturned OPTIONAL
	)
{
	NTSTATUS ns = OldNtQuerySystemInformation(SystemInfoClass,SystemInfoBuffer,SystemInfoBufferSize,BytesReturned);
	if (NT_SUCCESS(ns))
	{
		if (SystemInfoClass==SystemProcessorInformation)
		{
			if (IsSomeProcess())
			{
				PSYSTEM_PROCESSOR_INFORMATION pProcessorInfo = (PSYSTEM_PROCESSOR_INFORMATION)SystemInfoBuffer;
				pProcessorInfo->ProcessorArchitecture = 9;//PROCESSOR_ARCHITECTURE_AMD64;//小试牛刀?
			}
		}
	}
	return ns;
}
NTSTATUS NTAPI
	OnNtQueryInformationProcess(
	__in HANDLE ProcessHandle,
	__in PROCESSINFOCLASS ProcessInformationClass,
	__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
	__in ULONG ProcessInformationLength,
	__out_opt PULONG ReturnLength
	)
{
	NTSTATUS ns = OldNtQueryInformationProcess(ProcessHandle,ProcessInformationClass,ProcessInformation,ProcessInformationLength,ReturnLength);
	if (NT_SUCCESS(ns))
	{
		if (ProcessInformationClass==ProcessWow64Information)
		{
			if (IsSomeProcess())
			{
				*(PULONG_PTR)ProcessInformation = 1;
			}
		}
	}
	return ns;
}
void PatchPebVersion(PEPROCESS Process)
{

	BOOLEAN bRet = FALSE;
	HANDLE hProcess = NULL;

	// get handle to target process
	NTSTATUS ns = ObOpenObjectByPointer(
		Process,
		OBJ_KERNEL_HANDLE,
		NULL,
		0,
		NULL,
		KernelMode,
		&hProcess
		);
	if (NT_SUCCESS(ns))
	{
		PROCESS_BASIC_INFORMATION ProcessInfo;    

		// get address of PEB
		ns = ZwQueryInformationProcess(
			hProcess,
			ProcessBasicInformation,
			&ProcessInfo,
			sizeof(ProcessInfo),
			NULL
			);
		if (NT_SUCCESS(ns))
		{
			KAPC_STATE ApcState;

			// change context to target process
			KeStackAttachProcess(Process, &ApcState);

			__try
			{
				PUCHAR Peb = (PUCHAR)ProcessInfo.PebBaseAddress;
				if (Peb)
				{
					*(DWORD *)((DWORD)Peb+0xA4)=6;
					*(DWORD *)((DWORD)Peb+0xA8)=1;
					*(WORD *)((DWORD)Peb+0xAC)=7600;
					*(WORD *)((DWORD)Peb+0xAE)=0;
					*(DWORD *)((DWORD)Peb+0xB0)=2;
				}
			}
			__except (EXCEPTION_EXECUTE_HANDLER)
			{
				DbgMsg(__FILE__, __LINE__, __FUNCTION__"() EXCEPTION\n");
			}

			KeUnstackDetachProcess(&ApcState);
		}
		else
		{
			// Can't query information about process, probably 'System' or rootkit activity
		}        
		ZwClose(hProcess);
	}
	else
	{
		DbgMsg(__FILE__, __LINE__, "ObOpenObjectByPointer() fails; status: 0x%.8x\n", ns);
	}

}
void ProcessNotifyRoutineTimeMachine(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create)
{
	if (Create)
	{
		//来吧英雄
		PEPROCESS Process = NULL;
		NTSTATUS ns = PsLookupProcessByProcessId(ProcessId, &Process);
		if (NT_SUCCESS(ns))
		{
			PatchPebVersion(Process);
			ObDereferenceObject(Process);
		}
	}
}
void FakeOSVersion()
{
	PKUSER_SHARED_DATA pKUS = (PKUSER_SHARED_DATA)KI_USER_SHARED_DATA;
	ClearWp(NULL);
	pKUS->NtMajorVersion = 6;
	pKUS->NtMinorVersion = 1;
	SetWp(NULL);

}
NTSTATUS HookSST()
{
	NtQuerySystemInformationId = GetSyscallNumber("NtQuerySystemInformation");
	NtQueryInformationProcessId = GetSyscallNumber("NtQueryInformationProcess");
	FakeOSVersion();
	PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutineTimeMachine,FALSE);
	if (NtQuerySystemInformationId)
	{
		OldNtQuerySystemInformation = (T_ZwQuerySystemInformation)HookSSDT(NtQuerySystemInformationId,(ULONG)OnNtQuerySystemInformation);
	}
	if (NtQueryInformationProcessId)
	{
		OldNtQueryInformationProcess = (T_ZwQueryInformationProcess)HookSSDT(NtQueryInformationProcessId,(ULONG)OnNtQueryInformationProcess);
	}
	return STATUS_SUCCESS;
}

NTSTATUS UnHookSST()
{
	PsSetCreateProcessNotifyRoutine(ProcessNotifyRoutineTimeMachine,TRUE);
	if (OldNtQueryInformationProcess)
	{
		HookSSDT(NtQueryInformationProcessId,(ULONG)OldNtQueryInformationProcess);
	}
	if (OldNtQuerySystemInformation)
	{
		HookSSDT(NtQuerySystemInformationId,(ULONG)OldNtQuerySystemInformation);
	}
	KernelSleep(100);
	return STATUS_SUCCESS;
}


PS:
求捐助,求赞助,求投资,欢迎联系QQ:86879759
欲购买 AntiGameProtect或UltraGameProtect系列代码与产品 也欢迎联系。
qq技术扯淡群1:171797360
qq技术扯淡群2:1748876
yy技术扯淡频道:80252844

[课程]Android-CTF解题方法汇总!

收藏
免费 6
支持
分享
最新回复 (67)
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
前排广告位出租
2012-9-25 16:09
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
3
前排站位= =
2012-9-25 16:10
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
顶V校成了一种习惯
2012-9-25 16:11
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
老V  , 不要停.............
2012-9-25 16:12
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
V神出现  顶
2012-9-25 16:12
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
7
顶V大。。。。
2012-9-25 16:12
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
V5V5~~前排支持
2012-9-25 16:13
0
雪    币: 563
活跃值: (4404)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
貌似某些游戏64位也XX
2012-9-25 16:16
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
超级神牛出没,注意规避。
2012-9-25 16:17
0
雪    币: 17
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这个要顶一下......
2012-9-25 16:26
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
mark~~~~~
2012-9-25 16:30
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
13
这个。。。。
2012-9-25 16:37
0
雪    币: 7004
活跃值: (1035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好东西,老V哥继续!
2012-9-25 17:46
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
获取系统位数,用得着Zw吗。。。。内核的话。。。。sizeof(PVOID)
应用层,搞个64位pe,能运行当然就是64.。。。。。。。。。。
2012-9-25 17:49
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
准确说
sizeof(PVOID)
主要是为了避免多写个预编译宏

32位下编译的。。。。自然就是4,64位自然会返回8
2012-9-25 17:52
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
我就不信你能让64位pe在32位系统运行起来
2012-9-25 17:58
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
sizeof是编译时确定  现在的情况是:客户端是32位的, 要在32位和64位系统同时运行,需要在运行时动态判断
2012-9-25 18:00
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
19
代码的目的是在32位机器上让某些程序认为自己运行在64从而不加载某些不和谐的驱动或者模块,或者功能~
2012-9-25 20:21
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
这个参考我说的第二个方法,直接来个64位pe
可以运行起来就是64位系统否则是32位系统

这个百试百灵
2012-9-25 21:02
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
你没看我说的“主要是为了省一个预编译宏”吗

运行时确定。。。我不是说了,搞个64位PE吗?
2012-9-25 21:03
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
你真的有在认真看帖么....
2012-9-25 21:29
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
想法真的好独到
2012-9-26 00:28
0
雪    币: 34
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
只能顶,没有任何作为
2012-9-26 08:30
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
25
你真的有看帖么。。。理解能力怎么这么差?

简单说,安装包里随便搞个64位PE放着(安装包是32位的)

正式安装前,先对这个64位PE进行CreateProcess

32位系统自然运行不起来

64位肯定可以运行

现在这些人的理解能力是怎么了?
2012-9-26 09:06
0
游客
登录 | 注册 方可回帖
返回
//