请教高手?如何修改正在运行的可执行文件。问题有点难,给出正确答复的,另开帖子再送400分。 使用VC编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,请问这是如何做到的? 问题有点难,给出正确答复的,另开帖子再送400分。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有分我就收了,第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的 我理解是exe文件的程序码已经在内存里了,所以不影响运行 对啊,我也没看懂意思,要修改正在运行的程序并不能,用DLL注入进去后用WriteProcessMemory来修改没有问题,一个正在运行的EXE文件要修改它的物理文件好像不行吧,VC能行吗? 使用VC编译器能够以二进制方式打开正在运行的可执行文件,并任意修改其内容,甚至可以将.exe文件的内容清空,但是此时并不影响程序的正常运行,=========================================================这样可行吗? 你清空了 但是保存了吗? 我认为是不可行的。 husheng34(随意生活) ( ) 信誉:100 Blog 加为好友 2007-5-15 22:22:06 得分: 0 有分我就收了,第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的 =================================================================可能是我的叙述有点问题,大家误解了。澄清一下:双击硬盘文件使程序运行,然后使用vc打开硬盘文件,并修改(清空)硬盘文件,保存,此时硬盘文件已更改,运行的程序却不受影响。请问在这种情况下vc是如何更改硬盘文件的,我使用CreateFile函数无法以可写方式打开硬盘文件(如果硬盘文件已运行的话)。虽然上面的解答不是我想要的,还是先谢谢了。 修改运行的exe文件在Xp下几乎不可能,或者很难 Y___Y(一叶障目) ( ) 信誉:100 Blog 加为好友 2007-05-16 12:16:26 得分: 0 修改运行的exe文件在Xp下几乎不可能,或者很难 ====================================================================vc确实做到了,不知道是如何实现的。 修改运行的exe文件在Xp下几乎不可能,或者很难=========================================我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕 可以的,以前网上有代码有些安装程序会使用到,特别是木马,自身运行后就删了自己的文件这些实现要通过关闭文件句柄你运行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, bufpush 0push 0push eaxpush ExitProcesspush modulepush DeleteFilepush UnmapViewOfFileret}return 0;} 完全的方法高手在以下贴里实现了,通过创建副本实现http://topic.csdn.net/t/20010820/18/247835.html fairyprince(精灵王子) ( ) 信誉:96 Blog 加为好友 2007-5-16 13:48:41 得分: 0 把你的程序运行在调试级(0级),你也能这么做!=====================================================================能否多给点提示呀?有源码最好,给几个相关的API函数名也行,鄙人才疏学浅,各位多多帮忙呀。 wltg2001(红猪) ( ) 信誉:100 Blog 加为好友 2007-5-16 15:13:43 得分: 0 修改运行的exe文件在Xp下几乎不可能,或者很难=========================================我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++没有什么不可能的,所谓不可能,就是不知道。加油加油,你我共勉啦! 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下的代码. 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/的检索有点混乱,不好找啊。 找到了,看不太懂,要慢慢研究了。贴出来和大家分享。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是比较简单的。 好短,确实简单了点。 //@_@ KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove) ( ) 信誉:100 Blog 加为好友 2007-5-20 20:11:11 得分: 0 可否简要介绍一下大概的原理啊,ms是不推荐随意更改局柄的,局柄的结构资料也无处可寻。msdn里面有一些api函数用于更改dacl ace,请问,更改这些东东可以达到相同的效果吗? 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下运行.另外说明的是由于句柄表是存放在内核空间的,只能通过驱动或者别的方式去修改了.而楼上那位贴的代码则通过物理内存映射读取并修改的. 参考:http://dev.csdn.net/Develop/article/20/20213.shtmJIURL玩玩Win2k进程线程篇 HANDLE_TABLEhttp://dev.21tx.com/2003/08/03/10110.htmlJIURL玩玩Win2k进程线程篇 EPROCESS还有其它文章的..搜索 JIURL玩玩Win2k进程线程篇 或者xfoucs.net上面的精华文档http://www.xfocus.net/misc/xfocus.chm 1、楼上有提到去掉系统对文件的映射UnmapViewOfFile2、修改句柄表 把exe文件句柄的AccessMask更改成可写的,需要注意的是2K和XP的句柄表结构是不一样的(最好通过驱动更改) 多谢 KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove) 。同时多谢各位的宝贵意见。虽然把分都给了 KeSummer ,还是要再次感谢给出宝贵意见的各位朋友。如果 KeSummer 愿意分享自己的研究成果,给出Win2k、Winxp局柄结构的详细资料,本人另开帖子再送400分。 我可以给你我写过的在XP下修该自己的代码给你,还有自己收集的Win2k、Winxp局柄结构的详细资料,但分就不要了。。留下EMAIL好了。 好些天没来了,竟然会有这么好的消息。太感谢KeSummer([IN]LPVOID YourLove,[OUT]LPVOID MyLove)了。我的Email: [email protected] 。 http://download.microsoft.com/download/win2000platform/inuse/1.0/nt5/en-us/inuse.exe 不重启修改正运行文件的简单方法:比如c:\windows\system32\notepad.exe正在运行在cmd窗口里面运行以下两条命令即可:ren c:\windows\system32\notepad.exe notepad_old.execopy /y notepad_new.exe c:\windows\system32\notepad.exe 郁闷,执行完UnmapViewOfFile后就不执行了,进程就挂掉了。 拷贝文件以后的奇怪现象 安装vc++6.0时出现的关于虚拟内存的问题 如何实现程序的实时报警功能? 如何中止一个正在运行的进程? 怎么在对话框里加初始化函数.我用的是vc.net 一个超级菜鸟题 编辑帮助文件有什么好的软件吗? AttachThreadInput怎么用? mfc问题 --------- 浩瀚内存,在一个连exe都无法存活的地址空间,dll能扎下根吗? -------------- vc++ 6.0 一编译就死机的问题 VS2005中调用和操作EXCEL
第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的
这样可行吗? 你清空了 但是保存了吗? 我认为是不可行的。
有分我就收了,
第一部远程注入线程,DLL注入,HOOK注入,反正不管什么方法,注入目标进程就行了,找到进程的基地址,一般用gethandle类的API,默认是41000后面就是文件在内存的数据段了,改就行了,其实改的就是内存数据,外挂,木马中常用技术,搞明白汇编基础,不难的
=================================================================可能是我的叙述有点问题,大家误解了。澄清一下:双击硬盘文件使程序运行,然后使用vc打开硬盘文件,并修改(清空)硬盘文件,保存,此时硬盘文件已更改,运行的程序却不受影响。请问在这种情况下vc是如何更改硬盘文件的,我使用CreateFile函数无法以可写方式打开硬盘文件(如果硬盘文件已运行的话)。虽然上面的解答不是我想要的,还是先谢谢了。
修改运行的exe文件在Xp下几乎不可能,或者很难
====================================================================vc确实做到了,不知道是如何实现的。
=========================================
我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕
这个示例只是让程序删除自已#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
把你的程序运行在调试级(0级),你也能这么做!=====================================================================能否多给点提示呀?有源码最好,给几个相关的API函数名也行,鄙人才疏学浅,各位多多帮忙呀。
修改运行的exe文件在Xp下几乎不可能,或者很难
=========================================
我也觉得不可能,但是我刚才在XP下,先运行一个程序,然后用VC6以资源方式打开这个EXE文件,将它的资源给改了,并且保存成功,重新运行一下,还真保存成功了.晕+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++没有什么不可能的,所谓不可能,就是不知道。加油加油,你我共勉啦!
修改运行的exe文件在Xp下几乎不可能,或者很难
--------------------这个是可以的,一个硬盘上的exe,运行起来的话,
只要以只读方式CreateFile或者OpenFile打开,获得HANDLE后,修改这个HANDLE的mask就行了.
http://www.xfocus.net/有win2K的代码,我自己实现了XP下的代码.
运行在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/的检索有点混乱,不好找啊。
贴出来和大家分享。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是比
较简单的。 好短,确实简单了点。 //@_@
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下运行.另外说明的是由于句柄表是存放在内核空间的,只能通过驱动或者别的方式去修改了.而楼上那位贴的代码则通过物理内存映射读取并修改的.
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
2、修改句柄表 把exe文件句柄的AccessMask更改成可写的,需要注意的是2K和XP的句柄表结构是不一样的(最好通过驱动更改)
比如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
郁闷,执行完UnmapViewOfFile后就不执行了,进程就挂掉了。