-
-
[原创][第三阶段]看雪论坛.腾讯公司2008软件安全技术竞赛
-
发表于: 2008-10-31 19:47 3629
-
1,简单描述一下该木马:
运行后,枚举进程获取进程快照、遍历查找my.exe.Client.exe.woool.dat.woool88.dat.xy2.exe.game.exe.SO2Game.exe.SO2GameFree.exe.FSOnline2.exe.gameclient.exe.elementclient.exe.asktao.mod.Wow.exe.ZeroOnline.exe.Bo.exe.Conquer.exe.soul.exe.TheWarlords.exe.china_login.mpr.blueskyclient_r.exe.xy3.exe.QQLogin.exe.DNF.exe.gc12.exe.hugemanclient.exe.HX2Game.exe.QQhxgame.exe.tw2.exe.QQSG.exe.QQFFO.exe.zhengtu.dat.mir.dat.mir2.dat.tty3d.exe.metin2.bin.AClient.exe.gamefree.exe..HBQQXX.dll........多款网游客户端进程,找到进程则结束该进程;
查找类名为"AskTao"的窗体,找到该窗体后向该窗体发送消息;
查注册表,看是否安装360,如果装了360,就修改360的Software\\360Safe\\safemon下的ARPAccess,IEProtAcces,ExecAccess,LeakShowed,MonAccess,NoNotiLeak,NoNotiNews,SiteAccess,UDiskAccess,weeken键值,恶意关闭360的保护功能;
从a.exe资源里分别释放HBKernel32.sys,HBQQXX.dll,System.exe三个文件:
HBKernel32.sys 木马的驱动保护,释放到 %System32%\drivers\HBKernel32.sys.每次启动建立一个线程,调用一次ZwOpenFile 打开HBKernel32.sys文件,并且不关闭它,这样就给HBKernel32.sys下了个二重保护,这里稍后讲解,循环扫描需要保护的注册表,Software\\Microsoft\\Windows\\CurrentVersion\\Run HBService32,Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows AppInit_DLLs ,SYSTEM\\CurrentControlSet\\Services\\HBService32,如果被修改,就改回去,而且在循环的过程中还扫描Hook NtSetValueKey NtOpenProcess,NtSetInFormationFile, NtCreateThread 四个地址,发现被恢复,立即还原,所以一般的恢复hook方法难以实现;
贴一段这个线程的代码,将就看下吧:
hook一个SSDT函数NtSetValueKey 三个内核代码hook NtOpenProcess,NtSetInFormationFile, NtCreateThread,NtSetValueKey 让你不能修改木马保护的注册表,NtOpenProcess和NtCreateThread让你不能结束System.exe进程 ,NtSetInFormationFile让你不能删除修改System.exe HBKernel32.sys HBQQXX.dll 三个文件
HBQQXX.dll 全局钩子,释放到 %System32%\HBQQXX.dll 通过System.exe木马启动程序修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs 下全局
钩子.盗取游戏帐号密码
System.exe 通过添加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run子键HBService32系统每次启动运行Sytem.exe,向驱动发送0x22E007,0x22E00B,0x22E00F命令,与驱动通信,0x22E007是驱动第一次启动需要发送的,0x22E00B这个需要传递一个进程id,这个进程id就是驱动要保护的进程,0x22E00B配合0x22E007使用,0x22E00F这个也要传递一个BOOL型变量,为FASLE时 停止驱动删除文件保护,为TRUE时 启动驱动删除文件保护.
2.ring3下删除木马
通过上面分析,要想删除改木马,必须突破他的驱动HBKernel32.sys保护,HBKernel32.sys通一个线程定时监控注册表,一旦有注册表被修改,立即改回来.hook了四个函数ZwSetValueKey, NtOpenProcess,NtSetInFormationFile, NtCreateThread, NtSetValueKey 让你不能修改驱动保护的注册表,NtOpenProcess和NtCreateThread让你不能结束System.exe进程 ,NtSetInFormationFile让你不能删除修改System.exe HBKernel32.sys HBQQXX.dll 三个文件,确实很牛X,不用驱动ring3很难搞定.不过经过上面分析,这个木马还是留了一手的,他要向驱动发送三个命令0x22E007,0x22E00B,0x22E00F命令,而且参数很好模拟,完全可以以牙还牙哈,
以牙还牙,模拟0x22E00B命令发送一个伪装的进程Id给驱动,这样就可以在ring3下结束掉 System.exe进程,然后在模拟0x22E00F命令发送一个FALSE 停止驱动删除文件保护,这样可以直接删除System.exe,因为System.exe进程已经被结束,经过测试,0x22E00F不但可以删除System.exe,还可以重命名HBQQXX.dll,在适当修改下,利用模拟的0x22E00F,还可以删除HBKernel32.sys ,这里要解释下为什么需要修改,而不是像删除System.exe一样删除HBKernel32.sys,因为HBKernel32.sys文件,在驱动线程里被ZwOpenFile打开过,并且没有被关闭,这样子就造成该文件被system系统进程(注意:这里说的system系统进程不是System.exe)独占了,修改或者删除都要报错,因为他被system系统进程一直占用着,所以要删除HBKernel32.sys文件,就必须关闭HBKernel32.sys被打开的句柄,才能删除.
ok,现在可以删除HBKernel32.sys,结束System.exe并删除,HBQQXX.dll也可以改名字,哈哈,现在就简单了吧,做了这些操作重起计算机,然后给自己程序放到run里,下次启动时因为驱动保护都不起作用了,HBQQXX.dll也被改名了(但然这里可以不用改名,直接远程释放掉dll,然后删除),完全可以直接把木马的所有文件删除,然后把注册里的东东都恢复过来,木马被干掉.
3.实现的核心代码
这里我发一下我删除System.exe和HBKernel32.sys的代码:
删除System.exe的代码:
删除HBKernel32.sys的代码:
注:这两个函数有先后顺序的,删除System.exe在前,HBKernel32.sys的在后.删除System.exe的代码没什么好讲的,关闭HBKernel32.sys 句柄 ,调用ZwQuerySystemInformation 得到进程所有句柄,然后找到File类型的句柄,然后通过ZwQueryObject得到路径,从路径里判断是不是HBKernel32.sys的句柄,还有这里需要提权,否则system进程进不去,
4.以前没研究过木马,写得很乱,而且有一些纯粹是猜测哈
,很多不妥的地方,大牛多多指点,谢谢
运行后,枚举进程获取进程快照、遍历查找my.exe.Client.exe.woool.dat.woool88.dat.xy2.exe.game.exe.SO2Game.exe.SO2GameFree.exe.FSOnline2.exe.gameclient.exe.elementclient.exe.asktao.mod.Wow.exe.ZeroOnline.exe.Bo.exe.Conquer.exe.soul.exe.TheWarlords.exe.china_login.mpr.blueskyclient_r.exe.xy3.exe.QQLogin.exe.DNF.exe.gc12.exe.hugemanclient.exe.HX2Game.exe.QQhxgame.exe.tw2.exe.QQSG.exe.QQFFO.exe.zhengtu.dat.mir.dat.mir2.dat.tty3d.exe.metin2.bin.AClient.exe.gamefree.exe..HBQQXX.dll........多款网游客户端进程,找到进程则结束该进程;
查找类名为"AskTao"的窗体,找到该窗体后向该窗体发送消息;
查注册表,看是否安装360,如果装了360,就修改360的Software\\360Safe\\safemon下的ARPAccess,IEProtAcces,ExecAccess,LeakShowed,MonAccess,NoNotiLeak,NoNotiNews,SiteAccess,UDiskAccess,weeken键值,恶意关闭360的保护功能;
从a.exe资源里分别释放HBKernel32.sys,HBQQXX.dll,System.exe三个文件:
HBKernel32.sys 木马的驱动保护,释放到 %System32%\drivers\HBKernel32.sys.每次启动建立一个线程,调用一次ZwOpenFile 打开HBKernel32.sys文件,并且不关闭它,这样就给HBKernel32.sys下了个二重保护,这里稍后讲解,循环扫描需要保护的注册表,Software\\Microsoft\\Windows\\CurrentVersion\\Run HBService32,Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows AppInit_DLLs ,SYSTEM\\CurrentControlSet\\Services\\HBService32,如果被修改,就改回去,而且在循环的过程中还扫描Hook NtSetValueKey NtOpenProcess,NtSetInFormationFile, NtCreateThread 四个地址,发现被恢复,立即还原,所以一般的恢复hook方法难以实现;
贴一段这个线程的代码,将就看下吧:
NTSTATUS __stdcall StartRoutine(PVOID a1)
{
signed int v1; // ecx@1
int *v2; // edi@1
NTSTATUS v4; // eax@5
int v5; // [sp+4h] [bp-168h]@1
LARGE_INTEGER Interval; // [sp+164h] [bp-8h]@3
HANDLE Handle; // [sp+34h] [bp-138h]@4
const WCHAR SourceString; // [sp+64h] [bp-108h]@5
UNICODE_STRING DestinationString; // [sp+5Ch] [bp-110h]@5
OBJECT_ATTRIBUTES ObjectAttributes; // [sp+40h] [bp-12Ch]@5
struct _IO_STATUS_BLOCK IoStatusBlock; // [sp+38h] [bp-134h]@5
int v12; // [sp+1Ch] [bp-150h]@7
int v13; // [sp+24h] [bp-148h]@9
int v14; // [sp+20h] [bp-14Ch]@11
int v15; // [sp+2Ch] [bp-140h]@13
char Source2; // [sp+58h] [bp-114h]@14
char v17; // [sp+59h] [bp-113h]@14
char v18; // [sp+5Ah] [bp-112h]@14
int v19; // [sp+Ch] [bp-160h]@16
int v20; // [sp+8h] [bp-164h]@18
int v21; // [sp+18h] [bp-154h]@23
int v22; // [sp+14h] [bp-158h]@25
int v23; // [sp+10h] [bp-15Ch]@27
int v24; // [sp+30h] [bp-13Ch]@30
v2 = &v5;
v1 = 13;
do
{
*v2 = 0;
++v2;
--v1;
}
while ( v1 );
Interval = (LARGE_INTEGER)-1000000i64;
while ( !dword_13F20 )
{
KeDelayExecutionThread(0, 0, &Interval);
if ( !Handle )
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, L"", byte_13A00);
RtlInitUnicodeString(&DestinationString, &SourceString);
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.SecurityQualityOfService = 0;
v4 = ZwOpenFile(&Handle, 0x100001u, &ObjectAttributes, &IoStatusBlock, 0, 0x20u); //打开HBKernel32.sys,没关闭句柄
if ( !sub_103B0(v4) )
Handle = 0;
}
s_ZwSetValueKey();//还原注册表
if ( v12 )
{
if ( v13 )
{
if ( v14 )
{
if ( v15 )
{
sub_10D04(v15, (int)sub_120D9, &loc_12106);
}
else
{
Source2 = -62;
v17 = 32;
v18 = 0;
v15 = sub_127C5(v13, 4096, v14, &Source2, 3u);
}
}
else
{
v14 = sub_1285B();
}
}
else
{
v13 = sub_1329B(v12);
}
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_13A01, byte_13A1F);
RtlInitUnicodeString(&DestinationString, &SourceString);
v12 = sub_13379(&DestinationString);
}
if ( v19 )
{
if ( v20 )
{
if ( v5 )
{
sub_10D04(v5, (int)sub_1212F, &loc_12164);
}
else
{
Source2 = -62;
v17 = 20;
v18 = 0;
v5 = sub_127C5(v19, 4096, v20, &Source2, 3u);
}
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_1391F, byte_13953);
RtlInitUnicodeString(&DestinationString, &SourceString);
v20 = (int)MmGetSystemRoutineAddress(&DestinationString);
}
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_138F4, byte_1391E);
RtlInitUnicodeString(&DestinationString, &SourceString);
v19 = (int)MmGetSystemRoutineAddress(&DestinationString);
}
if ( v21 )
{
if ( v22 )
{
if ( v23 )
{
sub_10D04(v23, (int)sub_1210B, &loc_1212A);
}
else
{
Source2 = -62;
v17 = 16;
v18 = 0;
v23 = sub_127C5(v21, 4096, v22, &Source2, 3u);
}
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_13971, byte_139A7);
RtlInitUnicodeString(&DestinationString, &SourceString);
v22 = (int)MmGetSystemRoutineAddress(&DestinationString);
}
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_13954, byte_13970);
RtlInitUnicodeString(&DestinationString, &SourceString);
v21 = (int)MmGetSystemRoutineAddress(&DestinationString);
}
if ( v24 )
{
sub_1102B(v24, (LONG)&loc_12169, &loc_12185);
}
else
{
RtlZeroMemory(&SourceString, 256);
sub_1160A(&SourceString, &unk_13A4B, byte_13A67);
RtlInitUnicodeString(&DestinationString, &SourceString);
v24 = sub_13379(&DestinationString);
}
}
if ( v15 )
sub_10ACD(v15);
if ( v5 )
sub_10ACD(v5);
if ( v23 )
sub_10ACD(v23);
if ( v24 )
sub_1101C(v24);
if ( Handle )
{
ZwClose(Handle);
Handle = 0;
}
return PsTerminateSystemThread(0);
}
hook一个SSDT函数NtSetValueKey 三个内核代码hook NtOpenProcess,NtSetInFormationFile, NtCreateThread,NtSetValueKey 让你不能修改木马保护的注册表,NtOpenProcess和NtCreateThread让你不能结束System.exe进程 ,NtSetInFormationFile让你不能删除修改System.exe HBKernel32.sys HBQQXX.dll 三个文件
HBQQXX.dll 全局钩子,释放到 %System32%\HBQQXX.dll 通过System.exe木马启动程序修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs 下全局
钩子.盗取游戏帐号密码
System.exe 通过添加HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run子键HBService32系统每次启动运行Sytem.exe,向驱动发送0x22E007,0x22E00B,0x22E00F命令,与驱动通信,0x22E007是驱动第一次启动需要发送的,0x22E00B这个需要传递一个进程id,这个进程id就是驱动要保护的进程,0x22E00B配合0x22E007使用,0x22E00F这个也要传递一个BOOL型变量,为FASLE时 停止驱动删除文件保护,为TRUE时 启动驱动删除文件保护.
2.ring3下删除木马
通过上面分析,要想删除改木马,必须突破他的驱动HBKernel32.sys保护,HBKernel32.sys通一个线程定时监控注册表,一旦有注册表被修改,立即改回来.hook了四个函数ZwSetValueKey, NtOpenProcess,NtSetInFormationFile, NtCreateThread, NtSetValueKey 让你不能修改驱动保护的注册表,NtOpenProcess和NtCreateThread让你不能结束System.exe进程 ,NtSetInFormationFile让你不能删除修改System.exe HBKernel32.sys HBQQXX.dll 三个文件,确实很牛X,不用驱动ring3很难搞定.不过经过上面分析,这个木马还是留了一手的,他要向驱动发送三个命令0x22E007,0x22E00B,0x22E00F命令,而且参数很好模拟,完全可以以牙还牙哈,
以牙还牙,模拟0x22E00B命令发送一个伪装的进程Id给驱动,这样就可以在ring3下结束掉 System.exe进程,然后在模拟0x22E00F命令发送一个FALSE 停止驱动删除文件保护,这样可以直接删除System.exe,因为System.exe进程已经被结束,经过测试,0x22E00F不但可以删除System.exe,还可以重命名HBQQXX.dll,在适当修改下,利用模拟的0x22E00F,还可以删除HBKernel32.sys ,这里要解释下为什么需要修改,而不是像删除System.exe一样删除HBKernel32.sys,因为HBKernel32.sys文件,在驱动线程里被ZwOpenFile打开过,并且没有被关闭,这样子就造成该文件被system系统进程(注意:这里说的system系统进程不是System.exe)独占了,修改或者删除都要报错,因为他被system系统进程一直占用着,所以要删除HBKernel32.sys文件,就必须关闭HBKernel32.sys被打开的句柄,才能删除.
ok,现在可以删除HBKernel32.sys,结束System.exe并删除,HBQQXX.dll也可以改名字,哈哈,现在就简单了吧,做了这些操作重起计算机,然后给自己程序放到run里,下次启动时因为驱动保护都不起作用了,HBQQXX.dll也被改名了(但然这里可以不用改名,直接远程释放掉dll,然后删除),完全可以直接把木马的所有文件删除,然后把注册里的东东都恢复过来,木马被干掉.
3.实现的核心代码
这里我发一下我删除System.exe和HBKernel32.sys的代码:
删除System.exe的代码:
//清除System.exe
BOOL ClearSystem()
{
BOOL bResult=false;
HANDLE hDevice;
HANDLE hProcessHandle;
ULONG dwReturn;
DWORD dwProcessID;
DWORD dwOutBuffer;
hDevice = NULL;
//转移驱动保护的System.exe进程ID,然后可以在ring3结束掉System.exe
hDevice = CreateFile("\\\\.\\slHBKernel32",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hDevice == INVALID_HANDLE_VALUE)
{
printf("CreateFile 出错!\n");
printf("重起电脑,在杀!\n");
return bResult;
}
bResult=DeviceIoControl(hDevice,
0x22E007,
NULL,
0,
0,
0,
&dwReturn,NULL);
//得到当前进程ID
dwProcessID=GetCurrentProcessId();
//转移木马驱动保护的进程ID
bResult=DeviceIoControl(hDevice,
0x22E00B,
&dwProcessID,
4,
&dwOutBuffer,
4,
&dwReturn,NULL);
//结束System.exe进程
while(TRUE)
{
hProcessHandle = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,dwOutBuffer);
if(hProcessHandle)
{
TerminateProcess(hProcessHandle,4);
WaitForSingleObject(hProcessHandle,INFINITE);
CloseHandle(hProcessHandle);
}
else
{
printf("结束System.exe进程成功!\n");
break;
}
}
//停止木马驱动删除文件的功能,把system.exe木马进程删除
BOOL bStart=FALSE;
bResult=DeviceIoControl(hDevice,
0x22E00F,
&bStart,
4,
0,
0,
&dwReturn,NULL);
char szSystemPath[MAX_PATH]={NULL};
GetSystemDirectory(szSystemPath,MAX_PATH);
strcat(szSystemPath,"\\System.exe");
if (DeleteFile(szSystemPath))
{
bResult=TRUE;
printf("删除%s成功!\n",szSystemPath);
}
else
{
bResult=FALSE;
printf("删除%s失败!\n",szSystemPath);
}
CloseHandle(hDevice);
return bResult;
}删除HBKernel32.sys的代码:
#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
typedef LONG NTSTATUS;
typedef struct _IO_STATUS_BLOCK
{
NTSTATUS Status;
ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef struct _SYSTEM_HANDLE_INformATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INformATION, *PSYSTEM_HANDLE_INformATION;
typedef struct _OBJECT_NAME_INformATION {
UNICODE_STRING Name;
} OBJECT_NAME_INformATION, *POBJECT_NAME_INformATION;
typedef NTSTATUS (CALLBACK* ZWQUERYSYSTEMINformATION)(
IN ULONG SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);
typedef NTSTATUS (CALLBACK* ZWQUERYOBJECT)(
IN HANDLE ObjectHandle,
IN ULONG ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL);
typedef NTSTATUS (WINAPI *ZWUNMAPVIEWOFSECTION)(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress );
ZWQUERYSYSTEMINformATION ZwQuerySystemInformation;
ZWQUERYOBJECT ZwQueryObject;
ZWUNMAPVIEWOFSECTION ZwUnmapViewOfSection;
//得到ZwQuerySystemInformation和ZwQueryObject地址
BOOL InitNTDLL()
{
BOOL bResult=FALSE;
HMODULE hModule = GetModuleHandle("ntdll.dll") ;
if (hModule == NULL)
hModule = LoadLibrary ("ntdll.dll") ;
if ( !hModule )
{
return bResult;
}
ZwQuerySystemInformation =
(ZWQUERYSYSTEMINformATION)GetProcAddress( hModule, "ZwQuerySystemInformation");
ZwQueryObject =
(ZWQUERYOBJECT)GetProcAddress( hModule, "ZwQueryObject");
ZwUnmapViewOfSection =
(ZWUNMAPVIEWOFSECTION)GetProcAddress (hModule, "ZwUnmapViewOfSection") ;
if (ZwQuerySystemInformation!=NULL&&ZwQueryObject!=NULL&&ZwUnmapViewOfSection!=NULL)
{
bResult=TRUE;
}
return bResult;
}
//调用ZwQuerySystemInformation得到句柄表
PULONG GetHandleList()
{
ULONG cbBuffer = 0x1000;
PULONG pBuffer = new ULONG[cbBuffer];
NTSTATUS Status;
DWORD dwNumBytesRet = 0x10;
do
{
Status = ZwQuerySystemInformation(
16,
pBuffer,
cbBuffer * sizeof * pBuffer,
&dwNumBytesRet);
if (Status == STATUS_INFO_LENGTH_MISMATCH)
{
delete [] pBuffer;
pBuffer = new ULONG[cbBuffer *= 2];
}
else if (!NT_SUCCESS(Status))
{
delete [] pBuffer;
return NULL;
}
}
while (Status == STATUS_INFO_LENGTH_MISMATCH);
return pBuffer;
}
//复制Handle
HANDLE DupHandle(DWORD PId, HANDLE handle)
{
HANDLE DupHandle;
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, 0, PId);
if(hProcess == NULL)
{
return 0;
}
if (!DuplicateHandle(hProcess, handle, GetCurrentProcess(),
&DupHandle, 0, 0, DUPLICATE_SAME_ACCESS))
DupHandle = 0;
CloseHandle( hProcess );
return DupHandle;
}
//关闭打开HBKernel32.sys句柄
HANDLE DeleteHandle(DWORD PId, HANDLE handle)
{
HANDLE DupHandle;
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, 0, PId);
if(hProcess == NULL)
{
return 0;
}
if (!DuplicateHandle(hProcess, handle, GetCurrentProcess(),
&DupHandle, 0, 0, DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS))
DupHandle = 0;
CloseHandle( hProcess );
return DupHandle;
}
//提升权限
void EnableDebugPriv(const char *name,bool bEnablePrivilege)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
//打开进程令牌环
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,
&hToken);
//获得进程本地唯一ID
LookupPrivilegeValue(NULL,name,&luid);
tp.PrivilegeCount = 1;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
tp.Privileges[0].Luid = luid;
//调整权限
AdjustTokenPrivileges(hToken,0,&tp,NULL,NULL,NULL);
CloseHandle(hToken);
}
//删除驱动HBKernel32.sys
BOOL DeleteHBKernel32Sys()
{
BOOL bResutl=FALSE;
char namebuf[2000];
DWORD ret;
HANDLE hTmp;
GetModuleFileName(NULL,namebuf,MAX_PATH);
hTmp = CreateFile(namebuf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
PULONG buf = GetHandleList();
if (buf == NULL)
return bResutl;
ULONG i;
UCHAR TypeNum;
PSYSTEM_HANDLE_INformATION info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (GetCurrentProcessId() == info->ProcessId && info->Handle == (USHORT)hTmp)
TypeNum = info->ObjectTypeNumber;
}
CloseHandle(hTmp);
info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (info->ObjectTypeNumber != TypeNum)
continue;
HANDLE handle = DupHandle(info->ProcessId, (HANDLE)info->Handle);
NTSTATUS status;
POBJECT_NAME_INformATION name = (POBJECT_NAME_INformATION)namebuf;
status = ZwQueryObject(handle, 1, namebuf, 2000, &ret);
CloseHandle(handle);
if (status >= 0)
{
wchar_t outstr[1000] = L"A:";
if (name->Name.Length > 23 && memicmp(name->Name.Buffer, L"\\Device\\HardDiskVolume", 44) == 0)
{
outstr[0] = name->Name.Buffer[22] - L'1' + L'C';
memcpy(&outstr[2], &name->Name.Buffer[23], name->Name.Length-23*2);
outstr[name->Name.Length/2-21] = 0;
}
wchar_t filename[1000];
GetSystemDirectoryW(filename,1000);
wcscat(filename,L"\\drivers\\HBKernel32.sys");
if (wcsicmp(outstr, filename) == 0)
{
handle = DeleteHandle(info->ProcessId, (HANDLE)info->Handle);
if (handle)
{
CloseHandle(handle);
while (true)
{
if (DeleteFileW(filename))
{
printf("删除%ws成功!\n",filename);
bResutl=TRUE;
break;
}
else
{
printf("删除%ws失败!\n",filename);
}
Sleep(2000);
}
}
break;
}
}
}
delete [] buf;
return bResutl;
}
注:这两个函数有先后顺序的,删除System.exe在前,HBKernel32.sys的在后.删除System.exe的代码没什么好讲的,关闭HBKernel32.sys 句柄 ,调用ZwQuerySystemInformation 得到进程所有句柄,然后找到File类型的句柄,然后通过ZwQueryObject得到路径,从路径里判断是不是HBKernel32.sys的句柄,还有这里需要提权,否则system进程进不去,
4.以前没研究过木马,写得很乱,而且有一些纯粹是猜测哈
赞赏
赞赏
雪币:
留言: