zoukankan      html  css  js  c++  java
  • windbg学习----P和T

    p|t =startAddr count

    可以让目标程序从指定的startAddr开始指行,注意,如果指定地址跳过了调整栈的代码,栈就会失去平衡

    count指定要单步执行的次数,如t 2就是两次运行t

    0:000> t 2
    eax=99e265e1 ebx=7ffd3000 ecx=00000000 edx=01b00370 esi=0026fc88 edi=0026fc80
    eip=01582e9c esp=0026fbd4 ebp=0026fc80 iopl=0         nv up ei ng nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000286
    >   17: 	ZeroMemory(&ovi, sizeof(OSVERSIONINFO));
    VerifyTxSignDemo!BeginAnti+0x2c:
    01582e9c 6a00            push    0
    eax=99e265e1 ebx=7ffd3000 ecx=00000000 edx=01b00370 esi=0026fc88 edi=0026fc80
    eip=01582e9e esp=0026fbd0 ebp=0026fc80 iopl=0         nv up ei ng nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000286
    
    eip从9c更新到9e,对应汇编:

    01582e9c 6a00            push    0
    01582e9e 8d8564ffffff    lea     eax,[ebp-9Ch]
    两步!


    还可以用p|t =startAddr count "command"
    command指定每次单步执行后要执行的命令

    0:000> t 3 ".echo @"run ok....""
    eax=00000000 ebx=7ffd3000 ecx=0026fbe4 edx=00000094 esi=0026fc88 edi=0026fc80
    eip=018c24fe esp=0026fbc8 ebp=0026fc80 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
    No source found for 'f:ddvctoolscrt_bldSELF_X86crtsrcINTELmemset.asm'
    VerifyTxSignDemo!memset+0x1e:
    018c24fe 833da080b00100  cmp     dword ptr [VerifyTxSignDemo!__sse2_available (01b080a0)],0 ds:0023:01b080a0=00000001
    eax=00000000 ebx=7ffd3000 ecx=0026fbe4 edx=00000094 esi=0026fc88 edi=0026fc80
    eip=018c2505 esp=0026fbc8 ebp=0026fc80 iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
    No source found for 'f:ddvctoolscrt_bldSELF_X86crtsrcINTELmemset.asm'
    VerifyTxSignDemo!memset+0x25:
    018c2505 7405            je      VerifyTxSignDemo!memset+0x2c (018c250c) [br=0]
    run ok....
    eax=00000000 ebx=7ffd3000 ecx=0026fbe4 edx=00000094 esi=0026fc88 edi=0026fc80
    eip=018c2507 esp=0026fbc8 ebp=0026fc80 iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
    No source found for 'f:ddvctoolscrt_bldSELF_X86crtsrcINTELmemset.asm'
    VerifyTxSignDemo!memset+0x27:
    018c2507 e983b9c9ff      jmp     VerifyTxSignDemo!ILT+16010(__VEC_memzero) (0155de8f)
    
    可以看到,run ok....只执行了一次

    pa|ta  =startAddr stopAddr “command”

    相当于反复调用p或t,不同就是,t会遇到函数调用进入到函数中,而不是越过

    0:000> r eip
    eip=00452e7a
    0:000> pa 00452e8b ".echo @"pa run ok...""
    eax=00000001 ebx=7ffdb000 ecx=85fc7085 edx=009d0370 esi=0019fcc0 edi=0019fdc8
    eip=00452e7b esp=0019fc10 ebp=0019fcb8 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
    >   14: {
    VerifyTxSignDemo!BeginAnti+0xb:
    00452e7b 8dbd60ffffff    lea     edi,[ebp-0A0h]
    eax=00000001 ebx=7ffdb000 ecx=85fc7085 edx=009d0370 esi=0019fcc0 edi=0019fc18
    eip=00452e81 esp=0019fc10 ebp=0019fcb8 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
    >   14: {
    VerifyTxSignDemo!BeginAnti+0x11:
    00452e81 b928000000      mov     ecx,28h
    eax=00000001 ebx=7ffdb000 ecx=00000028 edx=009d0370 esi=0019fcc0 edi=0019fc18
    eip=00452e86 esp=0019fc10 ebp=0019fcb8 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
    >   14: {
    VerifyTxSignDemo!BeginAnti+0x16:
    00452e86 b8cccccccc      mov     eax,0CCCCCCCCh
    pa run ok...
    eax=cccccccc ebx=7ffdb000 ecx=00000028 edx=009d0370 esi=0019fcc0 edi=0019fc18
    eip=00452e8b esp=0019fc10 ebp=0019fcb8 iopl=0         nv up ei pl nz na pe nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
    >   14: {
    VerifyTxSignDemo!BeginAnti+0x1b:
    00452e8b f3ab            rep stos dword ptr es:[edi]

    因为$ra总是代表当前函数的返回地址,所以可以使用pa @$ra来步出当前函数,也就是单步反复执行直到返回到上一级函数

    相当于gu命令,但因为是单步的,所以可能会卡顿


    pc|tc  =startAddr  count

    用来单步执行到下一个函数调用指令CALL,count是指遇到的函数调用指令个数,

    0:000> pc 
    eax=0030fab0 ebx=7ffdf000 ecx=00000000 edx=01690370 esi=0030fb54 edi=0030fb4c
    eip=01112ea5 esp=0030fa98 ebp=0030fb4c iopl=0         nv up ei pl nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
    >   17: 	ZeroMemory(&ovi, sizeof(OSVERSIONINFO));
    VerifyTxSignDemo!BeginAnti+0x35:
    01112ea5 e83a37feff      call    VerifyTxSignDemo!ILT+50655(_memset) (010f65e4)

    可以看出,在第一个call处断下来了

    tc也一样,不同处是,如果count为2或更大,中间遇到call, pc 就步过了,而tc会跟进去

    0:000> pc 2
    eax=0020f6b4 ebx=7ffdf000 ecx=00000000 edx=01b50370 esi=0020f758 edi=0020f750
    eip=015d2ea5 esp=0020f69c ebp=0020f750 iopl=0         nv up ei ng nz na po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000282
    >   17: 	ZeroMemory(&ovi, sizeof(OSVERSIONINFO));
    VerifyTxSignDemo!BeginAnti+0x35:
    015d2ea5 e83a37feff      call    VerifyTxSignDemo!ILT+50655(_memset) (015b65e4)
    eax=0020f6b4 ebx=7ffdf000 ecx=0020f6b4 edx=00000000 esi=0020f6a8 edi=0020f750
    eip=015d2ec0 esp=0020f6a4 ebp=0020f750 iopl=0         nv up ei pl nz ac po nc
    cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000212
    >   20: 	GetVersionEx(&ovi);
    VerifyTxSignDemo!BeginAnti+0x50:
    015d2ec0 ff150caeb501    call    dword ptr [VerifyTxSignDemo!_imp__GetVersionExA (01b5ae0c)] ds:0023:01b5ae0c={kernel32!GetVersionExAStub (7668dd70)}
    

    可以看到代码是在第二次call处断下


    同样,ph|th可用于同样效果,追踪到下一分支指令





















  • 相关阅读:
    WinCE数据库开发时整出来的一个致命的BUG
    WinCE下读取注册表获得SD卡路径
    Cookie的创建、读写和删除
    Http Module 介绍[转]
    贴几个从Dnt论坛代码里边扣出来的函数
    SqlServer判断数据库、表、存储过程、函数是否存在
    WinCE中C#WinForm利用Web Service查询数据库
    关于WinCE和PC中同一字符串的GetHashCode()结果不同的理解
    DataTable中数据记录的统计
    C#读取XML时自动过滤掉注释部分
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693375.html
Copyright © 2011-2022 走看看