CIH病毒原理的应用——物理内存的读写

    技术2022-05-11  126

    大家都很讨厌CIH 病毒,可毛老人家教导我们:“要一分为二地看问题”,CIH病毒很可怕,但是它使用的某些特殊技术还是可以借鉴的,这样可以做到变害为利Windows 95/98应用程序无法直接读写物理内存,如果使用VxD编程,可以调用VMM功能_MapPhysToLinear将物理地址映射到线性地址再进行修改,但是这样就必须单独写一个VxD,比较麻烦,那么能不能在应用程序中直接调用VMM功能呢?一般不能,因为VMM功能要在Ring 0上调用,而一般的应用程序工作在Ring 3上,那么为什么CIH 病毒能够调用VMM功能呢,CIH病毒使用了一种技术,采用Intel处理器的中断从Ring 3转到Ring 0,我们完全可以借鉴这种技术来调用VMM功能,下面的程序演示了如何修改物理内存——以在Windows 95加密程序中修改加密扇区大小(物理地址0000:0525H)为例:;****************************************************************************;* Windows 95加密软件核心模块之一--磁盘扇区大小修改程序 *;* *;* 本程序在Windows 95下修改内存物理地址0000:0525 处的磁盘扇区大小字节, *;* 为了能够修改物理地址,本程序使用了VMM 功能_MapPhysToLinear将物理地址映射 *;* 到线性地址进行修改。为了在应用程序中调用VMM 功能,本程序使用了CIH 病毒的 *;* 原理,使用中断将系统由Ring 3转到Ring 0,然后调用VMM 功能。 *;* 本程序中的过程ChangeSectorSize在VC中的原型可以写成: *;* *;* void _stdcall ChangeSectorSize(BYTE SectorSize); *;****************************************************************************.386p.model flat,stdcall;修改的中断号,如果本中断号改成3则可以防止Soft-ICE跟踪!HookExceptionNo EQU 05h.dataIDTR_1 db 6 dup(0) ;保存中断描述符表寄存器OldExceptionHook dd 0 ;保存原先的中断入口地址.code;修改扇区大小过程ChangeSectorSize PROC SectorSize:BYTEpush eax;获取修改的中断的中断描述符(中断门)地址sidt IDTR_1mov eax,dword ptr IDTR_1+02hadd eax,HookExceptionNo*08h+04hcli;保存原先的中断入口地址push ecxmov ecx,dword ptr [eax]mov cx,word ptr [eax-04h]mov dword ptr OldExceptionHook,ecxpop ecx;设置修改的中断入口地址为新的中断处理程序入口地址push ebxlea ebx,NewExceptionHookmov word ptr [eax-04h],bxshr ebx,10hmov word ptr [eax+02h],bxpop ebx;执行中断,转到Ring 0(与CIH 病毒原理相似!)push ebxmov bl,byte ptr SectorSize ;扇区大小保存在bl寄存器中int HookExceptionNopop ebx;恢复原先的中断入口地址push ecxmov ecx,dword ptr OldExceptionHookmov word ptr [eax-04h],cxshr ecx,10hmov word ptr [eax+02h],cxpop ecx;修改扇区大小过程结束stipop eaxretChangeSectorSize ENDP;新的中断处理程序NewExceptionHook PROCpush eaxpush ebxpush ecxpush edxpush esi;修改扇区大小push dword ptr 00000000h ;必须为0push dword ptr 00000001h ;字节数push dword ptr 00000525h ;物理地址0000:0525int 20hdd 0001006ch ;以上两条指令相当于 VMMCall _MapPhysToLinearpop esipop esipop esimov byte ptr [eax],bl ;修改扇区大小;中断处理程序结束pop esipop edxpop ecxpop ebxpop eaxiretdNewExceptionHook ENDPend本过程可以被C语言调用,编译方法:ml /c /coff w95enc.asm。请用MASM 6.11以上版本编译,不需要DDK。将编译生成的OBJ文件插入VC的工程中,并在VC程序中写上函数原型说明,就可以调用了。


    最新回复(0)