您的位置:程序门 -> vc/mfc -> 进程/线程/dll



请教高手?如何修改正在运行的可执行文件。问题有点难,给出正确答复的,另开帖子再送400分。


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教高手?如何修改正在运行的可执行文件。问题有点难,给出正确答复的,另开帖子再送400分。[已结贴,结贴人:yafizyh]
发表于:2007-05-15 20:14:49 楼主
使用vc编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,请问这是如何做到的?
        问题有点难,给出正确答复的,另开帖子再送400分。
发表于:2007-05-15 22:22:051楼 得分:0
有分我就收了,


第一部

远程注入线程,dll注入,hook注入,

反正不管什么方法,注入目标进程就行了,

找到进程的基地址,一般用gethandle类的api,默认是41000

后面就是文件在内存的数据段了,改就行了,

其实改的就是内存数据,外挂,木马中常用技术,

搞明白汇编基础,不难的
发表于:2007-05-16 10:33:062楼 得分:0
我理解是exe文件的程序码已经在内存里了,所以不影响运行
发表于:2007-05-16 10:51:083楼 得分:0
你说这问题是什么意思呀,是要修改物理文件,还是内存中的程序,它们是两个东西!
发表于:2007-05-16 10:55:254楼 得分:0
对啊,我也没看懂意思,要修改正在运行的程序并不能,用dll注入进去后用writeprocessmemory来修改没有问题,一个正在运行的exe文件要修改它的物理文件好像不行吧,vc能行吗?
发表于:2007-05-16 11:10:245楼 得分:0
就是就是,楼主是不是陈述有点问题?
发表于:2007-05-16 11:23:406楼 得分:0
使用vc编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,

=========================================================
这样可行吗?   你清空了   但是保存了吗?     我认为是不可行的。
发表于:2007-05-16 12:13:347楼 得分:0
husheng34(随意生活)   (   )   信誉:100         blog       加为好友     2007-5-15   22:22:06     得分:   0    
 
 
     
有分我就收了,


第一部

远程注入线程,dll注入,hook注入,

反正不管什么方法,注入目标进程就行了,

找到进程的基地址,一般用gethandle类的api,默认是41000

后面就是文件在内存的数据段了,改就行了,

其实改的就是内存数据,外挂,木马中常用技术,

搞明白汇编基础,不难的

   
 
=================================================================

可能是我的叙述有点问题,大家误解了。

澄清一下:

双击硬盘文件使程序运行,然后使用vc打开硬盘文件,并修改(清空)硬盘文件,保存,此时硬盘文件已更改,运行的程序却不受影响。请问在这种情况下vc是如何更改硬盘文件的,我使用createfile函数无法以可写方式打开硬盘文件(如果硬盘文件已运行的话)。

虽然上面的解答不是我想要的,还是先谢谢了。
发表于:2007-05-16 12:15:078楼 得分:0
真心请教,希望大家不吝赐教。
发表于:2007-05-16 12:16:269楼 得分:0
修改运行的exe文件在xp下几乎不可能,或者很难
发表于:2007-05-16 12:19:4310楼 得分:0
没啥,解开系统对文件的保护,病毒的自删除,找找这个方面的东西。
发表于:2007-05-16 12:27:0611楼 得分:0
y___y(一叶障目)   (   )   信誉:100         blog       加为好友     2007-05-16   12:16:26     得分:   0    
 
 
      修改运行的exe文件在xp下几乎不可能,或者很难
   
 
====================================================================

vc确实做到了,不知道是如何实现的。
发表于:2007-05-16 13:48:4112楼 得分:0
把你的程序运行在调试级(0级),你也能这么做!
发表于:2007-05-16 14:57:1513楼 得分:0
不懂,顶下。
发表于:2007-05-16 15:13:4314楼 得分:0
修改运行的exe文件在xp下几乎不可能,或者很难
=========================================
我也觉得不可能,但是我刚才在xp下,先运行一个程序,然后用vc6以资源方式打开这个exe文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕
发表于:2007-05-16 15:41:2915楼 得分:0
我认为是程序运行时系统对文件进行了保护,
所以解决的方法应该是1。去掉保护
          2。具有更高的权限
发表于:2007-05-16 16:03:3816楼 得分:0
可以的,以前网上有代码

有些安装程序会使用到,特别是木马,自身运行后就删了自己的文件

这些实现要通过关闭文件句柄

你运行exe系统会createfilemapping   你须要关闭它才行
这个示例只是让程序删除自已

#include   "windows.h "
int   main(int   argc,   char   *argv[])
{
char   buf[max_path];
hmodule   module;
module   =   getmodulehandle(0);
getmodulefilename(module,   buf,   max_path);
closehandle((handle)4);  
__asm  
{
lea   eax,   buf
push   0
push   0
push   eax
push   exitprocess
push   module
push   deletefile
push   unmapviewoffile
ret
}
return   0;
}  
完全的方法高手在以下贴里实现了,通过创建副本实现
http://topic.csdn.net/t/20010820/18/247835.html
发表于:2007-05-17 18:07:4017楼 得分:0
fairyprince(精灵王子)   (   )   信誉:96         blog       加为好友     2007-5-16   13:48:41     得分:   0    
 
 
     
把你的程序运行在调试级(0级),你也能这么做!

=====================================================================

能否多给点提示呀?有源码最好,给几个相关的api函数名也行,鄙人才疏学浅,各位多多帮忙呀。
发表于:2007-05-17 18:09:5918楼 得分:0
wltg2001(红猪)   (   )   信誉:100         blog       加为好友     2007-5-16   15:13:43     得分:   0    
 
 
     
修改运行的exe文件在xp下几乎不可能,或者很难
=========================================
我也觉得不可能,但是我刚才在xp下,先运行一个程序,然后用vc6以资源方式打开这个exe文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

没有什么不可能的,所谓不可能,就是不知道。

加油加油,你我共勉啦!
发表于:2007-05-19 12:41:5319楼 得分:0
自己顶
发表于:2007-05-20 16:36:2320楼 得分:0
运行在0级   ,就是驱动级别,你要看一下   驱动开发方面的知识!
发表于:2007-05-20 20:11:1021楼 得分:0
y___y(一叶障目)   (   )   信誉:100         blog       加为好友     2007-05-16   12:16:26     得分:   0    
 
 
      修改运行的exe文件在xp下几乎不可能,或者很难
--------------------

这个是可以的,一个硬盘上的exe,运行起来的话,
只要以只读方式createfile或者openfile打开,获得handle后,修改这个handle的mask就行了.
http://www.xfocus.net/有win2k的代码,我自己实现了xp下的代码.
发表于:2007-05-20 20:12:0822楼 得分:0
去搜一下傀儡进程的相关资料,也许对你有帮助.
从进程启动过程一步一步来解析应该不是什么难的.
最关键的地方应该是把那个进程的文件映射关掉.
发表于:2007-05-21 14:40:1423楼 得分:0
fairyprince(精灵王子)   (   )   信誉:96         blog       加为好友     2007-5-20   16:36:23     得分:   0    
 
 
     
运行在0级   ,就是驱动级别,你要看一下   驱动开发方面的知识!

==============================================================================
 
vc可没有运行在0级。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  kesummer([in]lpvoid   yourlove,[out]lpvoid   mylove)   (   )   信誉:100         blog       加为好友     2007-5-20   20:11:11     得分:   0    
 
 
     
y___y(一叶障目)   (   )   信誉:100         blog       加为好友     2007-05-16   12:16:26     得分:   0    
 
 
      修改运行的exe文件在xp下几乎不可能,或者很难
--------------------

这个是可以的,一个硬盘上的exe,运行起来的话,
只要以只读方式createfile或者openfile打开,获得handle后,修改这个handle的mask就行了.
http://www.xfocus.net/有win2k的代码,我自己实现了xp下的代码.

=======================================================================

可否给出代码呀?win2k的代码也行。http://www.xfocus.net/的检索有点混乱,不好找啊。
发表于:2007-05-21 14:48:2724楼 得分:0
找到了,看不太懂,要慢慢研究了。
贴出来和大家分享。

2000下可执行文件修改自身
                                pjf(jfpan20000@sina.com)

        总有人问起这个老问题,其实在2年前在bbs上贴过的有关windows
内核句柄的帖子就详细写了改写正运行程序的方法,原理一样。为了减
少邮箱信件,所以再整理一下放到一个google一下就可发现的地方:)
        另创一个程序改自己当然不是这里说的。nt系统中程序修改自身,
只需做下面几步:
        1、先只读打开程序(自然也可以是其他程序)自身,获取一句柄。
        2、从eprocess开始,访问句柄表的数据结构,找出该句柄掩码。
        3、修改掩码,此刻已可通过该句柄对正在运行的可执行文件进行
修改了。
        4、做需要的文件操作。

        关于句柄表的简单描述,请搜寻以前的贴过的有关的帖子,不再赘诉。
下面是一简单的示例程序:

#include <windows.h>
#include <stdio.h>
#include "rwpm.h "

void   modifyprot2000(handle   h)
{
        ushort   pointer1,   pointer2,   pointer3;
        ulong   addr;
        ulong   index   =   (ulong)h;
        addr   =   getdata((pvoid)0xffdff124);
        addr   =   getdata((pvoid)(addr+0x22c));
        addr   =   getdata((pvoid)(addr+0x128));
        pointer3   =   (ushort)(index&0x000003ff);
        pointer2   =   (ushort)((index&0x0003fc00)> > 10);
        pointer1   =   (ushort)((index&0x03fc0000)> > 18);
        addr   =   getdata((pvoid)(addr+8));
        addr   =   getdata((pvoid)(addr+pointer1*4));
        addr   =   getdata((pvoid)(addr+pointer2*4));
                //以上是步骤2,下面是步骤3
        setdata((pvoid)(addr+(pointer3/2+1)*4),   0xffffffff);
}

int   main()
{
        handle   h;
        char   buf[max_path];
        dword   ret;
        getmodulefilename(   null,   buf,   max_path   );
        h   =   createfile(   buf,   0,   file_share_read,   0,   open_existing,   \
                                                                  file_attribute_normal,   0   );
        if   (   h   ==   invalid_handle_value   )  
                return   0;

        if   (   !initlib()   )
        {
                printf(   "init   failed\n "   );
                return   0;
        }

        modifyprot2000(   h   );

        writefile(   h,   "aaaaaa ",   6,   &ret,   0   );
        closehandle(   h   );
        exitlib();
        return   0;
}

在windows2000下执行后可以看到文件开始变为“aaaaaa”。
其中用到的initlib/getdata等函数在那个进程隐藏代码中已给出,不重复贴了。

        至于在xp等系统上的代码,这里就不给出了,要修改的部分是句柄掩码的
定位(句柄表结构有变化)、initlib中页目录的定位。有了思路自己hack是比
较简单的。

        好短,确实简单了点。   //@_@
发表于:2007-05-21 15:04:3025楼 得分:0
kesummer([in]lpvoid   yourlove,[out]lpvoid   mylove)   (   )   信誉:100         blog       加为好友     2007-5-20   20:11:11     得分:   0    

可否简要介绍一下大概的原理啊,ms是不推荐随意更改局柄的,局柄的结构资料也无处可寻。

msdn里面有一些api函数用于更改dacl   ace,请问,更改这些东东可以达到相同的效果吗?
发表于:2007-05-22 20:45:1126楼 得分:0
yafizyh(亚斐)
kesummer([in]lpvoid   yourlove,[out]lpvoid   mylove)   (   )   信誉:100         blog       加为好友     2007-5-20   20:11:11     得分:   0    

可否简要介绍一下大概的原理啊,ms是不推荐随意更改局柄的,局柄的结构资料也无处可寻。

msdn里面有一些api函数用于更改dacl   ace,请问,更改这些东东可以达到相同的效果吗?
------------------

原理比较简单的,每个进程都维护着一张句柄表,保存着进程打开的各种句柄,在这张表里还保存着相应的访问权限,当应个程序正在运行着,用createfile只能以只读方式打开,但可以在句柄表里找到该句柄的访问权限,修改成所有权限,那么就可以修该正在运行的程序了.
因为2000和xp的句柄的结构是不同的,因此上面的程序只能在2000下运行,稍微修改下就可以在xp下运行.另外说明的是由于句柄表是存放在内核空间的,只能通过驱动或者别的方式去修改了.而楼上那位贴的代码则通过物理内存映射读取并修改的.
发表于:2007-05-22 20:48:5727楼 得分:100
参考:http://dev.csdn.net/develop/article/20/20213.shtm
jiurl玩玩win2k进程线程篇   handle_table
http://dev.21tx.com/2003/08/03/10110.html
jiurl玩玩win2k进程线程篇   eprocess

还有其它文章的..搜索   jiurl玩玩win2k进程线程篇  
或者xfoucs.net上面的精华文档
http://www.xfocus.net/misc/xfocus.chm
发表于:2007-05-23 11:26:3828楼 得分:0
mark
发表于:2007-05-23 13:05:2129楼 得分:0
1、楼上有提到去掉系统对文件的映射unmapviewoffile
2、修改句柄表   把exe文件句柄的accessmask更改成可写的,需要注意的是2k和xp的句柄表结构是不一样的(最好通过驱动更改)
发表于:2007-05-25 14:22:0030楼 得分:0
多谢   kesummer([in]lpvoid   yourlove,[out]lpvoid   mylove)     。

同时多谢各位的宝贵意见。

虽然把分都给了   kesummer   ,还是要再次感谢给出宝贵意见的各位朋友。

如果   kesummer   愿意分享自己的研究成果,给出win2k、winxp局柄结构的详细资料,本人另开帖子再送400分。
发表于:2007-05-26 14:26:2631楼 得分:0
我可以给你我写过的在xp下修该自己的代码给你,还有自己收集的win2k、winxp局柄结构的详细资料,但分就不要了。。留下email好了。
发表于:2007-06-12 20:11:3832楼 得分:0
好些天没来了,竟然会有这么好的消息。太感谢kesummer([in]lpvoid   yourlove,[out]lpvoid   mylove)了。

我的email:   yafizhang@sina.com   。


快速检索

最新资讯
热门点击