能力值:
( LV3,RANK:20 )
|
-
-
2 楼
这个函数会调用发送WM_CREATE消息调用窗口的init时间处理过程把,下消息断点找到处理过程继续跟跟看真正的崩溃原因
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我试了一下还正是, 调试了下, 应该是下面的问题, 我这改了后貌似没事了, 你试试
0045EAD6 /$ 55 push ebp
0045EAD7 |. 8BEC mov ebp, esp
0045EAD9 |. 6A 0C push 0xC
0045EADB |. FF75 08 push dword ptr [ebp+0x8]
0045EADE |. E8 D66AFAFF call 004055B9 ; 此处修改了ebp 如果Search栏中为空, 返回0, 否则返回1
0045EAE3 |. 50 push eax
0045EAE4 |. 6A 01 push 0x1
0045EAE6 |. FF75 08 push dword ptr [ebp+0x8]
0045EAE9 |. E8 346EFAFF call 00405922 ; !!
0045EAEE |. 5D pop ebp
0045EAEF \. C2 0400 retn 0x4
call 004055b9:
004055B9 /$ 55 push ebp
004055BA |. 8BEC mov ebp, esp
004055BC |. 83EC 0C sub esp, 0xC
004055BF |. 6A 09 push 0x9 ; 最多读9个字符(包括终止符), 因为下面用的Ascii, 也就是9字节
004055C1 |. 8D45 F4 lea eax, dword ptr [ebp-0xC]
004055C4 |. 50 push eax
004055C5 |. FF75 0C push dword ptr [ebp+0xC]
004055C8 |. FF75 08 push dword ptr [ebp+0x8]
004055CB |. E8 450D0000 call 00406315
004055D0 |. 05 E8030000 add eax, 0x3E8 ; |
004055D5 |. 50 push eax ; |ControlID
004055D6 |. 8B45 08 mov eax, dword ptr [ebp+0x8] ; |
004055D9 |. FF30 push dword ptr [eax] ; |hWnd
004055DB |. FF15 F4945200 call dword ptr [<&USER32.GetDlgItemTextA>>; \GetDlgItemTextA
004055E1 806405 F4 00 and byte ptr [ebp+eax-0xC], 0x0 ; 这里貌似是希望放置终止符?
004055E6 |. 0FB645 F4 movzx eax, byte ptr [ebp-0xC]
004055EA |. F7D8 neg eax
004055EC |. 1BC0 sbb eax, eax
004055EE |. F7D8 neg eax
004055F0 |. C9 leave
004055F1 \. C2 0800 retn 0x8
是中文的时候, 0045EADE处的call 004055B9 返回后ebp被修改了, 进去发现是
004055E1 806405 F4 00 and byte ptr [ebp+eax-0xC], 0x0
这里修改的, 把栈中的ebp最低位给清0了, GetDlgItemTextA限制读9个字符, 其中包括终止符, 因为是ascii的, 也就是9字节, 实际读8个字符. 是英文的话, GetDlgItemTextA返回读取的字符数, 最多也就返回8, 所以and一下没事, 可是如果是中文, GetDlgItemTextA的返回值是读取的字符数 * 2, 最多可以返回0x10, 再and的话会把ebp或返回值的某字节清0的. 我觉得上面它这条语句应该是想在读了的字符串末尾放置一个终止符. 因为GetDlgItemTextA读取时会在缓冲区最后加个终止符, 所以我给他nop了. nop后貌似没问题了, 你试试吧
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
多谢楼上的大神 我仔细研究分析一下你说的:)
|
|
|