使用dll注入技术给windows任务管理器增加功能

本文参考:http://www.pediy.com/kssd/index.html

另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)&param);

	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进程即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值