首页
社区
课程
招聘
[求助]Source Insight Crash调试.
发表于: 2014-3-19 09:27 7661

[求助]Source Insight Crash调试.

2014-3-19 09:27
7661
Source Insight(以下简称SI)这个代码利器因该很多人都用过,不过这个软件的中文支持并不太好,特别是一个搜索的bug让我很头疼.
具体表现在当鼠标停留在中文字符的时候,这时候按CTRL+F进行搜索,有很大的几率SI直接挂掉,像官方发了邮件也毫无影踪,所以想通过调试自己找到问题所在点

我使用的是官方最新的3.50.0072版本,OD跟踪到的
00402705  |.  50            push eax                                 ; /lParam
00402706  |.  68 C8314000   push Insight3.004031C8                   ; |pDlgProc = Insight3.004031C8
0040270B  |.  A1 E0745C00   mov eax,dword ptr ds:[0x5C74E0]          ; |
00402710  |.  F7D8          neg eax                                  ; |
00402712  |.  1BC0          sbb eax,eax                              ; |
00402714  |.  2345 EC       and eax,[local.5]                        ; |
00402717  |.  50            push eax                                 ; |hOwner
00402718  |.  8B45 F0       mov eax,[local.4]                        ; |
0040271B  |.  FF70 20       push dword ptr ds:[eax+0x20]             ; |pTemplate
0040271E  |.  FF35 28A95E00 push dword ptr ds:[0x5EA928]             ; |hInst = 00400000
00402724  |.  FF15 50955200 call dword ptr ds:[<&USER32.CreateDialog>; \CreateDialogIndirectParamA

CreateDialogIndirectParamA这个函数就挂了,再往下跟就分析不出来了,各位大大帮看看SI崩溃到底是什么问题 要怎么patch?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这个函数会调用发送WM_CREATE消息调用窗口的init时间处理过程把,下消息断点找到处理过程继续跟跟看真正的崩溃原因
2014-3-19 11:37
0
雪    币: 239
活跃值: (10)
能力值: ( 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后貌似没问题了, 你试试吧
2014-3-19 11:39
0
雪    币: 208
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
多谢楼上的大神 我仔细研究分析一下你说的:)
2014-3-19 14:42
0
游客
登录 | 注册 方可回帖
返回
//