使用VC编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,请问这是如何做到的?
    问题有点难,给出正确答复的,另开帖子再送400分。

解决方案 »

  1.   

    有分我就收了,
    第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的
      

  2.   

    我理解是exe文件的程序码已经在内存里了,所以不影响运行
      

  3.   

    对啊,我也没看懂意思,要修改正在运行的程序并不能,用DLL注入进去后用WriteProcessMemory来修改没有问题,一个正在运行的EXE文件要修改它的物理文件好像不行吧,VC能行吗?
      

  4.   

    使用VC编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,=========================================================
    这样可行吗? 你清空了 但是保存了吗?  我认为是不可行的。
      

  5.   

    husheng34(随意生活) ( ) 信誉:100    Blog   加为好友  2007-5-15 22:22:06  得分: 0  
     
     
       
    有分我就收了,
    第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的  
     
    =================================================================可能是我的叙述有点问题,大家误解了。澄清一下:双击硬盘文件使程序运行,然后使用vc打开硬盘文件,并修改(清空)硬盘文件,保存,此时硬盘文件已更改,运行的程序却不受影响。请问在这种情况下vc是如何更改硬盘文件的,我使用CreateFile函数无法以可写方式打开硬盘文件(如果硬盘文件已运行的话)。虽然上面的解答不是我想要的,还是先谢谢了。
      

  6.   

    修改运行的exe文件在Xp下几乎不可能,或者很难
      

  7.   

    Y___Y(一叶障目) ( ) 信誉:100    Blog   加为好友  2007-05-16 12:16:26  得分: 0  
     
     
       修改运行的exe文件在Xp下几乎不可能,或者很难
      
     
    ====================================================================vc确实做到了,不知道是如何实现的。
      

  8.   

    修改运行的exe文件在Xp下几乎不可能,或者很难
    =========================================
    我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕
      

  9.   

    可以的,以前网上有代码有些安装程序会使用到,特别是木马,自身运行后就删了自己的文件这些实现要通过关闭文件句柄你运行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
      

  10.   

    fairyprince(精灵王子) ( ) 信誉:96    Blog   加为好友  2007-5-16 13:48:41  得分: 0  
     
     
       
    把你的程序运行在调试级(0级),你也能这么做!=====================================================================能否多给点提示呀?有源码最好,给几个相关的API函数名也行,鄙人才疏学浅,各位多多帮忙呀。
      

  11.   

    wltg2001(红猪) ( ) 信誉:100    Blog   加为好友  2007-5-16 15:13:43  得分: 0  
     
     
       
    修改运行的exe文件在Xp下几乎不可能,或者很难
    =========================================
    我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++没有什么不可能的,所谓不可能,就是不知道。加油加油,你我共勉啦!
      

  12.   

    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下的代码.
      

  13.   

    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/的检索有点混乱,不好找啊。
      

  14.   

    找到了,看不太懂,要慢慢研究了。
    贴出来和大家分享。2000下可执行文件修改自身
                    pjf([email protected])    总有人问起这个老问题,其实在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是比
    较简单的。    好短,确实简单了点。 //@_@
      

  15.   

    KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove) ( ) 信誉:100    Blog   加为好友  2007-5-20 20:11:11  得分: 0  可否简要介绍一下大概的原理啊,ms是不推荐随意更改局柄的,局柄的结构资料也无处可寻。msdn里面有一些api函数用于更改dacl ace,请问,更改这些东东可以达到相同的效果吗?
      

  16.   

    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下运行.另外说明的是由于句柄表是存放在内核空间的,只能通过驱动或者别的方式去修改了.而楼上那位贴的代码则通过物理内存映射读取并修改的.
      

  17.   

    参考: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
      

  18.   

    1、楼上有提到去掉系统对文件的映射UnmapViewOfFile
    2、修改句柄表 把exe文件句柄的AccessMask更改成可写的,需要注意的是2K和XP的句柄表结构是不一样的(最好通过驱动更改)
      

  19.   

    多谢 KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove)  。同时多谢各位的宝贵意见。虽然把分都给了 KeSummer ,还是要再次感谢给出宝贵意见的各位朋友。如果 KeSummer 愿意分享自己的研究成果,给出Win2k、Winxp局柄结构的详细资料,本人另开帖子再送400分。
      

  20.   

    我可以给你我写过的在XP下修该自己的代码给你,还有自己收集的Win2k、Winxp局柄结构的详细资料,但分就不要了。。留下EMAIL好了。
      

  21.   

    好些天没来了,竟然会有这么好的消息。太感谢KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove)了。我的Email: [email protected] 。
      

  22.   

    http://download.microsoft.com/download/win2000platform/inuse/1.0/nt5/en-us/inuse.exe
      

  23.   

    不重启修改正运行文件的简单方法:
    比如c:\windows\system32\notepad.exe正在运行
    在cmd窗口里面运行以下两条命令即可:
    ren c:\windows\system32\notepad.exe notepad_old.exe
    copy /y notepad_new.exe c:\windows\system32\notepad.exe
      

  24.   


    郁闷,执行完UnmapViewOfFile后就不执行了,进程就挂掉了。