| 发表于: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是比 较简单的。 好短,确实简单了点。 //@_@ | | |
|