以记事本为例给程序添加启动窗口
本文以记事本为例,给记事本添加一个启动窗口,其实给其它程序添加其它功能方法都差不多,为了简便,本文用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程序,只要找到消息循环,接下来的工作就很简单了。上一篇:某工程造价管理系统ROCKEY4ND加密狗破解