欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

关于防止同一程序多次运行的破解方法之补充篇 (3千字)

关于防止同一程序多次运行的破解方法之补充篇 (3千字)

关于防止同一程序多次运行的破解方法之补充篇
                    by  liangs 

  上次写了一篇关于防止同一程序多次运行的破解方法,主要针对
使用FindWindowA函数的程序,具体可参见论坛精华Ⅲ。这次写一
篇针对使用CreateMutexA函数程序的破解方法,因为使用这个API
函数的程序实在是太多了!
  这次的目标是瑞星杀毒软件2002版v13.23,选中它的原因就是因
为它就是使用CreateMutexA函数来防止同时运行多个进程的。
  在破解前,大家可以在自己的机器上运行瑞星试试,当一个进程
运行后,再想运行另一个进程时就会发现什么反映都没有,程序只
是将刚才运行的第一个进程的程序窗口弹到前面。
  下面是我两次跟踪程序API的调用结果:
==========================================================================
★程序运行第一个进程的结果★
CreateMutexA(LPDATA:00000000,BOOL:00000000,LPSTR:0043A88C:"{F25D2D81-9FA5-11d4-BE4D-444553540001}")::0040DAB3
CreateMutexA'returns: 00000018
GetLastError()::0040DABF
GetLastError'returns: 00000000 //注意这个返回值
==========================================================================
★程序运行第二个进程的结果★
CreateMutexA(LPDATA:00000000,BOOL:00000000,LPSTR:0043A88C:"{F25D2D81-9FA5-11d4-BE4D-444553540001}")::0040DAB3
CreateMutexA'returns: 00000018
GetLastError()::0040DABF
GetLastError'returns: 000000B7 //哈哈,看到了吧这个返回值与上面不一样了
=========================================================================
由于瑞星是用VC6开发的,那么上面一段API语句我把它翻译成如下的VC代码:
当然瑞星程序里的这段代码肯定就是这么写的。
hMutex=CreateMutex(
        NULL,  //nosecurityattributes
        FALSE, //initiallynotowned
        "F25D2D81-9FA5-11d4-BE4D-444553540001" //命名Mutex的全局对象名,在所有进程都可以访问到
        );
if(hMutex==NULL||ERROR_ALREADY_EXISTS==::GetLastError())
{
  //程序第二次或以后运行时,会得到Mutex已经创建的错误
  AfxMessageBox("程序已经运行!"); //这句是我写的,瑞星就退出了,没有提示
  return FALSE;
}
=========================================================================
对应于上面VC代码的程序汇编代码如下:
* Possible StringData Ref from Data Obj ->"{F25D2D81-9FA5-11d4-BE4D-444553540001}"
                                  |
:0040DAA4 688CA84300              push 0043A88C
:0040DAA9 6A00                    push 00000000
:0040DAAB 6A00                    push 00000000
* Reference To: KERNEL32.CreateMutexA, Ord:003Fh
                                  |
:0040DAAD FF1550F14200            Call dword ptr [0042F150] //建立mutex对象
:0040DAB3 898504070000            mov dword ptr [ebp+00000704], eax
* Reference To: KERNEL32.GetLastError, Ord:011Ah
                                  |
:0040DAB9 FF15ACF14200            Call dword ptr [0042F1AC]
:0040DABF 3DB7000000              cmp eax, 000000B7 //对象已经存在,返回000000B7
:0040DAC4 0F85CB000000            jne 0040DB95 //这句当然是一定要使它跳转的
========================================================================
将0040DAC4处的代码0F85CB000000改为90E9CB000000,再运行程序试试,
呵呵,这回运行N个进程都没问题了吧。
一点补充:
  要使瑞星的多个进程同时能运行杀毒功能还需处理以下两个地方
0040D6E4处是CRC的检测,004132D7是检测是否有另一个进程正在
运行杀毒操作。这两处很容易搞定,这里就不多说了。
(1):0040D6E4 0F8594000000        jne 0040D77E //改为Jmp
(2):004132D7 0F859A000000        jne 00413377 //改为Jmp

修改后的优点:
  可同时运行N个进程,分别对N的硬盘同时进行杀毒,提高了N倍的效率,
经实际使用测试,呵呵,没发现不良影响。

申明:本文仅以技术交流为目的,转载请保持文章的完整性!

                                              2001/10/28

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功