注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

且行且记录

点滴记录,行的更远!

 
 
 

日志

 
 

调试odbcad32.exe  

2013-01-29 16:17:02|  分类: 调试记录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

点击“管理工具》数据源(ODBC)”即可运行ODBC数据源管理器。

添加一个SQL的数据源,点服务器列表即可列出本地网络上的SQL服务器。

调试odbcad32.exe - appall - 且行且记录

 从进程管理器里可以知道目标程序为odbcad32.exe。

附加到该程序进入调试cdb -pn odbcad32.exe

先查看一下网络相关的api

发送数据方面的api

0:003> x ws2_32!*send*
71a22f51 WS2_32!sendto
71a24c27 WS2_32!send
71a268fa WS2_32!WSASend
71a30a22 WS2_32!WSASendDisconnect
71a30aad WS2_32!WSASendTo

接收数据方面的api
0:003> x ws2_32!*recv*
71a22ff7 WS2_32!recvfrom
71a24cb5 WS2_32!WSARecv
71a2676f WS2_32!recv
71a2f5ee WS2_32!WSARecvDisconnect
71a2f66a WS2_32!WSARecvFrom

由于不清楚到底是哪个api,那就下bm断点,该命令支持通配符

0:003> bm ws2_32!*send*
0:003> bm ws2_32!*recv*
这样就把上面列出的api都下了断点

点一下下拉按钮,第一次中断如下:

WS2_32!sendto:
71a22f51 8bff            mov     edi,edi
堆栈内容如下:

0:000> kn
 # ChildEBP RetAddr 
00 0007bda0 6d88fd07 WS2_32!sendto
01 0007bf0c 6d88cb8e DBNETLIB!ConnectionServerEnumW+0xfe0
02 0007c93c 4b4c1bd5 DBNETLIB!InitEnumServers+0x44f
03 0007ce88 4b4c1f75 sqlsrv32!FinishDlgProc+0xebb
04 0007d5cc 77d18734 sqlsrv32!WizDSNDlgProc+0xfb

0:000> dd esp
0007bda4  6d88fd07 00000688 0007be04 00000001
0007bdb4  00000000 0007bdf4 00000010 00000000

看一下发送的数据

0:000> db 0007be04 l1
0007be04  02                                               .
从上可知发送UDP数据02

查看一下相关代码,这样为了以后用OD看相关代码比较好找。

毕竟在windbg里看代码比较难!

0:000> ub 6d88fd07
DBNETLIB!ConnectionServerEnumW+0xfbe:
6d88fce5 8d85e8feffff    lea     eax,[ebp-118h]
6d88fceb 50              push    eax
6d88fcec 6a00            push    0
6d88fcee ffb5d0feffff    push    dword ptr [ebp-130h]
6d88fcf4 8d85f8feffff    lea     eax,[ebp-108h]
6d88fcfa 50              push    eax
6d88fcfb ffb5d4feffff    push    dword ptr [ebp-12Ch]
6d88fd01 ff153411886d    call    dword ptr [DBNETLIB+0x1134 (6d881134)]
0:000> u
DBNETLIB!ConnectionServerEnumW+0xfe0:
6d88fd07 83f8ff          cmp     eax,0FFFFFFFFh
6d88fd0a 7542            jne     DBNETLIB!ConnectionServerEnumW+0x1027 (6d88fd4e)
6d88fd0c ff156811886d    call    dword ptr [DBNETLIB+0x1168 (6d881168)]
6d88fd12 f6059060896d02  test    byte ptr [DBNETLIB!GenClientContext+0x23d6 (6d896090)],2
6d88fd19 7423            je      DBNETLIB!ConnectionServerEnumW+0x1017 (6d88fd3e)
6d88fd1b 833d8074896d00  cmp     dword ptr [DBNETLIB!GenClientContext+0x37c6 (6d897480)],0

之后的中断都中断在WS2_32!WSARecvFrom

从堆栈如下:

0:000> kn
 # ChildEBP RetAddr 
00 0007a8b0 71a4303a WS2_32!WSARecvFrom
01 0007a8e4 6d88ce8f WSOCK32!recvfrom+0x39
02 0007c938 4b4c1bf0 DBNETLIB!GetNextEnumeration+0x29b
03 0007ce88 4b4c1f75 sqlsrv32!FinishDlgProc+0xed6
04 0007d5cc 77d18734 sqlsrv32!WizDSNDlgProc+0xfb
从堆栈可知下断点WSOCK32!recvfrom可以代替这个断点。

bp WSOCK32!recvfrom

之后就用这个断点即可。

中断在函数开头先看一下参数

WSOCK32!recvfrom:
71a43001 8bff            mov     edi,edi
0:000> dd esp
0007a8e8  6d88ce8f 00000688 0007a934 00002000
0007a8f8  00000000 0007a924 0007a910 5c277c6b
接收数据的断点要在该api运行完之后才能得到数据,那就pt一下。

0:000> pt
eax=0000007b ebx=00035878 ecx=00b06eb0 edx=00000001 esi=0007c98c edi=00037159
eip=71a4305c esp=0007a8e8 ebp=0007c938 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
WSOCK32!recvfrom+0x5b:
71a4305c c21800          ret     18h

现在可以看参数收到的数据了,如下:
0:000> db 0007a934
0007a934  05 78 00 53 65 72 76 65-72 4e 61 6d 65 3b 4b 4f  .x.ServerName;KO
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

由于没有装嗅探软件,不然直接可以看到这个过程。

  评论这张
 
阅读(423)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017