|
| cih 病毒原理的应用-物理内存的读写 |
| 来源:网络 时间:2006-2-18 |
|
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 .data idtr_1 db 6 dup(0) ;保存中断描述符表寄存器 oldexceptionhook dd 0 ;保存原先的中断入口地址 .code ;修改扇区大小过程 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 [iduba_page] pop ecx ;设置修改的中断入口地址为新的中断处理程序入口地址 push ebx lea ebx,newexceptionhook 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 ;新的中断处理程序 newexceptionhook 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 newexceptionhook endp end 本过程可以被c语言调用,编译方法:ml /c /coff w95enc.asm。请用masm 6.11以上版本编译,不需要ddk。将编译 生成的obj文件插入vc的工程中,并在vc程序中写上函数原型说明,就可以调用了。 | |