另dll注入参考我的另一篇博文:http://blog.csdn.net/anda0109/article/details/41309973
dll注入技术参考我的博文,本文主要是修改应用程序界面和功能的实现,其步骤如下:
1、使用spy++找到要修改的窗口的控件ID。
2、使用windows API找到控件的窗口句柄。
3、对控件进行操作。
dll功能完成后,将dll注入要修改的程序运行就可以了。
先看一下效果:
下面是dll功能的实现:
// TaskManager.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <commctrl.h> #include <IPHlpApi.h>//可通过此接口函数获取网络流量 #pragma comment(lib, "IPHLPAPI.lib") HWND hwndNetworkList;//任务管理器list控件句柄 struct StructFindTaskManagerDlgItem { DWORD itemID;//控件ID HWND hwnd;//该控件的句柄 }; BOOL CALLBACK _EnumChildProc( HWND hwnd, LPARAM lParam ) { StructFindTaskManagerDlgItem* pParam = (StructFindTaskManagerDlgItem*)lParam; if ( (DWORD)GetDlgCtrlID( hwnd ) == pParam->itemID )//判断是否为需要的控件 { pParam->hwnd = hwnd; return FALSE; } return TRUE; } //根据控件ID获取控件窗口句柄 HWND FindTaskManagerDlgItem( DWORD CtrlId) { StructFindTaskManagerDlgItem param; param.itemID = CtrlId; param.hwnd = NULL; HWND hwndTaskManager = FindWindow( (LPCTSTR)32770, "Windows 任务管理器"); if(hwndTaskManager == NULL) { MessageBox(NULL,"请先运行任务管理器!","",MB_OK); return NULL; } //枚举子窗口, EnumChildWindows(hwndTaskManager, _EnumChildProc, (LPARAM)¶m); return param.hwnd; } //获取listview的列数 int GetListColmnCount(HWND hList) { int count=0; char caption[MAX_PATH]; LVCOLUMN lvc; lvc.mask=LVCF_TEXT; lvc.cchTextMax=MAX_PATH; lvc.pszText=caption; for (int i=0;i<50;i++) { ZeroMemory(caption,sizeof(caption)); SendMessage(hList,LVM_GETCOLUMN,i,(long)&lvc); if (caption[0]==0&&caption[1]==0) { count=i; break; } } return count; } //向listview插入两列 void InsertColToNetworkList(HWND hNetworkList)//hNetworkList即为该控件的句柄 { int n=GetListColmnCount(hNetworkList);//获取列数,加载所有列的后面 // 添加列 LV_COLUMN colmn; // 列 ZeroMemory(&colmn, sizeof(LV_COLUMN)); colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 风格 colmn.fmt=LVCFMT_RIGHT; colmn.cx = 0x60;//宽度 colmn.pszText = "下载";//列名 SendMessage(hNetworkList, LVM_INSERTCOLUMN, n, (LPARAM)&colmn); colmn.pszText = "上传";//列名 SendMessage(hNetworkList, LVM_INSERTCOLUMN, n+1, (LPARAM)&colmn); } //向listview插入数据 void InsertDataToListCtrl(HWND hNetworkList) { LV_ITEM item; item.iItem = 0; item.mask = LVIF_TEXT; item.cchTextMax = MAX_PATH; int iSubItem=GetListColmnCount(hNetworkList)-2;//"下载栏的索引" if (iSubItem>0) { char sInSpeed[20],sOutSpeed[20]; float fInSpeed=rand()%2048,fOutSpeed=rand()%2048;//下载、上传速率,这里用随机数模拟 //下载速率 sprintf(sInSpeed,"%0.2f KB/s",fInSpeed); item.pszText=sInSpeed; item.iSubItem =iSubItem; ListView_SetItem(hNetworkList,&item); //上传速率 sprintf(sOutSpeed,"%0.2f KB/s",fOutSpeed); item.pszText=sOutSpeed; item.iSubItem =iSubItem+1; ListView_SetItem(hNetworkList,&item); } } void ModifyTaskManager() { //找到任务管理器相应控件窗口句柄 hwndNetworkList = FindTaskManagerDlgItem(0x00000A28);//0x00000A28为通过spy++获取到的LIST控件ID //向listview插入下载、上传两列 InsertColToNetworkList(hwndNetworkList); //向listview控件中插入数据 InsertDataToListCtrl(hwndNetworkList); //用户可在这里创建线程或定时器不断刷新数据 }
// dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "stdafx.h" #include "TaskManager.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: ModifyTaskManager(); //MessageBox(NULL,"注入成功!","",MB_OK); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }