首页
论坛
课程
招聘
[原创]OD插件 - 支持chm帮助文档
2021-8-14 16:15 7981

[原创]OD插件 - 支持chm帮助文档

2021-8-14 16:15
7981

 

机缘巧合看到科锐学长的一个帖子,讲述了制作OD插件 -- 支持chm帮助文档的分析过程,王老师也带我们写过两个OD插件,这个插件也蛮实用的,来学习一下该插件的原理,并修复了一个小BUG

 

原帖传送门:https://bbs.pediy.com/thread-207265.htm

 

主题1:该插件的原理

原始OD并不支持打开chm,选择help – Select API Help File,发现只有hlp选项,且就选适用Any file选项选择了chm文件,OD也是提示不支持chm文件,所以OD初衷只支持hlp文件,我们确实需要经常使用API帮助文档,反而OD的hlp使用频率没有那么高。所以这个插件还是比较实用的,懒人之福吧


 

原帖中已经很详细的解释了制作插件的过程以及原理,不过看评论还是有和我一样的新手并不是很理解,在这里总结一下,希望可以帮些忙,提供一些理解的思路。

首先解决的是文件选择对话框的文件过滤,GetOpenFileName API是可以创建一个文件打开的对话框,参数是一个OPENFILENAME结构体,MSDN上有很详细的介绍,该结构体的第四个参数lpstrFilter可以指明文件过滤字符串。直接hookAPI不是一个合适的选择,毕竟可能会影响其他功能,所以学长选择继续栈回溯,选择hook Select API Help File功能的初始化结构体的位置。

 

接下来需要解决OD不能打开chm文件的问题,说真的我这个小白API不是很熟,没用过winhel,最大的困惑的MSDN查不到啊,这个就比较纠结了,不过不要紧,我也好奇是怎么打开帮助文档的,所以自己跟了一下。

简单讲一下过程,用VS打开OD的EXE文件,找到菜单的控件ID是2504,十六进制0x9c8,接着用OD调试OD,spy++拿到了主窗口的句柄(话说微软的东西真是好用啊),确定了主窗口的过程函数,

 

我要找的就是WM_COMMAND响应0x9c8的分支,我发现确实调用了WinHelpA,(呃,看来也不能迷信MSDN,人家OD标的明明白白),跟了一下API发现会判断文件的类型,如果不是hlp文件则弹框提示。

这回清楚了,做法也简单,hook WinHelpA,用ShellExecute打开chm

 

主题2:莫名其妙的错误框

       上面我们理清了插件的原理,当然要使用一下。不过学长帖子里的上传的插件dll不能用,需要的同学可以下载工程重新编译一下,我也会上传最终编译好的。

       安装插件后,发现OD能不能正常关闭,会弹出错误对话框,提示runtime error 216 at xxxxx

       这个BUG很确定是安装插件后才有的,其实并不影响OD的使用(毕竟是关闭时出现的),一开始也是忽略的,但是自己使用OD频率有很高,每次都弹框有点忍受不了啊。所以决定探索一下是什么问题。

       使用OD调试OD,发现关闭OD后断在了SEH链中,我们不关心SEH怎么处理,只想知道哪里触发了异常,栈回溯,最后回溯到退出代码,却看不出来有哪些问题,但是观察到退出时调用了遍历了所有的插件,以及在栈回溯时发现某一个SEH调用了这个插件的函数,也调用了ShellExecuteA,传入的参数指向的路径内存地址在GODUP.DLL中。


 

调用逻辑是:GODUP也调用了WinHelpA,因为这里注入了WinHelpA,间接调用了ShellExcuteA,但此时传入的参数不是一个路径,如果以字符串解释的话是一个空字符串,所以在调用ShellExecuteA时应该增加判断条件

 

 

更新后的关键hook代码:

_export __declspec(naked) void __stdcall OpenHelp()
{
    char* pFilePath;
    DWORD pOffset;
    pOffset = (DWORD)OpenHelp - pfnAddressOfWinHelpA + 5;
    __asm
    {
        push eax
        mov eax, [esp + 0xc]
        mov pFilePath, eax
       
    }
    if (pFilePath != NULL)
    {
        if (strlen(pFilePath) == 0)
        {
            //直接返回
            __asm
            {
                pop eax
                retn 16
            }
        }
        ShellExecute(NULL, "open", pFilePath, "", "", SW_SHOWNORMAL);
    }
    __asm
    {
        pop eax
        retn 16
    }
}

至此我们知道了是GODUP调用WinHelpA,而我们hookWinHelpA,导致了ShellExecute传入了错误的参数,不过这是OD退出时的逻辑,我们也不需要因此去更换hook的地址,主要简单的增加一层判断逻辑即可,反正也是要释放资源的,不影响程序的退出。

因为我的电脑上没安装VC6,只好新建了一个项目,BUG是在win10环境中发现的,不过也在win7和xp环境中测试了,都会复现。这里说明一点:只有安装GODUP插件的OD才会触发异常,当然如果其他插件也调用了WinHelpA,也有可能触发异常。

 

在科锐学习也有十个月了,感谢科锐各位老师的悉心教导,在科锐学习真的是马拉松长跑,但是可以学到很多东西。马上就要进入最重要的逆向课程了,希望自己不要松懈,坚持跑完这最后一个公里。

也希望论坛的各位同学也不要放弃,这个行业入门门槛很高,有毅力者才可入



[公告] 欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

最后于 2021-8-14 18:00 被xyjstone编辑 ,原因:
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (6)
雪    币: 14753
活跃值: 活跃值 (23648)
能力值: (RANK:75 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2021-8-14 21:00
2
1
感谢分享!
雪    币: 756
活跃值: 活跃值 (463)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
列明 活跃值 2021-8-15 00:54
3
0
自從自己包了一個全功能版OD增强插件包使得OD每次開啓都會自動開兩三個CMD窗口,并且關閉CMD窗口之後OD就自己關了之後,就再也沒使用過OD。我不會分析原因,我只知道是有的插件我不會用,導致的問題,那我就不用了。留下了沒技術的眼淚。
雪    币: 324
活跃值: 活跃值 (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
院士 活跃值 2021-8-15 07:46
4
0

遇到插件问题,我只会删插件。

最后于 2021-8-15 07:48 被院士编辑 ,原因:
雪    币: 473
活跃值: 活跃值 (356)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xyjstone 活跃值 2021-8-15 22:38
5
0
Editor 感谢分享!
感谢版主大大认可
雪    币: 473
活跃值: 活跃值 (356)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
xyjstone 活跃值 2021-8-15 22:39
6
0
那插件功能不用了吗
雪    币: 38
活跃值: 活跃值 (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阿龙正罡 活跃值 2021-8-16 16:41
7
0
留下了沒技術的眼淚。
游客
登录 | 注册 方可回帖
返回