谁成功了...我修改了然后loadlibrary怎么加载也不行啊..
引用:
把XXX.exe改写成dll来直接加载使用。 把XXX.exe改成dll,可以参考PEloader的实现原理。 如果懒的看PEloader,那么我告诉你几个注意事项,改一下就行了,也不是很复杂。 关键点:exe的镜像地址是有PE头的 OptionalHeader.ImageBase决定的, 而dll的ImageBaseAddr由LoadLibraryA决定的。 好像只需要修正这一点,就可以了。 {反正我改OD.exe就只改了这个,我很菜,希望高手补充。} 具体怎么改,参考附录C。 最后,把XXX.exe改成了dll,想怎么玩都可以了。 附录C:我把OD.exe ---> OD.dll的修改过程。 1,修改OEP: OD的OEP: 00DA1000 > $ /EB 10 jmp short 00DA1012 00DA1002 |66 db 66 ; CHAR 'f' //新加的代码不能放这里,因为要重定位。 00DA1003 |62 db 62 ; CHAR 'b' 00DA1004 |3A db 3A ; CHAR ':' 00DA1005 |43 db 43 ; CHAR 'C' 00DA1006 |2B db 2B ; CHAR '+' 00DA1007 |2B db 2B ; CHAR '+' 00DA1008 |48 db 48 ; CHAR 'H' 00DA1009 |4F db 4F ; CHAR 'O' 00DA100A |4F db 4F ; CHAR 'O' 00DA100B |4B db 4B ; CHAR 'K' 00DA100C |90 nop 00DA100D |E9 db E9 00DA100E . |2801E500 dd offset b.___CPPdebugHook 00DA1012 > \A1 1B01E500 mov eax, dword ptr [E5011B] 修改为: 00871000 > /E9 5BE60A00 jmp 0091F660 // + 记录模块地址 00871005 |90 nop 00871006 |90 nop 00871007 |90 nop 00871008 |90 nop 00871009 |90 nop 0087100A |90 nop 0087100B |90 nop 0087100C |90 nop 0087100D |90 nop 0087100E |90 nop 0087100F |90 nop 00871010 |90 nop 00871011 |90 nop 00871012 . |A1 1B019200 mov eax, dword ptr [92011B] 2,加一些代码记录模块地址。 // + 记录模块地址 0091F660 8BC3 mov eax, ebx 0091F662 2D 00100000 sub eax, 1000 0091F667 51 push ecx 0091F668 8BCB mov ecx, ebx 0091F66A 83C1 06 add ecx, 6 0091F66D 8901 mov dword ptr [ecx], eax 0091F66F 59 pop ecx 0091F670 ^ E9 9D19F5FF jmp 00871012 //再跳回去 0091F675 00 db 00 3,在0091F642这里加一个Call,修正GetModuleHandleA的返回,因为现在OD是Dll了,模块地址不同。 0091F628 . 33 32 2D 62 6>ascii "32-bit analysing" 0091F638 . 20 64 65 62 7>ascii " debugger",0 // + 修改 kernel32.GetModuleHandleA 0091F642 $ 8BC4 mov eax, esp 0091F644 . 8378 04 00 cmp dword ptr [eax+4], 0 0091F648 . 74 05 je short 0091F64F 0091F64A .- E9 F2C0EE7B jmp kernel32.GetModuleHandleA 0091F64F > E8 00000000 call 0091F654 0091F654 /$ 58 pop eax 0091F655 |. 2D 4EE60A00 sub eax, 0AE64E 0091F65A |. 8B00 mov eax, dword ptr [eax] //返回上面记录的模块地址 0091F65C \. C2 0400 retn 4 0091F65F 00 db 00 4,最后把调用kernel32.GetModuleHandleA的Call,如果参数为0修改成Call 0091F642,参数不为0的不改。 5,改完,保存为OD.dll,自己随便写一个exe,LoadLibraryA,OD.dll,可以用了 |