首页
社区
课程
招聘
[原创]利用windbg脚本调试简单实例
发表于: 2011-11-15 22:13 23915

[原创]利用windbg脚本调试简单实例

2011-11-15 22:13
23915

之前想写一篇用windbg脚本调试的东西,但是一直比较懒,懒得动手,懒得想例子,把时间都放在了游戏上面,所以想法虽好一直没有实施...
    这次写一个非常简单的利用windbg脚本进行动态调试的小文,博君一笑.
    // Windbgscript.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
using namespace std;


int ret100()
{
  [B]int x = 2;[/B]  //2-3
  x*=33;
  ++x;

  return x;
}

int add(int x, int y)
{
  [B]x = 0;[/B] //多余的
  return x+y;

}


int _tmain(int argc, _TCHAR* argv[])
{

  int x = 100;

  int y = add( x, ret100());

  cout << y;

  getchar();
  return 0;
}
0:001> uf windbgscript!ret100
   11 00401000 55              push    ebp
   11 00401001 8bec            mov     ebp,esp
   11 00401003 51              push    ecx
 [B]  12 00401004 c745fc02000000  mov     dword ptr [ebp-4],2
   [U]13 0040100b 8b45fc          mov     eax,dword ptr [ebp-4][/U][/B]
   13 0040100e 6bc021          imul    eax,eax,21h
   13 00401011 8945fc          mov     dword ptr [ebp-4],eax
   14 00401014 8b4dfc          mov     ecx,dword ptr [ebp-4]
   14 00401017 83c101          add     ecx,1
   14 0040101a 894dfc          mov     dword ptr [ebp-4],ecx
   16 0040101d 8b45fc          mov     eax,dword ptr [ebp-4]
   17 00401020 8be5            mov     esp,ebp
   17 00401022 5d              pop     ebp
   17 00401023 c3              ret

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (18)
雪    币: 15203
活跃值: (4155)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,又学了一招,希望楼主多出这样简单易懂的文章!谢谢了
2011-11-15 22:49
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这种太简单了,lz整下字符串的匹配吧,多字节编码和unicode编码,大小写敏感,子串匹配,自由组合。
当然自己写插件就简单了。
2011-11-15 23:36
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
对,这个确实非常简单

因为我觉得写的简单点儿比较容易被接受, 太复杂了就不是教程贴了
2011-11-16 09:22
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
厉害啊。来点实战的吧
2011-11-16 11:59
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
不错不错,以后修改多个跳转就方便了
2011-11-22 10:00
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
看看。。:)
2011-11-24 15:35
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
THX
来点内核 脚本调试范例如何?
2011-11-24 16:32
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
实在不好意思, 对内核调试的东西一无所知啊
2011-11-24 17:30
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
  看看
2011-11-26 00:15
0
雪    币: 104
活跃值: (72)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
11
int add(int x, int y)
{
  x = 0; //多余的
  return x+y;

}
脑子里以为 x= 0 这条指令会在栈中开辟空间,怎么是从参数传了。因为是函数内部局部变量,我还以为是 mov DWORD PTR [ebp-4],0 呢。求指点
2011-11-28 19:11
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=hash;1024496]int add(int x, int y)
{
  x = 0; //多余的
  return x+y;

}
脑子里以为 x= 0 这条指令会在栈中开辟空间,怎么是从参数传了。因为是函数内部局部变量,我还以为是 mov DWORD PTR [ebp-4],0 呢。求指点[/QUOTE]

首先x会在栈中有位置 -- 参数位置

其次,栈是逆向生长的,所以定位参数需要 ebp+?

最后,默认压栈次序为倒序, 再加上eip会占一个位置,然后 y, 最后 x 所以x 在栈上的位置: ebp+8
2011-11-29 19:41
0
雪    币: 224
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢楼主分享!
2012-2-4 19:47
0
雪    币: 1644
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
感谢分享。。。
2012-2-8 10:53
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶,学习了。
2012-2-13 17:26
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
代码:
bp windbgscript!add + 0x03 "
r @eip = @eip+0xa; $$ @符号会让脚本解释程序认为后面跟随的名称代表为寄存器, 节省查找时间,提高效率
gc;
"
请问,为什么是+0xa,而不是+0x7?
2012-5-23 15:30
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
应该是0x7, 可能我当时打错字了;我那里有存根回去看下修正
多谢细心指出
2012-5-24 08:57
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
windbgscript!main [e:\workspace\windbgscript\windbgscript.cpp @ 28]:
   28 00401050 55              push    ebp
   28 00401051 8bec            mov     ebp,esp
   28 00401053 83ec0c          sub     esp,0Ch
   30 00401056 c745f864000000  mov     dword ptr [ebp-8],64h
   32 0040105d e89effffff      call    windbgscript!ret100 (00401000)
   32 00401062 50              push    eax
   32 00401063 8b45f8          mov     eax,dword ptr [ebp-8]
   32 00401066 50              push    eax
   32 00401067 e8c4ffffff      call    windbgscript!add (00401030)
   32 0040106c 83c408          add     esp,8
   32 0040106f 8945fc          mov     dword ptr [ebp-4],eax
   34 00401072 8b4dfc          mov     ecx,dword ptr [ebp-4]
   34 00401075 51              push    ecx
   34 00401076 b980614100      mov     ecx,offset windbgscript!std::cout (00416180)
   34 0040107b e850000000      call    windbgscript!std::basic_ostream<char,std::char_traits<char> >::operator<< (004010d0)
   36 00401080 8b159c534100    mov     edx,dword ptr [windbgscript!_iob+0x4 (0041539c)]
   36 00401086 83ea01          sub     edx,1
   36 00401089 89159c534100    mov     dword ptr [windbgscript!_iob+0x4 (0041539c)],edx
   36 0040108f 7822            js      windbgscript!main+0x63 (004010b3)

两处巧合导致错误的脚本得出了和预期一样的结果
1. 第二条指令恰好3个字节 -- +0xa 没问题
2. 下一条指令给eax赋值100, 而此时eax就是100 -- main里赋的值
2012-5-24 09:26
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
2012-5-25 14:31
0
游客
登录 | 注册 方可回帖
返回
//