本文参考:http://www.pediy.com/kssd/index.html
dll的入口函数:
生成dll后将dll注入taskmgr.exe进程即可。
另dll注入参考我的另一篇博文:http://blog.youkuaiyun.com/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);
//用户可在这里创建线程或定时器不断刷新数据
}
dll的入口函数:
// 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;
}
生成dll后将dll注入taskmgr.exe进程即可。