-
-
[分享]初步解决VC6内联汇编时经常无故出现的卡死状态,请大家一起分享
-
发表于:
2011-3-14 21:27
9072
-
[分享]初步解决VC6内联汇编时经常无故出现的卡死状态,请大家一起分享
解决VC6内联汇编时经常无故出现的卡死状态,请大家一起分享
有时写程序时,经常使用VC6内联汇编还是多数时候还是会卡死,有时候只要内联汇编
就不得不每修改一处代码就CTRL+S保存一下,搞不好哪时候卡死了,
要不全部汗水付之东流了,十分麻烦
经过使用OLLYDBG分析,发现VC卡死时,程序执行到
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\feacp.dll模块的代码中,具体代码如下
5F0D70B0 56 push esi
5F0D70B1 8B7424 08 mov esi, [esp+8]-----------------死循环开始
5F0D70B5 8BC6 mov eax, esi
5F0D70B7 25 FF000000 and eax, 0FF
5F0D70BC 3D F2000000 cmp eax, 0F2
5F0D70C1 77 0F ja short 5F0D70D2
5F0D70C3 33C9 xor ecx, ecx
5F0D70C5 8A88 6C710D5F mov cl, [eax+5F0D716C]
5F0D70CB FF248D 58710D5F jmp [ecx*4+5F0D7158]
5F0D70D2 B9 30550F5F mov ecx, 5F0F5530
5F0D70D7 E8 F4B8F6FF call 5F0429D0
5F0D70DC 8A10 mov dl, [eax]
5F0D70DE 885424 08 mov [esp+8], dl
5F0D70E2 ^ EB CD jmp short 5F0D70B1-------------跳回去死循环
5F0D70E4 A1 5458105F mov eax, [5F105854]
5F0D70E9 48 dec eax
5F0D70EA A3 5458105F mov [5F105854], eax
5F0D70EF 74 5F je short 5F0D7150
既然是内联汇编时才出错,那么在feacp.dll中找到__asm,然后去掉就可以了
找到
5F0DC568 5F 5F 61 73 6D 00 00 00 5F 5F 6C 65 61 76 65 00 __asm...__leave.
5F0DC578 5F 5F 66 69 6E 61 6C 6C 79 00 00 00 5F 5F 65 78 __finally...__ex
改为
5F0DC568 00 5F 61 73 6D 00 00 00 5F 5F 6C 65 61 76 65 00 ._asm...__leave.
5F0DC578 5F 5F 66 69 6E 61 6C 6C 79 00 00 00 5F 5F 65 78 __finally...__ex
因为没详细分析死循环的原因,我这样改也不知道会不会产生新的不良后果,希望各位对这个问题有兴趣的朋友一起来研究
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课