珞珈山水BBS电脑网络程序人生 → 单文区文章阅读

单文区文章阅读 [返回]
发信人: chusi (每天都有新的追求), 信区: Programm
标  题: Re: 编程问题求助
发信站: 珞珈山水BBS站 (Mon Sep  4 21:19:55 2006), 转信

google到一个,不知道可不可以用
转载自
https://www.xfocus.net/bbs/index.php?act=SE&f=2&t=35339&p=125907

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是比
较简单的。

    好短,确实简单了点。 
【 在 SubDragon (发现很多人挂在山水上泡mm) 的大作中提到: 】
: 要找到数据段倒是不难
: 不过不知道怎么写自己...
: 有人有例子?
: ...................

--

※ 来源:·珞珈山水BBS站 bbs.whu.edu.cn·[FROM: 221.221.237.*]
[返回单文区目录]

武汉大学BBS 珞珈山水站 All rights reserved.
wForum , 页面执行时间:6.965毫秒