首页
论坛
专栏
课程

[调试逆向] [原创]Bochs+Windbg调试VT代码

2011-8-19 15:03 27064

[调试逆向] [原创]Bochs+Windbg调试VT代码

2011-8-19 15:03
27064
准备工具:
    Windbg 6.12
    bochs-2.4.6-msvc-src(http://sourceforge.net/projects/bochs/files/bochs/2.4.6/)
    vmware.
    Securable (检查是否开启VT的)
    VC 2008.
Intel vt技术十分诱人,但是如何调试vt程序却是让人头疼, 我们经常使用的vmware貌似不支持cpu vt技术的模拟,貌似只有bochs支持cpu vt技术的模拟。
看了下qemu的代码发现其feature里有支持VT特性的,不过试了它提供的几个cpu,发现只有qemu64(cpu 名称)支持VT.

步骤:

1, 修改config.h中的
#define BX_SUPPORT_VMX 0

改成 
[COLOR="Red"]#define BX_SUPPORT_VMX 1 
或者 
#define BX_SUPPORT_VMX 2[/COLOR]

2, 编译.你会发现bx_cpu_c::init_VMCS(), vmcs_field_offset()等link error!
   解决方法:
  将cpu\vmcs.cc加进工程就可以了
3, 到现在bochs已经编译出来了,接下来就是安装系统.bochs太慢,使用vmware装把.
具体步骤参考三寸法师的文章(http://bbs.pediy.com/showthread.php?p=964315).
装完后用Securable检测下看是否支持vt.再加上调试模式(修改boot.ini...不多说,不知道的可以搜一下vmware+debug调试)
发现绿色的YES,好了支持了,不过还有问题,见下文.
4, bochs 支持串口, 用Windbg连接bochs进行源码调试吧.在bochs的配置文件中加一句
com1: enabled=1, mode=pipe_server, dev=”\\.\pipe\bochs”

  然后运行虚拟机,会发现bochs会一直在等待,这时打开windbg连接\\.\pipe\bochs .嗯,bochs开始运行了.选择调试模式,好吧.windbg直接退了.有木有.有木有.如果是windbg 6.09你就发现他不会退出而是没啥反应.
  5, 看了下bochs中串口的实现,是同步的(难道是因为这个退出的?),翻了下virtualbox的串口的代码发现确实异步,开了读写线程。好吧,看到网上有用bochs调试wrk的一篇文章<wrk源码分析之WinDbg+Bochs调试>,里面给出了段代码(注:这个代码我改了下发现这段代码在想串口写数据的时候锁死了, 修改及其原版代码见附件)用这个试试.
  将其代码加到项目文件中.然后在serial.h中的bx_serial_t定义中添加一变量(红色字体部分):
int io_mode;
  int tty_id;
  SOCKET socket_id;
  FILE *output;
#ifdef WIN32
  HANDLE pipe;
  [COLOR="Red"]void* p_cls_our;[/COLOR]
#endif

#if USE_RAW_SERIAL
  serial_raw* raw;
#endif

然后在serial .cc文件中的bx_serial_c::init(void)添加(红色部分) 这里我们添加了一个模式”pipe”具体设置见后面:
略…  
if (server) {
  pipe = CreateNamedPipe( dev,
    PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
    PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
    1, 4096, 4096, 0, NULL);
  if (pipe == INVALID_HANDLE_VALUE)
    BX_PANIC(("com%d: CreateNamedPipe(%s) failed", i+1, dev));
  BX_INFO(("com%d: waiting for client to connect to %s", i+1, dev));
  if (!ConnectNamedPipe(pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED)
  {
    CloseHandle(pipe);
    pipe = INVALID_HANDLE_VALUE;
    BX_PANIC(("com%d: ConnectNamedPipe(%s) failed", i+1, dev));
  }
  }
  // client mode
  else {
  
[COLOR="Red"]   if ( strcmp(mode, "pipe") == 0 ){
    BX_INFO(("!!!!!!into our code!!!!!!!"));
    serial_pipe* our_serial = new serial_pipe(dev);
    BX_SER_THIS s[i].p_cls_our = our_serial;
   }else{[/COLOR]
     pipe = CreateFile( dev,
       GENERIC_READ | GENERIC_WRITE, 
       0, NULL, OPEN_EXISTING, 0, NULL);

     if (pipe == INVALID_HANDLE_VALUE)
       BX_INFO(("com%d: failed to open pipe %s", i+1, dev));
   [COLOR="Red"]}[/COLOR]
  }
略…

在serial .cc文件中void bx_serial_c::rx_timer(void)函数添加(红色部分):
略…
#ifdef WIN32
        DWORD avail = 0;
        if (BX_SER_THIS s[port].pipe &&
            PeekNamedPipe(BX_SER_THIS s[port].pipe, NULL, 0, NULL, &avail, NULL) &&
            avail > 0) {
          ReadFile(BX_SER_THIS s[port].pipe, &chbuf, 1, &avail, NULL);
          data_ready = 1;
        }
[COLOR="Red"]        if (BX_SER_THIS s[port].p_cls_our){
            chbuf = ((serial_pipe*)(BX_SER_THIS s[port].p_cls_our))->receive();
            data_ready = 1;
        }[/COLOR]
#endif
略…

再在serial .cc文件中void bx_serial_c::tx_timer(void)函数添加(红色部分):
略…
#ifdef WIN32
        if (BX_SER_THIS s[port].pipe) {
          DWORD written;
          WriteFile(BX_SER_THIS s[port].pipe, (bx_ptr_t)& BX_SER_THIS s[port].tsrbuffer, 1, &written, NULL);
        }
        
[COLOR="Red"]        if (BX_SER_THIS s[port].p_cls_our) {
            serial_pipe* p_serial = (serial_pipe*)(BX_SER_THIS s[port].p_cls_our);
            p_serial->transmit(BX_SER_THIS s[port].tsrbuffer);
        }[/COLOR]
#endif
略…

再在头部添加新添文件的头文件:
[COLOR="Red"]#if USE_PIPE_SERIAL
#include "serial_pipe.h"
#endif[/COLOR]

好吧还得在config.h中添加:
[COLOR="Red"]#define USE_PIPE_SERIAL 1[/COLOR]

6, 大功告成,编译.好!成功.
7, 修改bochs配置文件:
[COLOR="Red"]com1: enabled=1, mode=pipe, dev="pipe\bochs"[/COLOR]

8, 发现windbg连上了,并且可以源码调试了.如图:
   
这是啥?newbluepill???
9,到这就完了嘛?no..windbg 输入g enter.. 草..蓝了,断在vmx_on指令上..不支持?
发现bochs后台输出了句: #GP: VMXON is not allowed !.抬头对天大喊一声,草!!.明明是支持的呀!
跟了下发现是:
!(BX_CPU_THIS_PTR msr.ia32_feature_ctrl & BX_IA32_FEATURE_CONTROL_LOCK_BIT)
引起的.查找了下BX_IA32_FEATURE_CONTROL_LOCK_BIT的引用.发现:
/* enable VMX, should be done in BIOS instead */
BX_CPU_THIS_PTR msr.ia32_feature_ctrl =
/*BX_IA32_FEATURE_CONTROL_LOCK_BIT|*/ BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;
哦.知道了原来在bios里设置.可是bochs那丑陋的bios根本就不能设置,只能设置从哪启动,一不做二不休,干脆把注释去掉:
/* enable VMX, should be done in BIOS instead */
[COLOR="Red"]BX_CPU_THIS_PTR msr.ia32_feature_ctrl =
BX_IA32_FEATURE_CONTROL_LOCK_BIT | BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;[/COLOR]

再跑ok了.可以运行了.如图:
 

这又是啥??
PS:bochs的时钟频率很快,所以其串口速度也非常快.比VirtualKD都看.至于你你信不信,反正我是信了.

修改过的代码:
bochs-pipe-serial.rar
doc文档:
Bochs调试VT代码.doc

[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上传的附件:
上一主题 下一主题
最新回复 (22)
jasonzhou 2011-8-19 15:07
2
0
nice
mark
guobing 2011-8-19 16:26
3
0
Intel vt  高科技。。。谁能科普科普。。。
wandev 2011-8-19 17:30
4
0
mark,太高深了,慢慢看看
ProgmBoy 3 2011-8-19 19:18
5
0
一些介绍..
http://bbs.pediy.com/showthread.php?t=96122&highlight=
MengXP 2011-8-19 19:45
6
0
windbg是跑在nonroot模式的。
没办法调试vmexit(vmm)代码。
ProgmBoy 3 2011-8-19 20:16
7
0
嗯..这个只能靠bochs的自带的调试器了..这里只是说调带vt的代码的驱动用的
大白痴 2011-8-19 20:42
8
0
** 不错的东西
三寸法师 1 2011-8-19 21:01
9
0
本来以为坛子里的人编译个bochs什么的应该没什么难度的所以没有讲编译部分。
话说谁能搞定amd的调试啊。
ProgmBoy 3 2011-8-19 21:11
10
0
好吧..我又白菜了, 搞bochs和windbg链接,搞了半天...
ProgmBoy 3 2011-8-19 21:32
11
0
qemu好像支持svm...
sisess 1 2011-8-21 12:16
12
0
  这个得顶下~
superleft 2011-8-24 15:23
13
0
整死我了, 某些东西只认VMX 有些只认SVM... 要改得通用... 还真是麻烦...
吴靖wan 2011-8-30 11:14
14
0
mark mark
zuoyefeng 2011-9-14 15:16
15
0
好文,mark之
goldenpxf 2011-9-24 21:31
16
0
com1: enabled=1, mode=pipe_server, dev=”\\.\pipe\bochs”
好象mode=pipe_server 不行,只有用mode=pipe才可以
windbg的设置好象也不行呀windbg的baud 该怎么设置?
goldenpxf 2011-9-24 21:44
17
0
if (server) {
  pipe = CreateNamedPipe( dev,
    PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
    PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
    1, 4096, 4096, 0, NULL);
  if (pipe == INVALID_HANDLE_VALUE)
    BX_PANIC(("com%d: CreateNamedPipe(%s) failed", i+1, dev));
  BX_INFO(("com%d: waiting for client to connect to %s", i+1, dev));
  if (!ConnectNamedPipe(pipe, NULL) && GetLastError() != ERROR_PIPE_CONNECTED)
  {
    CloseHandle(pipe);
    pipe = INVALID_HANDLE_VALUE;
    BX_PANIC(("com%d: ConnectNamedPipe(%s) failed", i+1, dev));
  }
  }
  // client mode
  else {
  
   if ( strcmp(mode, "pipe") == 0 ){
    BX_INFO(("!!!!!!into our code!!!!!!!"));
    serial_pipe* our_serial = new serial_pipe(dev);
    BX_SER_THIS s[i].p_cls_our = our_serial;
   }
else{
     pipe = CreateFile( dev,
       GENERIC_READ | GENERIC_WRITE,
       0, NULL, OPEN_EXISTING, 0, NULL);

     if (pipe == INVALID_HANDLE_VALUE)
       BX_INFO(("com%d: failed to open pipe %s", i+1, dev));
   }
  }

这一段代码里,如果mode=pipe-server 红色部分好象不执行的呀....修改这里有什么用呢
goldenpxf 2011-9-25 01:56
18
0
不管怎么试,windbg连上去,windbg 看起来就是死了的,bochs里的操作系统不用debug模式,可以启动,用debug模式的情况下,死活都启动不了
skypismire 1 2011-9-25 02:45
19
0
我按照这个是可以的,,只是bochs的配置文件有点不好搞
goldenpxf 2011-9-25 18:17
20
0
你怎么搞的?只是bochs的配置文件给能不能给我?
goldenpxf 2011-9-25 18:18
21
0
clock,CPU的IPS都改过了...昨天晚上我连续试了几次可以了,但是今天又不行了
ProgmBoy 3 2011-9-26 01:45
22
0
我貌似说了怎么改配置文件啦,第7条(手机复制不方便),ips设大一点,最小值官网上有。别的和平常一样就行
SnowFox 2011-10-2 16:02
23
0
看不懂, 以后慢慢理解吧
游客
登录 | 注册 方可回帖
返回