【文章标题】: 给记事本添加启动窗口
【文章作者】: Suyana
【作者邮箱】: Suyasha@163.com
【软件名称】: Notepad
【下载地址】: WinXP自带
【作者声明】: 我只是一只小菜鸟,失误之处难免,敬望诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  为了不写很多代码,使用dll的方式添加启动窗口,在exe中修改也可以,但代码太多了,容易出错,不过dll也是用Win32ASM编写的。
  
  一开始,先记住以下几个地址:
  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

  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!