本文以记事本为例,给记事本添加一个启动窗口,其实给其它程序添加其它功能方法都差不多,为了简便,本文用DLL的方式添加窗口,在程序中也可以修改,但是代码相对来说要多很多,且容易出错。

下面进入正题:

首先,用OD加载记事本,记录OEP:01006AE0  ,另一个就是添加启动窗口之后程序新的OEP:01007D73       New OEP,我们的代码要写在此处 
 

 1.添加必要的字符串:用WinHex打开,在00030560添加字符串"Splash.dll"
  2.添加导入函数:记事本里有LoadLibrary函数,但没有FreeLibrary函数,用 PE 编辑器手工添加。
        LoadLibrary地址:010010CC(可用win32dasm或用Ollydbg查看)
        FreeLibrary地址:010130E4( PE 编辑器添加函数时就有了)
  3.反汇编,用OllyDbg打开,来到01007D73,写入如下代码:
        push    01008560      ;字符串"Splash.dll"的地址
        call    [10010CC]      ;LoadLibraryA,载入该dll
        test    eax, eax      ;是否成功
        je      01006AE0      ;失败的话不释放资源
        push    eax
        call    [10130E4]     ;FreeLibrary,释放资源
        jmp     01006AE0      ;继续执行
  4.更改入口点为01007D73.运行就可以看到效果了。
  
  ------------------------------
  Splash.dll
  功能只有一个:建立一个对话框,安装一个定时器,5秒后结束对话框也是用汇编编写。该DLL可用任何语言编写 
  
*********************************************************************************************************************************************************

代码:

          .386 
          .model flat, stdcall 
          option casemap:none
  include windows.inc 
  include user32.inc 
  include kernel32.inc 
  includelib user32.lib 
  includelib kernel32.lib 
          .data 
  TimerID   dd 0     ; 定时器ID
  hInstance dd 0     ; 实例句柄
  .code 
  
  DllEntry proc hInst:DWORD, reason:DWORD, reserved1:DWORD 
     .if reason==DLL_PROCESS_ATTACH        ; 当DLL载入时执行
          push hInst 
          pop hInstance 
          call Splash 
     .endif
     mov eax,TRUE
     ret 
  DllEntry Endp 
  
  _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
        mov   eax,wMsg
        .if   eax == WM_INITDIALOG
              invoke SetTimer,hWnd,1,5000,NULL 
              mov TimerID,eax
        .elseif eax == WM_TIMER
              invoke SendMessage,hWnd,WM_LBUTTONDOWN,NULL,NULL 
              invoke KillTimer,hWnd,TimerID
          .elseif eax==WM_LBUTTONDOWN                  ; 单击左键关闭对话框
              invoke EndDialog,hWnd,NULL
        .else
              mov eax,FALSE
              ret
        .endif
        mov   eax,TRUE
        ret
   _ProcDlgMain endp
  
  Splash  proc
          invoke DialogBoxParam,hInstance,101,NULL,offset _ProcDlgMain,NULL
  Splash  endp
  
  End DllEntry

  相信大家一看,就会觉得这很简单吧,其实确实如此,按照上面的方法,你要添加其它的功能也可以,只要稍微改动下代码就OK了,像这种Windows程序,只要找到消息循环,接下来的工作就很简单了。

  本文到此结束……