使用OD反汇编修改NateOn,虽然很麻烦,最终还是搞定了,后来发现网上有段代码,直接可以实现程序多开,测试了MSN、NateOn没问题,代码如下:

.386
.model flat, stdcall
option casemap :none

include    
windows.inc
include    user32.inc
include    kernel32.inc
includelib  user32.lib
includelib  kernel32.lib

PATCH_POSITION  
equ  00543CEEh
PATCH_BYTES  equ  2

.data?
dbOldBytes  db  PATCH_BYTES dup (?)
stStartUp  STARTUPINFO    <?>
stProcInfo  PROCESS_INFORMATION  <?>

.const
dbPatch    db  3Dh,0B7h
dbPatched  db  3Dh,0B6h
szExecFilename  db  'C:\\Program Files\\MSN Messenger\\msnmsgr.exe',0
szErrExec  db  '无法装载执行文件!',0
szErrVersion  db  '执行文件的版本不正确,无法修正!',0

.code
Start:
;********************************************************************
; 创建进程
;********************************************************************
    
invoke  GetStartupInfo,addr stStartUp
    
invoke  CreateProcess,offset szExecFilename,NULL,NULL,NULL,NULL,NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED,NULL,NULL,offset stStartUp,offset stProcInfo
    
.if  eax
;********************************************************************
; 读进程内存并验证内容是否正确
;********************************************************************
      
invoke  ReadProcessMemory,stProcInfo.hProcess,PATCH_POSITION,addr dbOldBytes,PATCH_BYTES,NULL
      
.if  eax
        
mov  ax,word ptr dbOldBytes
        
.if  ax ==  word ptr dbPatch
          
invoke  WriteProcessMemory,stProcInfo.hProcess,PATCH_POSITION,addr dbPatched,PATCH_BYTES,NULL
          
invoke  ResumeThread,stProcInfo.hThread
        
.else
          invoke  
TerminateProcess,stProcInfo.hProcess,-1
          
invoke  MessageBox,NULL,addr szErrVersion,NULL,MB_OK or MB_ICONSTOP
        
.endif
      .endif
      invoke  
CloseHandle,stProcInfo.hProcess
      
invoke  CloseHandle,stProcInfo.hThread
    
.else
      invoke  
MessageBox,NULL,addr szErrExec,NULL,MB_OK or MB_ICONSTOP
    
.endif
invoke  
ExitProcess,NULL
end  Start