求助 汇编 crash

黄志义 2014-01-07 12:50:12

004028A2 sub eax,0
004028A5 mov esi,ecx
004028A7 je 004028FB
004028A9 sub eax,1
004028AC je 004028DA
004028AE sub eax,1
004028B1 jne 00402887
004028B3 mov eax,dword ptr [esp+10h]
004028B7 test eax,eax
004028B9 ja 004028D0
004028BB push 0
004028BD push esi
004028BE push 0
004028C0 push ebx
004028C1 mov dword ptr [ecx+14h],1
004028C8 call dword ptr ds:[437030h]
004028CE jmp 00402887
004028D0 mov edx,dword ptr [ecx]
004028D2 push eax
004028D3 mov eax,dword ptr [edx+14h]
004028D6 call eax
004028D8 jmp 00402887
004028DA mov edx,dword ptr [ecx]
004028DC mov eax,dword ptr [edx+10h]
004028DF call eax
004028E1 mov ecx,dword ptr [esi+18h]
004028E4 push ecx
004028E5 call dword ptr ds:[4371C0h]
004028EB call 00401200
004028F0 push esi
004028F1 call 00419DAF
004028F6 add esp,4
004028F9 jmp 00402887
004028FB mov edx,dword ptr [ecx+18h]
004028FE push 0
00402900 push ecx
00402901 lea edi,[ecx+18h]
00402904 push ebx
00402905 push edx
00402906 call dword ptr ds:[437020h]
0040290C test eax,eax
0040290E jne 0040292C
00402910 mov eax,dword ptr [edi]
00402912 push eax
00402913 call dword ptr ds:[4371C0h]
00402919 call 00401200
0040291E push esi
0040291F call 00419DAF
00402924 add esp,4
00402927 jmp 00402887
0040292C mov edx,dword ptr [esi]

情况是这样:
已知:
跳转:004028A7 je 004028FB 已成功
跳转:0040290E jne 0040292C 已成功
这里:00402906 call dword ptr ds:[437020h] 是调用API CreateIoCompletionPort
在这里: 004028A5 mov esi,ecx 执行完之后 esi不可能为0
但是在这里:0040292C mov edx,dword ptr [esi] 的时候 esi 为0
偶然现象,看不出来,esi在哪里可能被改变,也没有发现可能被其它线程更改的可能
因为一共只有4个线程,其它三个线程都很简单,基本处于等待状态。
...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄志义 2014-01-07
  • 打赏
  • 举报
回复
4、context被覆盖的话应该是被部分覆盖吧 因为我从dump文件发现esp值是正确的 因为从esp指向的栈中拿到了正确的esi的值。并且把该地址作为指针还原类对象成功。 类成员的值都是正常的。
黄志义 2014-01-07
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
context 被覆盖的话,那后果可是灾难性的,应该全面崩溃了。 vs 生成的,那就是 00402906 call dword ptr ds:[437020h] 这里的问题吧,437020h 处是 CreateIoCompletionPort() 的直接入口,还是有另外的函数,那函数里调用了 CreateIoCompletionPort() ?如果是直接调用的那个系统 API,则紧接着的 mov esi, ecx 就有问题了,函数都是可能破坏 ecx 的,ecx 不再是原来的内容,所以这么赋值就是不对的;如果是另外的函数再次调用的那个系统 API 并创建了相应的对象指针返回在 ecx 里的话,说明返回的 ecx 为 NULL,往往是意味着调用那个系统 API 失败。
1、是直接调用的API CreateIoCompletionPort() 2、0040290C test eax,eax 0040290E jne 0040292C 从这两句,以后崩溃是在0040292C mov edx,dword ptr [esi] 说明调用是成功的。 3、mov esi, ecx 这一句是在最开始的地方,不是紧接着CreateIoCompletionPort()啊
zara 2014-01-07
  • 打赏
  • 举报
回复
context 被覆盖的话,那后果可是灾难性的,应该全面崩溃了。
vs 生成的,那就是 00402906 call dword ptr ds:[437020h] 这里的问题吧,437020h 处是 CreateIoCompletionPort() 的直接入口,还是有另外的函数,那函数里调用了 CreateIoCompletionPort() ?如果是直接调用的那个系统 API,则紧接着的 mov esi, ecx 就有问题了,函数都是可能破坏 ecx 的,ecx 不再是原来的内容,所以这么赋值就是不对的;如果是另外的函数再次调用的那个系统 API 并创建了相应的对象指针返回在 ecx 里的话,说明返回的 ecx 为 NULL,往往是意味着调用那个系统 API 失败。
黄志义 2014-01-07
  • 打赏
  • 举报
回复
可以肯定确实是在 0040292C mov edx,dword ptr [esi] 处的 esi=0 引起的,现在我的猜测是在线程挂起的时候,其它线程溢出导致此线程的context被覆盖。至于说esi没有保存恢复的可能性不大,因为代码是VS生成的,并不是自己直接编写的汇编。
zara 2014-01-07
  • 打赏
  • 举报
回复
首先要肯定问题确实是在 0040292C mov edx,dword ptr [esi] 处的 esi=0 引起的;如果真是这样,上面的调用的自己的函数和其它线程就可能有问题,比较常见的就是使用了 esi 但没有进行保存恢复,或者是对几个寄存器进行保存恢复时顺序错误导致 esi 值被改变。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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