在win9x和winnt中如何进行ring3->ring0,ring0->ring3
在win9x和winnt中如何进行ring3->ring0,ring0->ring3
有多少种方法?
有多少种方法?
...全文
请发表友善的回复…
发表回复
snowingedge 2001-07-28
- 打赏
- 举报
www.driverdevelop.com上有一篇。
zoucaiming 2001-07-28
- 打赏
- 举报
nt 下如何写?
Leemaasn 2001-07-21
- 打赏
- 举报
gz
zoucaiming 2001-07-21
- 打赏
- 举报
大家研究如下代码:
;* Windows 95加密软件核心模块之一--磁盘扇区大小修改程序以及V86 内存分 *
;* 配与释放函数。 *
;****************************************************************************
.386p
.model flat,stdcall
;修改的中断号,如果本中断号改成3则可以防止Soft-ICE跟踪!
HookExceptionNo EQU 05h
;****************************************************************************
;* cb_s结构说明(VMM.INC文件中有) *
;* *
;* cb_s struc *
;* CB_VM_Status dd ? ; VM status; see below *
;* CB_High_Linear dd ? ; base linear address; see below *
;* CB_Client_Pointer dd ? ; see below *
;* CB_VMID dd ? ; virtual machine ID *
;* CB_Signature dd ? ; see below *
;* cb_s ends *
;****************************************************************************
.data
IDTR_1 db 6 dup(0) ;保存中断描述符表寄存器
OldExceptionHook dd 0 ;保存原先的中断入口地址
.code
;修改扇区大小过程
;VC原型:void _stdcall ChangeSectorSize(BYTE SectorSize);
ChangeSectorSize PROC SectorSize:BYTE
push eax
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序1 入口地址
push ebx
lea ebx,NewExceptionHook1
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push ebx
mov bl,byte ptr SectorSize ;扇区大小保存在bl寄存器中
int HookExceptionNo
pop ebx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;修改扇区大小过程结束
sti
pop eax
ret
ChangeSectorSize ENDP
;分配V86内存过程
;VC原型:DWORD _stdcall V86AllocBuffer(DWORD FarPtrMem,BYTE SectorSize);
V86AllocateBuffer PROC FarPtrMem:DWORD,SectorSize:BYTE
push edi
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序2 入口地址
push ebx
lea ebx,NewExceptionHook2
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push edx
push esi
push fs
mov dx,ds
mov fs,dx
mov esi,dword ptr FarPtrMem ;内存指针保存在fs:esi寄存器中
mov dl,byte ptr SectorSize ;扇区大小保存在dl寄存器中
int HookExceptionNo
pop fs
pop esi
pop edx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;分配V86内存过程结束
sti
mov eax,edi
pop edi
ret
V86AllocateBuffer ENDP
;释放V86内存过程
;VC原型:void _stdcall V86FreeBuffer(DWORD FarPtrMem,BYTE SectorSize);
V86FreeBuffer PROC FarPtrMem:DWORD,SectorSize:BYTE
push eax
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序3 入口地址
push ebx
lea ebx,NewExceptionHook3
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push edx
push esi
push fs
mov dx,ds
mov fs,dx
mov esi,dword ptr FarPtrMem ;内存指针保存在fs:esi寄存器中
mov dl,byte ptr SectorSize ;扇区大小保存在dl寄存器中
int HookExceptionNo
pop fs
pop esi
pop edx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;释放V86内存过程结束
sti
pop eax
ret
V86FreeBuffer ENDP
;新的中断处理程序1
NewExceptionHook1 PROC
push eax
push ebx
push ecx
push edx
push esi
;修改扇区大小
push dword ptr 00000000h ;必须为0
push dword ptr 00000001h ;字节数
push dword ptr 00000525h ;物理地址0000:0525
int 20h
dd 0001006ch ;以上两条指令相当于 VMMCall _MapPhysToLinear
pop esi
pop esi
pop esi
mov byte ptr [eax],bl ;修改扇区大小
;中断处理程序结束
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook1 ENDP
;新的中断处理程序2
NewExceptionHook2 PROC
push eax
push ebx
push ecx
push ebp
;获取当前VM句柄
int 20h
dd 00010001h ;以上两条指令相当于 VMMCall Get_Cur_VM_Handle
;获取Client_Reg_Struc结构地址
mov ebp,dword ptr [ebx+08h]
;分配V86内存
movzx eax,dl
xor ecx,ecx
bts ecx,eax
shl ecx,7
mov eax,ecx
stc
int 20h
dd 00060008h ;以上两条指令相当于 VxDCall V86MMGR_Allocate_Buffer
jc Error_Handler1
cmp eax,ecx
jnz Error_Handler2
jmp ExceptionHook_End1
Error_Handler1:
;V86内存分配错误处理1(分配失败)
xor edi,edi
jmp ExceptionHook_End1
Error_Handler2:
;V86内存分配错误处理2(内存不够)
clc
int 20h
dd 00060009h ;以上两条指令相当于 VxDCall V86MMGR_Free_Buffer
xor edi,edi
ExceptionHook_End1:
;中断处理程序结束
pop ebp
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook2 ENDP
;新的中断处理程序3
NewExceptionHook3 PROC
push eax
push ebx
push ecx
push ebp
;获取当前VM句柄
int 20h
dd 00010001h ;以上两条指令相当于 VMMCall Get_Cur_VM_Handle
;获取Client_Reg_Struc结构地址
mov ebp,dword ptr [ebx+08h]
;释放V86内存
movzx eax,dl
xor ecx,ecx
bts ecx,eax
shl ecx,7
stc
int 20h
dd 00060009h ;以上两条指令相当于 VxDCall V86MMGR_Free_Buffer
;中断处理程序结束
pop ebp
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook3 ENDP
end
//获取KERNEL32.DLL引出函数指针(防止Microsoft Anti-Hacking代码)
#include <windows.h>
#include "getk32pa.h"
typedef struct {
DWORD Signature;
//IMAGE_FILE_HEADER FileHeader;
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
//IMAGE_OPTIONAL_HEADER OptionalHeader;
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
//IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
DWORD EXPORT_VirtualAddress;
DWORD EXPORT_Size;
DWORD IMPORT_VirtualAddress;
DWORD IMPORT_Size;
DWORD RESORC_VirtualAddress;
DWORD RESORC_Size;
DWORD EXCEPT_VirtualAddress;
DWORD EXCEPT_Size;
DWORD SECURT_VirtualAddress;
DWORD SECURT_Size;
} PE;
FARPROC GetKernel32ProcAddress(DWORD OrdValue)
{
DWORD hModule;
PE *Hdr;
IMAGE_EXPORT_DIRECTORY *Exp;
PDWORD AddrFunc;
hModule=(DWORD)GetModuleHandle("KERNEL32");
Hdr=(PE *)(hModule+(*(PWORD)(hModule+0x3c)));
if(*(PDWORD)(Hdr)!=0x4550) return NULL;
Exp=(IMAGE_EXPORT_DIRECTORY *)(hModule+Hdr->EXPORT_VirtualAddress);
AddrFunc=(PDWORD)(hModule+(DWORD)Exp->AddressOfFunctions);
OrdValue--;
if(OrdValue<Exp->NumberOfFunctions)
return (FARPROC)(hModule+AddrFunc[OrdValue]);
else
return NULL;
}
//获取KERNEL32.DLL引出函数指针(防止Microsoft Anti-Hacking代码)
#ifdef __cplusplus
extern "C"
{
FARPROC GetKernel32ProcAddress(DWORD OrdValue);
}
#else
FARPROC GetKernel32ProcAddress(DWORD OrdValue);
#endif
;* Windows 95加密软件核心模块之一--磁盘扇区大小修改程序以及V86 内存分 *
;* 配与释放函数。 *
;****************************************************************************
.386p
.model flat,stdcall
;修改的中断号,如果本中断号改成3则可以防止Soft-ICE跟踪!
HookExceptionNo EQU 05h
;****************************************************************************
;* cb_s结构说明(VMM.INC文件中有) *
;* *
;* cb_s struc *
;* CB_VM_Status dd ? ; VM status; see below *
;* CB_High_Linear dd ? ; base linear address; see below *
;* CB_Client_Pointer dd ? ; see below *
;* CB_VMID dd ? ; virtual machine ID *
;* CB_Signature dd ? ; see below *
;* cb_s ends *
;****************************************************************************
.data
IDTR_1 db 6 dup(0) ;保存中断描述符表寄存器
OldExceptionHook dd 0 ;保存原先的中断入口地址
.code
;修改扇区大小过程
;VC原型:void _stdcall ChangeSectorSize(BYTE SectorSize);
ChangeSectorSize PROC SectorSize:BYTE
push eax
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序1 入口地址
push ebx
lea ebx,NewExceptionHook1
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push ebx
mov bl,byte ptr SectorSize ;扇区大小保存在bl寄存器中
int HookExceptionNo
pop ebx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;修改扇区大小过程结束
sti
pop eax
ret
ChangeSectorSize ENDP
;分配V86内存过程
;VC原型:DWORD _stdcall V86AllocBuffer(DWORD FarPtrMem,BYTE SectorSize);
V86AllocateBuffer PROC FarPtrMem:DWORD,SectorSize:BYTE
push edi
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序2 入口地址
push ebx
lea ebx,NewExceptionHook2
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push edx
push esi
push fs
mov dx,ds
mov fs,dx
mov esi,dword ptr FarPtrMem ;内存指针保存在fs:esi寄存器中
mov dl,byte ptr SectorSize ;扇区大小保存在dl寄存器中
int HookExceptionNo
pop fs
pop esi
pop edx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;分配V86内存过程结束
sti
mov eax,edi
pop edi
ret
V86AllocateBuffer ENDP
;释放V86内存过程
;VC原型:void _stdcall V86FreeBuffer(DWORD FarPtrMem,BYTE SectorSize);
V86FreeBuffer PROC FarPtrMem:DWORD,SectorSize:BYTE
push eax
;获取修改的中断的中断描述符(中断门)地址
sidt IDTR_1
mov eax,dword ptr IDTR_1+02h
add eax,HookExceptionNo*08h+04h
cli
;保存原先的中断入口地址
push ecx
mov ecx,dword ptr [eax]
mov cx,word ptr [eax-04h]
mov dword ptr OldExceptionHook,ecx
pop ecx
;设置修改的中断入口地址为新的中断处理程序3 入口地址
push ebx
lea ebx,NewExceptionHook3
mov word ptr [eax-04h],bx
shr ebx,10h
mov word ptr [eax+02h],bx
pop ebx
;执行中断,转到Ring 0(与CIH 病毒原理相似!)
push edx
push esi
push fs
mov dx,ds
mov fs,dx
mov esi,dword ptr FarPtrMem ;内存指针保存在fs:esi寄存器中
mov dl,byte ptr SectorSize ;扇区大小保存在dl寄存器中
int HookExceptionNo
pop fs
pop esi
pop edx
;恢复原先的中断入口地址
push ecx
mov ecx,dword ptr OldExceptionHook
mov word ptr [eax-04h],cx
shr ecx,10h
mov word ptr [eax+02h],cx
pop ecx
;释放V86内存过程结束
sti
pop eax
ret
V86FreeBuffer ENDP
;新的中断处理程序1
NewExceptionHook1 PROC
push eax
push ebx
push ecx
push edx
push esi
;修改扇区大小
push dword ptr 00000000h ;必须为0
push dword ptr 00000001h ;字节数
push dword ptr 00000525h ;物理地址0000:0525
int 20h
dd 0001006ch ;以上两条指令相当于 VMMCall _MapPhysToLinear
pop esi
pop esi
pop esi
mov byte ptr [eax],bl ;修改扇区大小
;中断处理程序结束
pop esi
pop edx
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook1 ENDP
;新的中断处理程序2
NewExceptionHook2 PROC
push eax
push ebx
push ecx
push ebp
;获取当前VM句柄
int 20h
dd 00010001h ;以上两条指令相当于 VMMCall Get_Cur_VM_Handle
;获取Client_Reg_Struc结构地址
mov ebp,dword ptr [ebx+08h]
;分配V86内存
movzx eax,dl
xor ecx,ecx
bts ecx,eax
shl ecx,7
mov eax,ecx
stc
int 20h
dd 00060008h ;以上两条指令相当于 VxDCall V86MMGR_Allocate_Buffer
jc Error_Handler1
cmp eax,ecx
jnz Error_Handler2
jmp ExceptionHook_End1
Error_Handler1:
;V86内存分配错误处理1(分配失败)
xor edi,edi
jmp ExceptionHook_End1
Error_Handler2:
;V86内存分配错误处理2(内存不够)
clc
int 20h
dd 00060009h ;以上两条指令相当于 VxDCall V86MMGR_Free_Buffer
xor edi,edi
ExceptionHook_End1:
;中断处理程序结束
pop ebp
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook2 ENDP
;新的中断处理程序3
NewExceptionHook3 PROC
push eax
push ebx
push ecx
push ebp
;获取当前VM句柄
int 20h
dd 00010001h ;以上两条指令相当于 VMMCall Get_Cur_VM_Handle
;获取Client_Reg_Struc结构地址
mov ebp,dword ptr [ebx+08h]
;释放V86内存
movzx eax,dl
xor ecx,ecx
bts ecx,eax
shl ecx,7
stc
int 20h
dd 00060009h ;以上两条指令相当于 VxDCall V86MMGR_Free_Buffer
;中断处理程序结束
pop ebp
pop ecx
pop ebx
pop eax
iretd
NewExceptionHook3 ENDP
end
//获取KERNEL32.DLL引出函数指针(防止Microsoft Anti-Hacking代码)
#include <windows.h>
#include "getk32pa.h"
typedef struct {
DWORD Signature;
//IMAGE_FILE_HEADER FileHeader;
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
//IMAGE_OPTIONAL_HEADER OptionalHeader;
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
//IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
DWORD EXPORT_VirtualAddress;
DWORD EXPORT_Size;
DWORD IMPORT_VirtualAddress;
DWORD IMPORT_Size;
DWORD RESORC_VirtualAddress;
DWORD RESORC_Size;
DWORD EXCEPT_VirtualAddress;
DWORD EXCEPT_Size;
DWORD SECURT_VirtualAddress;
DWORD SECURT_Size;
} PE;
FARPROC GetKernel32ProcAddress(DWORD OrdValue)
{
DWORD hModule;
PE *Hdr;
IMAGE_EXPORT_DIRECTORY *Exp;
PDWORD AddrFunc;
hModule=(DWORD)GetModuleHandle("KERNEL32");
Hdr=(PE *)(hModule+(*(PWORD)(hModule+0x3c)));
if(*(PDWORD)(Hdr)!=0x4550) return NULL;
Exp=(IMAGE_EXPORT_DIRECTORY *)(hModule+Hdr->EXPORT_VirtualAddress);
AddrFunc=(PDWORD)(hModule+(DWORD)Exp->AddressOfFunctions);
OrdValue--;
if(OrdValue<Exp->NumberOfFunctions)
return (FARPROC)(hModule+AddrFunc[OrdValue]);
else
return NULL;
}
//获取KERNEL32.DLL引出函数指针(防止Microsoft Anti-Hacking代码)
#ifdef __cplusplus
extern "C"
{
FARPROC GetKernel32ProcAddress(DWORD OrdValue);
}
#else
FARPROC GetKernel32ProcAddress(DWORD OrdValue);
#endif
zoucaiming 2001-07-21
- 打赏
- 举报
nt下的代码具体如何写?
Chice_wxg 2001-07-21
- 打赏
- 举报
铁出来看看嘛,让俺也学习学习 :)
对了,这种方法在NT下也可以吗?我记的好象是这是利用的Win9X的一个管理漏洞才进行的啊。
对了,这种方法在NT下也可以吗?我记的好象是这是利用的Win9X的一个管理漏洞才进行的啊。
zoucaiming 2001-07-21
- 打赏
- 举报
paste
snowingedge 2001-07-21
- 打赏
- 举报
ring3->ring0-----IDT,CALL GATE
ring0->ring3-----IRETD
ring0->ring3-----IRETD
snowingedge 2001-07-21
- 打赏
- 举报
push eax ;
sidt [esp-02h]
pop ebx ;
add ebx, HookExceptionNumber*08h+04h
cli
mov ebp, [ebx]
mov bp, [ebx-04h]
lea esi, MyExceptionHook-@1[ecx]
push esi
mov [ebx-04h], si
shr esi, 16
mov [ebx+02h], si
pop esi
这是利用IDT的方法,适用于WIN9X
sidt [esp-02h]
pop ebx ;
add ebx, HookExceptionNumber*08h+04h
cli
mov ebp, [ebx]
mov bp, [ebx-04h]
lea esi, MyExceptionHook-@1[ecx]
push esi
mov [ebx-04h], si
shr esi, 16
mov [ebx+02h], si
pop esi
这是利用IDT的方法,适用于WIN9X
snowingedge 2001-07-21
- 打赏
- 举报
NT下只能用CALL GATE。