[原创] 第一次使用OllyDbg
01 Sep 2012前阵子在VBGood论坛上看到了一篇帖子:求助 跨进程解锁 CreateMutex 函数
互斥体
楼主问的内容是这样的:
附件为互斥体 防止双开, 如何解锁让附件的程序可以多开… 不要用修改 exe 的方法, 求助代码如何实现.
查看进程的互斥体可用 Process Explorer 工具,如附件的图.还可以手动右击互斥体解锁..
Process Explorer 工具比较大无法上传.
知道大概流程如下 ..无法实现..求助.. 感谢
- 遍历进程.
- 取得进程的所有 Handle 是否包含 互斥体关键字, 有的话关闭
下面找到的是倒霉蛋儿大仙改炉子大仙的的代码好像… PB的..
[代码略]
于是,想帮忙解决问题的欲望来了(哈哈),起初是想用API Hook来实现
但是该程序是在Form_Load事件中运行CreateMutex的(汗),所以程序一打开运行后就会调用CreateMutex创建互斥体,这是才来Hook该API是没有用的。
因为笔者功力不住,不会实现全局Hook,所以想了又想,突然有位大大作出了回复
我看修改exe的方法最好了,把某个jmp屏蔽掉,或者把CreateMutex挂钩了
挂钩我想我是实现不了的,于是试试看了修改exe的方法,但是一个星期过了,我一直懒得动手(懒虫一只-.-),直到今天,我才无意间看到了Start
Menu中的Olly
Dbg时才回想起来那个帖子,点击之、下载楼主的附件、解压、速速拖入OD的主窗口,进度条拼命的跑啊跑,终于好了。
于是,我展开了我的漫长之旅
很少接触OD的笔者,只会几个快捷键——F7(Step
into,单行执行,就是遇到call时,跳转到call的目的地),F8(Step
Over,跟F7大同小异,但是不进入call的目的地)
先打开原本的程序,然后返回OD。
应为程序发现到多开的话,就会弹出一个Msgbox出来,滑啊滑
终于找到了这个:
00401C41 FF15 28104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
MSVBVM60.rtcMsgBox
,根据名称,一定是Msgbox的函数了(VB6竟然也封装了这个函数,难道是直接调用MessageBoxA/MessageBoxW?)
不过更加显眼的是:
00401C62 FF15 0C104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEnd>] ; MSVBVM60.__vbaEnd
MSVBVM60.__vbaEnd ,End,即退出!退出!
当这个程序首次运行时,就会调用CreateMutex,如果这个程序再次运行,它也会调用CreateMutex,但是由于第一个副本已经创建同样名称的Mutex,所以API就会执行失败,失败后就会调用Msgbox提示,然后直接退出。
所以说呢,只要把MSVBVM60.rtcMsgBox
函数干掉,或者不让他Call,程序就不会退出啦!(笔者花了至少1个小时才想到这个办法、正确来说是:花了一个小时才看到此函数,囧。。。)
要怎么样去掉呢?或者是说:要怎么样屏蔽call呢?
看过罗云彬大大的《Windows环境下32位汇编语言程序设计》一定看过这个页的:
nop指令!机器码为90h
选这__vbaEnd那行,右键,Binary>Fill with NOPs
按F9(Run),Msgbox 又弹出来了,但是,点击OK后,哈哈,主界面出来啦!
笔者用的方法是,下载WinHex,直接修改exe的hex!
先看看OD,00401C62到00401C67都填上了NOP(即机器码90h)
打开WinHex,拖入exe,滑到00001C60处,从00001C62开始填90一直到00001C67
源程序和修改后的程序在这里下载:http://www.mediafire.com/download.php?clmrzg1yv1byfaa
Published by Gary Ng