在win9x和winnt中如何进行ring3->ring0,ring0->ring3

zoucaiming 2001-07-21 12:36:12
在win9x和winnt中如何进行ring3->ring0,ring0->ring3
有多少种方法?
...全文
153 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
zoucaiming 2001-07-21
  • 打赏
  • 举报
回复
nt下的代码具体如何写?
Chice_wxg 2001-07-21
  • 打赏
  • 举报
回复
铁出来看看嘛,让俺也学习学习 :)


对了,这种方法在NT下也可以吗?我记的好象是这是利用的Win9X的一个管理漏洞才进行的啊。


zoucaiming 2001-07-21
  • 打赏
  • 举报
回复
paste
snowingedge 2001-07-21
  • 打赏
  • 举报
回复
ring3->ring0-----IDT,CALL GATE
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
snowingedge 2001-07-21
  • 打赏
  • 举报
回复
NT下只能用CALL GATE。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧