今天自己学着改了一下dll,也许对楼主有帮助,我不是编程改的函数地址,直接用LordPE修改的。修改user32.dll的MessageBoxA,让HelloWorld12345变成HelloKitty12345。
图-------0
程序中其中LoadLibrary主要是为了载入D盘下的user32.dll而不是系统目录下的user32.dll,因为是自己写的程序,知道HelloWorld12345可以修改,不然如果内存不可写的话会出错。
.386
.model flat, stdcall
option casemap:none
include WINDOWS.INC
;include user32.inc
include kernel32.inc
;includelib user32.lib
includelib kernel32.lib
.data
szMsg db "HelloWorld12345",0
szUser32 db "D:/user32.dll",0
szMsgBoxA db "MessageBoxA",0
.data?
hUser32 dd ?
hMsgBoxA dd ?
.code
start:
invoke LoadLibrary,offset szUser32
mov hUser32,eax
invoke GetProcAddress,hUser32,offset szMsgBoxA
mov hMsgBoxA,eax
;invoke MessageBox, NULL, offset szMsg, 0, MB_OK
push MB_OK
push offset szMsg
push offset szMsg
push NULL
call hMsgBoxA
invoke ExitProcess, NULL
end start
把user32.dll从系统目录下面复制一份到D盘,下面所有的操作都在这个D盘上的user32.dll上面改。
用PEiD打开user32.dll,看到入口点RVA是0000B217。
图-------1
来看看都有哪些Section (点EP Section右边的> ),在.text段上面点右键,选Cave Finder
图-------2
图-------3
.text 段在0006028A地方有空间,还有000000176字节,够用了。用OD载入user32.dll,停在入口点0087B217。
基地址=0087B217-0B217=00870000
图-------4
在命令行里打入 d 00870000+6028A 来到我们刚才找到的空位。
图-------5
找个好地方,干脆就从008D0290开始写我们的代码吧。在反汇编窗口写比较方便,用 d MessageBoxA 可以看到原来 MessageBoxA函数的地址
图-------6
写好了之后就收工吧,选Copy to executable > All Modifications > Copy All > Save File,换个名字 myuser32.dll。
图-------7
图-------8
myuser32.dll现在还不能用,代码虽然写到里面了,但是还要改映射到内存的大小和MessageBoxA的RVA。用LordPE改吧。载入myuser32.dll,选Section,把VSize从0005F283改成0005F2C0,因为我们的代码从OD上看在008D0290到008D02B6。稍微让它多映射一点比如到008D02BF,这样换算成VSize=8d02BF-871000+1=5F2C0。
图-------9
图-------10
改MessageBoxA的RVA,选Directories > Export Table ... > MessageBoxA > Edit...,把RVA从000407EA改成60290,因为8d0290-870000=60290
图-------11
图-------12
最后修复一下Checksum,保存。把myuser32.dll改名成user32.dll测试一下。果然能用了。
图-------13
完