使用WinDBG执行代码片段

来源:互联网 发布:渡口网络 编辑:程序博客网 时间:2024/05/28 05:14

在C标准库里,有一个函数是time(),它可以获取自1970年1月1日0时起至今的秒数。由于偶然的原因,我需要这个时间值,但不是在程序里。找来找去,好像没有什么工具可以直接生成这个值。自己倒可以编几行代码来完成这个功能,但毕竟麻烦,有没有什么好的方法呢。

这时,我想到了WinDBG。既然time()是C标准库的一个函数,那么我们应该可以在WinDBG里直接运行这个函数的代码,前提是C运行库已经加载。

说干就干。先打开命令行窗口。因为我已经在环境变量里设置了WinDBG的安装路径,所以可以在命令行窗口里启动WinDBG。输入以下命令:

windbg notepad

WinDBG会启动并加载notepad.exe,然后停下来。我们可以已经加载的模块列表里,发现C运行库msvcrt.dll已经加载。然后看看里面有没有time函数。输入以下命令:

x msvcrt!time

会发现msvcrt里确实有这个函数。下面看一下这个函数的代码:

uf msvcrt!time

输出:

msvcrt!time:
77c1aea3 8bff mov edi,edi
77c1aea5 55 push ebp
77c1aea6 8bec mov ebp,esp
77c1aea8 51 push ecx
77c1aea9 51 push ecx
77c1aeaa 8d45f8 lea eax,[ebp-8]
77c1aead 50 push eax
77c1aeae ff154812be77 call dword ptr [msvcrt!_imp__GetSystemTimeAsFileTime (77be1248)]
77c1aeb4 8b45f8 mov eax,dword ptr [ebp-8]
77c1aeb7 8b4dfc mov ecx,dword ptr [ebp-4]
77c1aeba 6a00 push 0
77c1aebc 050080c12a add eax,2AC18000h
77c1aec1 6880969800 push 989680h
77c1aec6 81d1214e62fe adc ecx,0FE624E21h
77c1aecc 51 push ecx
77c1aecd 50 push eax
77c1aece e8bdc80000 call msvcrt!_aulldiv (77c27790)
77c1aed3 8b4d08 mov ecx,dword ptr [ebp+8]
77c1aed6 85c9 test ecx,ecx
77c1aed8 7402 je msvcrt!time+0x39 (77c1aedc)

msvcrt!time+0x37:
77c1aeda 8901 mov dword ptr [ecx],eax

msvcrt!time+0x39:
77c1aedc c9 leave
77c1aedd c3 ret


可以发现,time()函数会调用GetSystemTimeAsFileTime()函数,然后再转换成秒数的格式。因此,我们可以直接执行这段代码来获取时间值。

输入以下命令:

g =77c1aea3 77c1aed3

意思是从77c1aea3处开始执行,到77c1aed3结束。输出:

eax=49cd8c22 ebx=7ffde000 ecx=00989680 edx=00000000 esi=001a1f18 edi=001a1ea4
eip=77c1aed3 esp=0007fb14 ebp=0007fb1c iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
msvcrt!time+0x30:
77c1aed3 8b4d08 mov ecx,dword ptr [ebp+8] ss:0023:0007fb24=7ffdd000

因为函数的返回值是保存在EAX里,所以这时EAX值应该就是我需要的秒数。转换成十制看一下:
输入:

? 49cd8c22

输出:

Evaluate expression: 1238207522 = 49cd8c22

1238207522正是需要的时间。

也许可以再想一下,用.call命令直接执行这个time()函数行不行。结果是不行,因为.call命令需要私有符号表,而微软提供的是公共符号表,没有参数信息,所以.call执行不了这个函数。

这样不需要编程就可以获取这个时间。这个方法也可以应用到其他一些功能简单的库函数上,也不限于C运行库,会有意想不到的效果。

其实上述过程可以在命令行窗口里,用一条命令完成。直接输入以下命令按回车就会得到结果:

cdb -c "g =77c1aea3 77c1aed3; .echo time value: ; ? @eax; q"

 

 

原创粉丝点击