首页
论坛
课程
招聘
[原创]Anti SSDT Hook
2009-2-15 00:23 43583

[原创]Anti SSDT Hook

2009-2-15 00:23
43583
前几天去当面膜拜了女王大牛,果然****,还让我等了一个来小时。。。

在xp中ntdll.dll的调用都是通过sysenter切换到内核的,sysenter调用了KiFastCallEntry,而KiFastCallEntry函数则是在ssdt表找到相应的
函数地址,然后call,所以只要伪造一张原始的ssdt表,并且欺骗过KiFastCallEntry函数,这样ssdt hook就无效了。。。
先看KiFastCallEntry函数:

nt!KiFastCallEntry:
80541790 b923000000      mov     ecx,23h
80541795 6a30            push    30h
80541797 0fa1            pop     fs
80541799 8ed9            mov     ds,cx
8054179b 8ec1            mov     es,cx
8054179d 648b0d40000000  mov     ecx,dword ptr fs:[40h] 
805417a4 8b6104          mov     esp,dword ptr [ecx+4]  
805417a7 6a23            push    23h
805417a9 52              push    edx  
805417aa 9c              pushfd
805417ab 6a02            push    2
805417ad 83c208          add     edx,8 
805417b0 9d              popfd
805417b1 804c240102      or      byte ptr [esp+1],2
805417b6 6a1b            push    1Bh
805417b8 ff350403dfff    push    dword ptr ds:[0FFDF0304h]
805417be 6a00            push    0
805417c0 55              push    ebp
805417c1 53              push    ebx
805417c2 56              push    esi
805417c3 57              push    edi
//ebx=_KPCR.SelfPcr
805417c4 648b1d1c000000  mov     ebx,dword ptr fs:[1Ch] 
805417cb 6a3b            push    3Bh
//esi=_KPCR.PrcbData.CurrentThread
805417cd 8bb324010000    mov     esi,dword ptr [ebx+124h]  
805417d3 ff33            push    dword ptr [ebx]
805417d5 c703ffffffff    mov     dword ptr [ebx],0FFFFFFFFh   
805417db 8b6e18          mov     ebp,dword ptr [esi+18h] 
805417de 6a01            push    1
805417e0 83ec48          sub     esp,48h
805417e3 81ed9c020000    sub     ebp,29Ch
805417e9 c6864001000001  mov     byte ptr [esi+140h],1
805417f0 3bec            cmp     ebp,esp
805417f2 758d            jne     nt!KiFastCallEntry2+0x49 (80541781)
805417f4 83652c00        and     dword ptr [ebp+2Ch],0
805417f8 f6462cff        test    byte ptr [esi+2Ch],0FFh
805417fc 89ae34010000    mov     dword ptr [esi+134h],ebp
80541802 0f8538feffff    jne     nt!Dr_FastCallDrSave (80541640)
80541808 8b5d60          mov     ebx,dword ptr [ebp+60h]
8054180b 8b7d68          mov     edi,dword ptr [ebp+68h]
8054180e 89550c          mov     dword ptr [ebp+0Ch],edx
80541811 c74508000ddbba  mov     dword ptr [ebp+8],0BADB0D00h
80541818 895d00          mov     dword ptr [ebp],ebx
8054181b 897d04          mov     dword ptr [ebp+4],edi
8054181e fb              sti
//eax为函数序号,但是在KeServiceDescriptorTableShadow时是函数序号+1000h,
//所以在KeServiceDescriptorTableShadow经过下面运算ecx最终为10h,否则为0
8054181f 8bf8            mov     edi,eax
80541821 c1ef08          shr     edi,8
80541824 83e730          and     edi,30h
80541827 8bcf            mov     ecx,edi
//KTHREAD.ServiceTable gdi32.dll和user32.dll调用时,
//ServiceTable为KeServiceDescriptorTableShadow,
//ntdll.dll调用时ServiceTable为KeServiceDescriptorTable
//在KeServiceDescriptorTableShadow时+10正好得到win32.sys调用
80541829 03bee0000000    add     edi,dword ptr [esi+0E0h]   
8054182f 8bd8            mov     ebx,eax  
//保留三个字节,得到正真的序号
80541831 25ff0f0000      and     eax,0FFFh
//和ssdt或shadow ssdt总共项数比较,eax大则跳
80541836 3b4708          cmp     eax,dword ptr [edi+8] 
80541839 0f8333fdffff    jae     nt!KiBBTUnexpectedRange (80541572)
//判断是shadow ssdt还是ssdt,不跳则是shadow ssdt,跳则是ssdt
8054183f 83f910          cmp     ecx,10h 
80541842 751b            jne     nt!KiFastCallEntry+0xcf (8054185f)  
80541844 648b0d18000000  mov     ecx,dword ptr fs:[18h]
8054184b 33db            xor     ebx,ebx
8054184d 0b99700f0000    or      ebx,dword ptr [ecx+0F70h]
80541853 740a            je      nt!KiFastCallEntry+0xcf (8054185f)
80541855 52              push    edx
80541856 50              push    eax
80541857 ff1528c75580    call    dword ptr [nt!KeGdiFlushUserBatch (8055c728)]
8054185d 58              pop     eax
8054185e 5a              pop     edx
8054185f 64ff0538060000  inc     dword ptr fs:[638h]
80541866 8bf2            mov     esi,edx
80541868 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
8054186b 33c9            xor     ecx,ecx
8054186d 8a0c18          mov     cl,byte ptr [eax+ebx]
//edi=KeServiceDescriptorTable->ServiceTableBase
//在这里patch 把edi指向构造的ssdt
80541870 8b3f            mov     edi,dword ptr [edi]  
//得到真实地址,edi为KiServiceTable,eax为函数序号  
80541872 8b1c87          mov     ebx,dword ptr [edi+eax*4] 
80541875 2be1            sub     esp,ecx
80541878 c1e902          shr     ecx,2
8054187a 8bfc            mov     edi,esp
8054187c 3b3574f73ff4    cmp     esi,dword ptr ds:[0F43FF774h]
80541882 0f83a8010000    jae     nt!KiSystemCallExit2+0x9f (80541a30)
//把参数复制到内核
80541888 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
//调用函数
8054188a ffd3            call    ebx
8054188c 8be5            mov     esp,ebp
8054188e 648b0d24010000  mov     ecx,dword ptr fs:[124h]
80541895 8b553c          mov     edx,dword ptr [ebp+3Ch]
80541898 899134010000    mov     dword ptr [ecx+134h],edx


KiFastCallEntry函数先通过fs寄存器的_KPCR得到了当前线程的ETHREAD,然后通过ETHREAD得到ServiceTable
这个就是main SDT或者是shadow sdt,在shadow sdt中要保留24位得到函数序号,之后根据main sdt或者shadow sdt
和函数序号得到函数地址,最后call这个函数。

所以可以在
80541868 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
8054186b 33c9            xor     ecx,ecx
8054186d 8a0c18          mov     cl,byte ptr [eax+ebx]
//edi=KeServiceDescriptorTable->ServiceTableBase
//在这里patch 把edi指向构造的ssdt
80541870 8b3f            mov     edi,dword ptr [edi]  

这里inline hook

完整代码如下:
#include "kernelfun.h"
#include <ntimage.h>

#define SEC_IMAGE    0x01000000
typedef struct {
        WORD    offset:12;
        WORD    type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;


DWORD *oldssdt;
DWORD patchAddress;
DWORD nowSsdt;
PVOID lpRet;

//得到系统内核模块基址
DWORD FoundSystemModule(BOOL bKernel,char *sysFileName)
{
        DWORD    dwNeededSize,rc;
        PMODULES    pModules=(PMODULES)&pModules;
        PCHAR    pKernelName;
        DWORD kernelBase;
        DWORD i;

        rc=ZwQuerySystemInformation(SystemModuleInformation,pModules,4,&dwNeededSize);
        if (rc==STATUS_INFO_LENGTH_MISMATCH) 
        {
                pModules=(MODULES *)ExAllocatePool(PagedPool,dwNeededSize);
                rc=ZwQuerySystemInformation(SystemModuleInformation,pModules,dwNeededSize,NULL);
                if (!NT_SUCCESS(rc))
                {
                        DbgPrint("ZwQuerySystemInformation failed");
                        return 0;
                }
        } 
        else
        {
                DbgPrint("ZwQuerySystemInformation failed");
                return 0;

        }

        if(bKernel)
        {
                pKernelName=pModules->smi[0].ModuleNameOffset+pModules->smi[0].ImageName;
                strcpy(sysFileName,pKernelName);
                kernelBase=(DWORD)pModules->smi[0].Base;
                return kernelBase;
        }
        for (i=0;(pModules->dwNumberOfModules)>i;i++)
        {
                pKernelName=pModules->smi[i].ModuleNameOffset+pModules->smi[i].ImageName;
                if(_stricmp(pKernelName,sysFileName)==0)
                {
                        kernelBase=(DWORD)pModules->smi[i].Base;
                        return kernelBase;
                }
        }

        return 0;
}


//得到并保存原始的ssdt
BOOL SaveOldSddt(PVOID hModule,DWORD dwKSDT,DWORD dwKernelBase)
{

        PDWORD    pService;
        DWORD dwKiServiceTable;

        IMAGE_DOS_HEADER *dosHeader;
        IMAGE_NT_HEADERS *ntHeader;
        PIMAGE_BASE_RELOCATION    pbr;
        PIMAGE_FIXUP_ENTRY    pfe;  
        DWORD dwPointer;
        DWORD point;
        BOOL    bFirstChunk=TRUE;
        DWORD i;
        dosHeader=(IMAGE_DOS_HEADER*)hModule;



        ntHeader=(IMAGE_NT_HEADERS*)((DWORD)hModule+dosHeader->e_lfanew);

        pbr=(PIMAGE_BASE_RELOCATION )(ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress+(DWORD)hModule);
        pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
        while(bFirstChunk||pbr->VirtualAddress)
        {
                bFirstChunk=FALSE;

                for (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(*(USHORT*)(dwPointer+(DWORD)hModule-2)==0x05c7)
                                        {
                                                dwKiServiceTable=*(PDWORD)((DWORD)hModule+dwPointer+4)-ntHeader->OptionalHeader.ImageBase;
                                                i=0;
                                                for (pService=(PDWORD)((DWORD)hModule+dwKiServiceTable);
                                                        *pService-ntHeader->OptionalHeader.ImageBase<ntHeader->OptionalHeader.ImageBase;
                                                        pService++,i++)
                                                {
                                                        oldssdt[i]=*pService-ntHeader->OptionalHeader.ImageBase+dwKernelBase;

                                                }

                                        }



                                }
                        }
                        pfe++;

                }
                pbr=(PIMAGE_BASE_RELOCATION)((DWORD)pbr+pbr->SizeOfBlock);
                pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));

        }

        return TRUE;
}

//计算mov [rem],rem的[rem]
DWORD GetFlag(PVOID lpBase)
{
        IMAGE_DOS_HEADER *dosHeader;
        IMAGE_NT_HEADERS *ntHeader;
        IMAGE_EXPORT_DIRECTORY* exportTable;
        DWORD* pfunctionAddresses;
        DWORD* pfunctionNames;
        WORD* pfunctionOrdinals;
        DWORD functionOrdinal;
        DWORD Base, i, functionAddress;
        DWORD dwKSDT;
        char* functionName;

        dosHeader=(IMAGE_DOS_HEADER*)lpBase;
        ntHeader=(IMAGE_NT_HEADERS*)((DWORD)lpBase+dosHeader->e_lfanew);
        exportTable=(IMAGE_EXPORT_DIRECTORY*)((DWORD)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

        pfunctionAddresses=(DWORD*)((DWORD)lpBase+exportTable->AddressOfFunctions);
        pfunctionNames=(DWORD*)((DWORD)lpBase+exportTable->AddressOfNames);
        pfunctionOrdinals=(WORD*)((DWORD)lpBase+exportTable->AddressOfNameOrdinals);
        Base=exportTable->Base;
        for(i=0;i<exportTable->NumberOfFunctions;i++)
        {
                functionName=(char*)((DWORD)lpBase+pfunctionNames[i]);
                functionOrdinal=pfunctionOrdinals[i]+Base-1;
                functionAddress = (DWORD)( (DWORD)lpBase + pfunctionAddresses[functionOrdinal]);
                if(_stricmp(functionName,"KeServiceDescriptorTable")==0)
                {
                        dwKSDT=functionAddress-(DWORD)lpBase;
                        return dwKSDT;
                }

        }
        return 0;

}


//映射文件进内存得到ssdt并保存起来
BOOL GetOldSsdt(PUNICODE_STRING kernelFileName,DWORD kernelBase) 
{
        NTSTATUS status;
        HANDLE  hSection, hFile;
        DWORD dwKSDT;
        PVOID BaseAddress = NULL;
        SIZE_T size=0;
        IO_STATUS_BLOCK iosb;
        OBJECT_ATTRIBUTES oa = {sizeof oa, 0, kernelFileName, OBJ_CASE_INSENSITIVE};
        status=ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);
        if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwOpenFile failed\n");
                return FALSE;
        }
        oa.ObjectName = 0;

        status=ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);
        if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwCreateSection failed\n");
                return FALSE;
        }

        status=ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE); 
        if(!NT_SUCCESS(status))
        {
                DbgPrint("ZwMapViewOfSection failed\n");
                return FALSE;
        }
        ZwClose(hFile);
        dwKSDT=GetFlag(BaseAddress);
        if(dwKSDT==0)
        {
                DbgPrint("GetFlag failed\n");
                return FALSE;
        }
        DbgPrint("dwKSDT:%x\n",dwKSDT);
        if(!SaveOldSddt(BaseAddress,dwKSDT,kernelBase))
        {
                DbgPrint("GetOldSddt failed\n");
                return FALSE;
        }

        ZwClose(hSection);
        return TRUE;
}

//构建新的Ssdt
BOOL SetNewSsdt()
{
        UNICODE_STRING kernelFileName;
        char systemFile[80];
        DWORD kernelBase;
        int count;

        kernelBase=FoundSystemModule(TRUE,systemFile);
        if(kernelBase==0)
        {
                DbgPrint("get kernel base failed\n");
                return FALSE;
        } 
        if(_stricmp(systemFile,"ntkrnlpa.exe")==0)
        {
                RtlInitUnicodeString(&kernelFileName, L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntkrnlpa.exe");
        }
        else if(_stricmp(systemFile,"ntoskrnl.exe")==0)
        {
                RtlInitUnicodeString(&kernelFileName, L"\\Device\\HarddiskVolume1\\Windows\\System32\\ntoskrnl.exe");

        }
        else
        {
                return FALSE;
        }
        count=KeServiceDescriptorTable->NumberOfServices;
        nowSsdt=(DWORD)KeServiceDescriptorTable->ServiceTableBase;
        oldssdt=(DWORD*)ExAllocatePool(NonPagedPool,count*4);
        if(oldssdt==NULL)
        {
                DbgPrint("allocate memory failed\n");
                return FALSE;
        }
        KdPrint(("oldssdt:%X\n",oldssdt));

        if(!GetOldSsdt(&kernelFileName,kernelBase))
        {
                DbgPrint("save ssdt failed\n");
                return FALSE;
        }
        return TRUE;


}


__declspec(naked)void UseOldSsdt()
{
        _asm
        {
                pushfd ;
                pushad ;
                mov  eax,nowSsdt;
                cmp eax,[edi];
                jnz shadow;//判断是不是shadow ssdt
                popad;
                popfd;
                mov     cl,byte ptr [eax+ebx];
                mov     edi,oldssdt;
                jmp [lpRet];        
shadow:
                popad;
                popfd;
                mov     cl,byte ptr [eax+ebx];
                mov     edi,dword ptr [edi];
                jmp [lpRet];

        }
        

};




BOOL HookKiFastCallEntry(BOOL bHook)
{
        BYTE jmpCode[5]={0xe9,0x00,0x00,0x00,0x00};
        BYTE oldCode[5]={0x8a,0x0c,0x18,0x8b,0x3f};
        BYTE *functionAddress;
        int i;
        if(bHook)
        {
                _asm
                {
                        pushad;
                        mov ecx, 0x176;
                        rdmsr;
                        mov functionAddress, eax;
                        popad;
                }
                for(i=0;i<264;i++)
                {
                        if(memcmp(&functionAddress[i],oldCode,5)==0)
                        {
                                patchAddress=(DWORD)&functionAddress[i];
                                KdPrint(("patch address:%X\n",patchAddress));
                                break;
                        }
                }
                if(i==264)
                        return FALSE;
                *(DWORD*)&jmpCode[1]=(DWORD)UseOldSsdt-(patchAddress+5);
                lpRet=(PVOID)(patchAddress+5);
                _asm
                {
                        CLI  ;                 
                        MOV    EAX, CR0  ;    
                        AND EAX, NOT 10000H ;
                        MOV    CR0, EAX;        
                }
                memcpy((PVOID)patchAddress,jmpCode,5);
                _asm 
                {
                        MOV    EAX, CR0;        
                        OR    EAX, 10000H;            
                        MOV    CR0, EAX ;              
                        STI;                    
                }

        }
        else
        {
                _asm
                {
                        CLI  ;                 
                        MOV    EAX, CR0  ;    
                        AND EAX, NOT 10000H ;
                        MOV    CR0, EAX;        
                }
                memcpy((PVOID)patchAddress,oldCode,5);
                _asm 
                {
                        MOV    EAX, CR0;        
                        OR    EAX, 10000H;            
                        MOV    CR0, EAX ;              
                        STI;                    
                }

        }
        return TRUE;




}


VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{    
        HookKiFastCallEntry(FALSE);
        DbgPrint("ROOTKIT: OnUnload called\n");
}


NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
        theDriverObject->DriverUnload = OnUnload;
        if(SetNewSsdt())
        {
                HookKiFastCallEntry(TRUE);

        }
        

        return STATUS_SUCCESS;
}



假如要anit shadow ssdt hook 只要同时hook KiFastCallEntry和KiSystemService俩函数就可以了。。。

又度过了一个没有情人的情人节了。。。。

[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (39)
雪    币: 419
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fixfix 活跃值 2009-2-15 00:32
2
0
不懂,站位学习
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我本低调 活跃值 2009-2-15 00:43
3
0
学习学习·~~~
雪    币: 106
活跃值: 活跃值 (20)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
bujin888 活跃值 4 2009-2-15 02:06
4
0
学习学习,希望能自己再创新一些.这些大牛说过了,不过比我这个菜鸟好多了,呵呵
雪    币: 2506
活跃值: 活跃值 (358)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
暗夜盗魔 活跃值 1 2009-2-15 08:33
5
0
若要把映射的内核模块重新定位一下,然后伪造内核表为映射内核模块的内核表,这样我感觉连inline hook 也过了!!!!
雪    币: 8670
活跃值: 活跃值 (777)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2009-2-15 09:27
6
0
发bin,src看着特别扭~
雪    币: 7506
活跃值: 活跃值 (298)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2009-2-15 10:19
7
0
好帖~膜拜楼上看bin比src还溜的老V
雪    币: 479
活跃值: 活跃值 (659)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2009-2-15 10:31
8
0
嗯,思路很旧了. 360Safe好早就这样用了...
支持一下~ 呵呵
雪    币: 44
活跃值: 活跃值 (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bozer 活跃值 2009-2-15 16:25
9
0
那也可以伪造到自己的SSDT了
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
牛年注册 活跃值 2009-2-15 16:29
10
0
现在什么都流行造假。。。。。
雪    币: 216
活跃值: 活跃值 (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dayang 活跃值 2009-2-15 17:03
11
0
#include "kernelfun.h"

kernelfun.h在哪呢?请楼主提供下吧
雪    币: 245
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孤行有你 活跃值 2009-2-18 09:50
12
0
偶看自己不搞驱动米前途了
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天线宝宝 活跃值 2009-2-18 09:58
13
0
雪下得那么深下得那么认真
倒映出我躺在雪中的伤痕
我并不在乎自己究竟多伤痕累累
可我在乎今后你有谁陪
雪    币: 1470
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
bithaha 活跃值 5 2009-2-18 16:44
14
0
下场雪 让好多人都诗了
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mccsoftgmx 活跃值 2009-3-6 11:56
15
0
[QUOTE=;]...[/QUOTE]
景仰高手.............................!
雪    币: 419
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fixfix 活跃值 2009-3-20 11:20
16
0
楼主能不能发个完整工程,或者把那个头文件发上来

想学习下,不错得说
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cgelife 活跃值 2009-3-20 22:11
17
0
对啊,楼主把头文件发出来学习一下啊,求你了
雪    币: 99
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
twoseconds 活跃值 2009-5-27 09:29
18
0
不懂,也顶。。。。大牛们都说好。
雪    币: 6881
活跃值: 活跃值 (286)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
玩命 活跃值 31 2009-5-27 10:18
19
0
这好像是歌词吧???
雪    币: 284
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jerrynpc 活跃值 2009-6-2 14:33
20
0
#include "kernelfun.h"

kernelfun.h在哪呢?请楼主提供下吧

同问,编译的时候出了很多错误,又没有bin.....这很难说这代码管用
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xxLeft 活跃值 2009-9-11 00:40
21
0
感觉这么做可能对360的主防有影响。。。

貌似360会通过传入的edi判断基址位置,就不知道它原始存的会不会取到LZ改的edi,如果取不到会跳出去什么都不做,那就相当于废了它的主防啊
雪    币: 306
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小原 活跃值 2009-9-12 18:11
22
0
路过学习,顺便膜拜v大
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
hpxpj 活跃值 1 2009-9-15 10:32
23
0
lkd> dt _KTHREAD
nt!_KTHREAD
   +0x000 Header           : _DISPATCHER_HEADER
   ...
   +0x0e0 ServiceTable     : Ptr32 Void;就是KeServiceDescriptorTable吧
雪    币: 217
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
百折不挠 活跃值 2009-9-18 10:58
24
0
kernelfun.h怎么找都找不到啊,谁能发个上来?
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小叶子 活跃值 2009-9-18 12:52
25
0
新的方法
好的文章
学习了
游客
登录 | 注册 方可回帖
返回