调试达人来看。

贪食蛇男 2011-06-25 10:43:42
抓取 dump 文件经分析,栈是这样的:


00043428 1001b7ee 00043440 10036e52 00043470 docsafe!_woutput+0x10
00043460 10006d19 00043488 10036e50 00000108 docsafe!swprintf+0x2e
000436a0 1000adaa 00000003 80000000 80000000 docsafe!GetBTmpF+0x59 [D:\cis7encrypt\Encrypt\hooktool_morefun\_win32.cpp @ 3524]
*** ERROR: Symbol file could not be found. Defaulted to export symbols for HaxFile.dll -
00044040 00f45f4d 0013cedc 80000000 00000001 docsafe!GXXX_CreateFileW+0x9fa [D:\cis7encrypt\Encrypt\hooktool_morefun\_win32.cpp @ 7381]
WARNING: Stack unwind information not available. Following frames may be wrong.
0013cedc 0044005c 0063006f 006d0075 006e0065 HaxFile!RefreshSerial+0xad
003a0043 e1081800 432eb0bb 010001e1 7370a800 <Unloaded_ion.dll>+0x44005b
003a0047 432eb0bb 010001e1 7370a800 452830e1 0xe1081800
003a004b 010001e1 7370a800 452830e1 010003e1 <Unloaded_ion.dll>+0x432eb0ba
003a004f 7370a800 452830e1 010003e1 e1094000 <Unloaded_ion.dll>+0x10001e0
003a0053 452830e1 010003e1 e1094000 432eb0bb 0x7370a800
003a0057 010003e1 e1094000 432eb0bb 010001e1 <Unloaded_ion.dll>+0x452830e0
003a005b e1094000 432eb0bb 010001e1 486c0800 <Unloaded_ion.dll>+0x10003e0
003a005f 432eb0bb 010001e1 486c0800 452830e1 0xe1094000
003a0063 010001e1 486c0800 452830e1 010003e1 <Unloaded_ion.dll>+0x432eb0ba
003a0067 486c0800 452830e1 010003e1 e10a8800 <Unloaded_ion.dll>+0x10001e0
003a006b 452830e1 010003e1 e10a8800 432eb0bb 0x486c0800
003a006f 010003e1 e10a8800 432eb0bb 010001e1 <Unloaded_ion.dll>+0x452830e0
003a0073 e10a8800 432eb0bb 010001e1 4df18800 <Unloaded_ion.dll>+0x10003e0
003a0077 432eb0bb 010001e1 4df18800 452830e1 0xe10a8800
003a007b 010001e1 4df18800 452830e1 010003e1 <Unloaded_ion.dll>+0x432eb0ba
003a007f 4df18800 452830e1 010003e1 e306e800 <Unloaded_ion.dll>+0x10001e0
003a0083 452830e1 010003e1 e306e800 432eb0bb 0x4df18800
003a0087 010003e1 e306e800 432eb0bb 010001e1 <Unloaded_ion.dll>+0x452830e0
003a008b e306e800 432eb0bb 010001e1 76618800 <Unloaded_ion.dll>+0x10003e0
003a008f 432eb0bb 010001e1 76618800 452830e1 0xe306e800
003a0093 010001e1 76618800 452830e1 010003e1 <Unloaded_ion.dll>+0x432eb0ba
003a0097 76618800 452830e1 010003e1 e3081800 <Unloaded_ion.dll>+0x10001e0
003a009b 452830e1 010003e1 e3081800 432eb0bb 0x76618800
003a009f 010003e1 e3081800 432eb0bb 010001e1 <Unloaded_ion.dll>+0x452830e0
003a00a3 e3081800 432eb0bb 010001e1 43919000 <Unloaded_ion.dll>+0x10003e0
003a00a7 432eb0bb 010001e1 43919000 452830e1 0xe3081800
003a00ab 010001e1 43919000 452830e1 010003e1 <Unloaded_ion.dll>+0x432eb0ba
003a00af 43919000 452830e1 010003e1 e3094000 <Unloaded_ion.dll>+0x10001e0
003a00b3 452830e1 010003e1 e3094000 432eb0bb <Unloaded_ion.dll>+0x43918fff
003a00b7 010003e1 e3094000 432eb0bb 010001e1 <Unloaded_ion.dll>+0x452830e0
......
003a01fb 020001e1 44cd4800 452830e1 010003e1 shell32!_pRawDllMain <PERF> (shell32+0x5da0bc)
003a01ff 44cd4800 452830e1 010003e1 1c081800 <Unloaded_ion.dll>+0x20001e0
003a0203 452830e1 010003e1 1c081800 7db6a0bc <Unloaded_ion.dll>+0x44cd47ff
003a0207 010003e1 1c081800 7db6a0bc 010001e1 <Unloaded_ion.dll>+0x452830e0
003a020b 1c081800 7db6a0bc 010001e1 4cf12800 <Unloaded_ion.dll>+0x10003e0
003a020f 7db6a0bc 010001e1 4cf12800 452830e1 <Unloaded_ion.dll>+0x1c0817ff
003a0213 010001e1 4cf12800 452830e1 010003e1 shell32!_pRawDllMain <PERF> (shell32+0x5da0bc)
003a0217 4cf12800 452830e1 010003e1 1c094000 <Unloaded_ion.dll>+0x10001e0
003a021b 452830e1 010003e1 1c094000 7db6a0bc 0x4cf12800
003a021f 010003e1 1c094000 7db6a0bc 010001e1 <Unloaded_ion.dll>+0x452830e0
003a0223 1c094000 7db6a0bc 010001e1 49212800 <Unloaded_ion.dll>+0x10003e0
003a0227 7db6a0bc 010001e1 49212800 452830e1 <Unloaded_ion.dll>+0x1c093fff
003a022b 010001e1 49212800 452830e1 010003e1 shell32!_pRawDllMain <PERF> (shell32+0x5da0bc)

报 Stack Overflow ,看来是递归之类导致的栈溢出?
shell32!_pRawDllMain 是做什么的?
这是从客户机器上抓的 dump 文件,我这边没有所谓的 Unloaded_ion.dll。
栈在 unloaded_ion.dll 里太深了,最后竟然出来了,跑到我的DLL里,并在我的DLL里正常压栈导致栈溢出?
求调试达人讲解
...全文
183 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪食蛇男 2011-06-27
  • 打赏
  • 举报
回复
已验证原因是多个模块 HOOK 同一个函数,形成HOOK链后,在某些情况下解HOOK造成的HOOK链断掉造成的。
谢谢楼上各位。
结贴
cabinriver 2011-06-26
  • 打赏
  • 举报
回复
调试 这块不懂哦
cnzdgs 2011-06-26
  • 打赏
  • 举报
回复
你目前掌握的信息不足以推断问题。建议你问清客户机器的软硬件环境,在自己的机器上模拟测试。
另外,你HOOK了哪些函数?这个问题是哪个函数引起的?
xyytuo 2011-06-26
  • 打赏
  • 举报
回复
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
这个低级错误的确没犯……
因为EasyHook天生防重入
在别的机器上没有引起栈溢出,客户那引起了,我觉得 unloaded_ion.dll 比较可疑,这是个啥?
没有搜到关于这个模块的来历。
最恶心的是远程到客户那太痛苦了,就抓这个几十M的 mini dump ,耗了两个小时以上……
[Quote=引用 12 楼 cnzdgs 的回复:]

是不是你的HOOK代码中又调用了被HOOK的函数?
[/Quote]
cnzdgs 2011-06-25
  • 打赏
  • 举报
回复
是不是你的HOOK代码中又调用了被HOOK的函数?
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
栈没有 unwind 是指可能之前返回地址就被覆盖掉了?
据我观察,应非 swprintf 的缓冲区的问题,抓到的 dump 查看当时的参数,参数和缓冲区长度都在可控范围内。
[Quote=引用 10 楼 xiaopoy 的回复:]

swprintf使用的format字符串参数是否是自己固定的?
传递给swprintf用来返回的缓冲区,是否比传进去的数据还短?

下面的堆栈没有 unwind这种确定函数使用的堆栈范围的数据,是不可信的,只能认为它们代表着之前执行过的大概的函数模块是哪个,不能确定它是执行了哪些。
[/Quote]
kyotrue 2011-06-25
  • 打赏
  • 举报
回复
等待高人出现...
xiaopoy 2011-06-25
  • 打赏
  • 举报
回复
swprintf使用的format字符串参数是否是自己固定的?
传递给swprintf用来返回的缓冲区,是否比传进去的数据还短?

下面的堆栈没有 unwind这种确定函数使用的堆栈范围的数据,是不可信的,只能认为它们代表着之前执行过的大概的函数模块是哪个,不能确定它是执行了哪些。
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
还有,最上面栈帧表示 swprintf里死掉,我检查了下 swprintf 使用的缓冲区,确实没有溢出。
我第一反应也是 swprintf 第一个参数过小,但证实了此处没有溢出后发现下面大 unloaded_ico.dll 模块中大量类似递归的栈帧。
[Quote=引用 2 楼 oyljerry 的回复:]

既然到了你的dll,那么就结合你dll的pdb文件,然后用windbg来定位代码行数,从栈上看,像是数组等越界.
[/Quote]
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
我仔细查看了代码,我的程序可以确定没有递归,也没有错误的函数重入。
由于我是个DLL,没法用 /stack 选项……
[Quote=引用 5 楼 cnzdgs 的回复:]

先确认一下你的程序中有没有递归,递归函数中栈的使用量是否过大。
可以修改连接选项,把栈空间设大一些,来验证是不是栈空间不足。
[/Quote]
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
HOOK?一语中的?你是说API HOOK还是全局消息HOOK?
我的模块是个DLL,进程是 excel.exe,利用全局 WH_CBT HOOK 注入 excel后做的 API HOOK。
请详示,谢谢。
[Quote=引用 6 楼 lisunlin0 的回复:]

好像是那个hook的系统兼容性问题,在vista/win7上面有很多地方都是有新的权限检测问题,这样有不少hook系统都会出现问题。
[/Quote]
sunlin7 2011-06-25
  • 打赏
  • 举报
回复
好像是那个hook的系统兼容性问题,在vista/win7上面有很多地方都是有新的权限检测问题,这样有不少hook系统都会出现问题。
cnzdgs 2011-06-25
  • 打赏
  • 举报
回复
先确认一下你的程序中有没有递归,递归函数中栈的使用量是否过大。
可以修改连接选项,把栈空间设大一些,来验证是不是栈空间不足。
贪食蛇男 2011-06-25
  • 打赏
  • 举报
回复
看下面一直在unloaded_ion.dll里执行,跟一个死递归似的。
但是我觉得总不能我这么衰,终于跳出递归了,栈也耗尽了……
我定位了我的那行代码,没有缓冲区溢出。
我只能认为是栈满,天下有这么巧合?
无言猪 2011-06-25
  • 打赏
  • 举报
回复
如果Unloaded_ion.dll里面没有做FPO优化的话,从上面信息来看就是Unloaded_ion.dll里面有递归(0x10001e0,0x10003e0),最后到一定条件时调用你的库里面的函数时正好是栈溢出了。
oyljerry 2011-06-25
  • 打赏
  • 举报
回复
既然到了你的dll,那么就结合你dll的pdb文件,然后用windbg来定位代码行数,从栈上看,像是数组等越界.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧