typedef struct _TRUSTED_PROCESS_INFO{
ULONG u1;
ULONG u2;
ULONG u3;
ULONG u4;
ULONG ProcessCnt;
//offset
=0x10
DWORD ProcessId[33];
//offset
=0x14
ULONG Key1;
//offset
=0x98
ULONG Key2;
//offset
=0x9C
}TRUSTED_PROCESS_INFO,*PTRUSTED_PROCESS_INFO;
//size
=0xA0
typedef struct _PROTECTED_PROCESS_INFO{
DWORD PidToProtect;
//offset
=0
DWORD u1;
DWORD u2;
DWORD u3;
ULONG Key1;
//offset
=0x10
ULONG Key2;
//offset
=0x14
}PROTECTED_PROCESS_INFO,*PPROTECTED_PROCESS_INFO;
/*
设置可信任程序,测试不完全正确
参数说明:
InputBuffer :存放Pid
InputLen :160
OutputBuffer:NULL
OutputLen :0
*/
BOOL SetTrustedProcessInfo(HANDLE hDevice)
{
TRUSTED_PROCESS_INFO ProcessInfo;
BOOL bRet;
DWORD Pid;
ULONG Cnt=0;
DWORD byteRetned=0;
int i=0;
char *szTrustedProcName[]={
"smss.exe"
,
"csrss.exe"
,
"winlogon.exe"
,
"services.exe"
,
"svchost.exe"
,
"alg.exe"
,
"lsass.exe"
};
int TotalCnt=7;
ZeroMemory(&ProcessInfo,sizeof(TRUSTED_PROCESS_INFO));
//
下面获取几个进程的PID用做测试
for
(i=0;i<TotalCnt;i++)
{
Pid=GetProcessIdByName(szTrustedProcName[i]);
if
(Pid)
{
printf
(
"%s \t\tPid=%d\n"
,szTrustedProcName[i],Pid);
ProcessInfo.ProcessId[Cnt++]=Pid;
}
}
//
开始填充缓冲区
ProcessInfo.u1=5;
ProcessInfo.u2=1;
ProcessInfo.u3=2;
ProcessInfo.u4=0;
ProcessInfo.ProcessCnt=Cnt;
ProcessInfo.Key1=0x12345678;
ProcessInfo.Key2=0x11223344;
//
对缓冲区进行加密,加密的数据内容当然不包括密钥
DecryptOrEntryptBuffer((BYTE*)&ProcessInfo.Key1,TRUE,(BYTE*)&ProcessInfo,sizeof(TRUSTED_PROCESS_INFO)-sizeof(ULONG)*2);
printf
(
"The buffer = 0x%08X\n"
,&ProcessInfo);
bRet=DeviceIoControl(hDevice,
IOCTL_SETTRUSTEDPROCESS,
&ProcessInfo,
sizeof(TRUSTED_PROCESS_INFO),
NULL,
0,
&byteRetned,
NULL);
printf
(
"The return value=%d\n"
,bRet);
}