继续修改DLL,让他变得更完美吧。
保存后拿LoadPE载入,看看引入表是否正常(例如点击引入表后面的"L"按钮):
->Import Table
1. ImageImportDescriptor:
OriginalFirstThunk: 0x0000205C
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x00002072 ("USER32.dll")
FirstThunk: 0x0000200C
Ordinal/Hint API name
------------ ---------------------------------------
0x01BE "MessageBoxA"
2. ImageImportDescriptor:
OriginalFirstThunk: 0x00002050
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x0000209C ("KERNEL32.dll")
FirstThunk: 0x00002000
Ordinal/Hint API name
------------ ---------------------------------------
0x0140 "GetProcessHeap"
0x0199 "HeapAlloc"
3. ImageImportDescriptor:
OriginalFirstThunk: 0x000020CE
TimeDateStamp: 0x00000000 (GMT: Thu Jan 01 00:00:00 1970)
ForwarderChain: 0x00000000
Name: 0x000020B0 ("SHELL32.DLL")
FirstThunk: 0x000020CE
Ordinal/Hint API name
------------ ---------------------------------------
0x0000 "ShellExecuteExA"
好了,ShellExecuteExA成功引入,其调用偏移为0x20CE。
现在来去掉新增的节,还原DLL的大小。
打开区段对话框,找到最后一个由LoadPE新增的节(我这里是.Silvana) ,反键选择"wipe section header"(清除区段)。
用WinHex清除文件末尾从00000C00开始的节内容,保存退出。
之后用OD载入,Oh..NO! 怎么提示“应用程序或DLL pediy.dll 为无效的 Windows 映像。请再检测一遍您的安装盘。”!
LoadPE已经能认识新的引入表了啊?仔细回想刚才的步骤,终于发现问题所在:刚才直接删除了新节,没有去调整镜像大小到原始值。LoadPE打开DLL,找到镜像大小:0000504C,改回0000404C保存。
好了,用OD载入DLL,这次顺利载入了。测试一下吧,向上找到
003F100E |. FF15 0C203F00 CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
双击反汇编,提示的内容是:CALL DWORD PTR DS:[3F20
0C]
由于ShellExecuteExA偏移为
0x20CE,改成CALL DWORD PTR DS:[3F20
CE]
003F100E FF15 CE203F00 CALL DWORD PTR DS:[<&SHELL32.ShellExecut>; SHELL32.ShellExecuteExA
看来改造成功了!之后想怎么发挥就怎么发挥了,例如7字节完成OpenUrlA
附件中有原始的 pediy.dll 和修改好的DLL
(pediy_引入ShellExecuteExA.rar)。
附带我之前说的那个不用引入函数,115字节搜索API方法改造的DLL,包括引出表修改等完整的改造过程
(pediy_115+字节的改造过程.zip)。