首页
社区
课程
招聘
[原创]Windows系统程序设计之插入DLL和挂接API
发表于: 2006-6-12 03:47 29995

[原创]Windows系统程序设计之插入DLL和挂接API

2006-6-12 03:47
29995

                   Windows系统程序设计之插入DLL和挂接API
【作者】北极星2003
【来源】看雪技术论坛(bbs.pediy.com)
【时间】2006年6月12日
【说明】关于本文的所有信息都可以在附件中下载

        首先简要介绍一下内容要点。
        在WINDOWS中,每个进程都有自己的私有地址空间,当用指针访问内存的时候只能访问到自己进程的地址空间,而无法进入其他进程的地址空间。而当自己的进程需要对其他进程进行一系列操作的时候,一个比较好的选择就是把这些操作封装在一个DLL中,然后把DLL插入到目标进程的私有地址空间中。这样,如果DLL中使用指针的话,就可以访问目标进程的地址空间。
        在程序中通常有两种方法来实现插入DLL:(1)使用远程线程(2)HOOK

        挂接API的目标是当系统调用API函数的时候能够执行我们的自定义函数,需要注意的是自定义函数的参数、返回类型、调用方式都必须和原API函数完全相同。这样我们就可以很便捷的取得或者修改参数来实现相应的目标,而无需考虑该API的内部实现。
        通常有两种方法可以实现挂接API:(1)修改IAT(2)API入口的覆盖。

        需要说明的是对知识点的简要概括,至于具体信息,无论在书本或者网络上都有很多,不再赘述。
       
        使用远程线程方法实现插入DLL可以参考我以前的文章《QQ盗号的核心技术(简单版)》http://bbs.pediy.com/showthread.php?threadid=14203

        这里主要讲解两个软件的制作。
(1)        IPPack――IP封包截获工具
原理:使用挂钩(HOOK)插入DLL,覆盖API入口地址挂接API
(2)        Watch IAT ――查看IAT信息
关于修改IAT来实现挂接API已经很普遍了,我也懒的再重复。这个工具软件是我很早以前写的,用来查看可执行文件的IAT信息,但有一个难点,由于IAT信息是在加载时候动态产生的,那么什么时候是最佳时机呢??

实例一 : IPPack ―― IP封包截获工具


1、设计目标
                把基本的DLL插入技术和HOOK API技术相联系,应用到实际。另外,在该软件中还设计进程间通信、线程同步、DLL实现等多种Windows程序设计中的基本技术。(经常有朋友说这个软件不能截获数据包,这里需要说明的是这个软件仅仅是一个技术实例,并不是工具软件。对目标进程进行测试的时候,最好先用PE分析工具查看一下,确认导入表中有send,recv,sendto,recvfrom这四个函数。)

2、设计思路
        第一步:把DLL插入到目标进程地址空间
  

        第二步:挂接API,取得相关的参数信息并传送到IPPack.exe
                        如果不熟悉管道通信机制,可以参考《Windows系统程序设计之进程间通信》
http://bbs.pediy.com/showthread.php?s=&threadid=26252  

3、难点
        插入DLL和挂接API的应用比较多,基本上没什么难度。
       
4、详细设计
(1)当启动IPPack.exe进行初始化时,启动命名管道线程服务

UINT ServerThread ( LPVOID lpParameter )
{
	……
	while ( true )
	{
		ConnectNamedPipe ( CurPipeInst.hPipe, &OverLapStruct ) ;
		WaitForSingleObject ( CurPipeInst.hEvent, INFINITE ) ;
		if ( !GetOverlappedResult ( CurPipeInst.hPipe, &OverLapStruct, &dwByte, true ) )
			break ;
		……
		// 从管道中读取数据并显示到界面
		……
		// 断开客户端的连接,以便等待下一客户的到来
		DisconnectNamedPipe ( CurPipeInst.hPipe ) ;
	}
	
	return 0 ;
}
void CIPPackDlg::LookUpProcessPriviege ()
{
	TOKEN_PRIVILEGES tkp; 
	HANDLE hToken; 
	if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
		return ; 
	LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);	tkp.PrivilegeCount = 1; 
	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
	AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 
}
void CSPDlg::UpdateProcess ()
{
	DWORD	cbNeededProcess, cbNeededModule;
	HMODULE	hMod ;
	CString TempStr ;
	EnumProcesses ( dwProcessId, sizeof(dwProcessId), &cbNeededProcess ) ;
	for ( unsigned i = 0; i < ( cbNeededProcess/sizeof(DWORD) ); i++ )
	{
		HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |	\
                                   PROCESS_VM_READ,	FALSE, dwProcessId[i] );
		if ( hProcess != INVALID_HANDLE_VALUE )
		{
			EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeededModule ) ;
			GetModuleBaseName ( hProcess, hMod, szProcessName[i].GetBuffer(512), 512 ) ;

			TempStr.Format ( "%d", dwProcessId[i] ) ;
			m_ListCon.InsertItem ( i, TempStr, 0 ) ;
			m_ListCon.SetItemText ( i, 1, szProcessName[i] ) ;			
			CloseHandle ( hProcess ) ;
		}
	}
}

[注意]APP应用上架合规检测服务,协助应用顺利上架!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (58)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
搞的太晚,头晕了
光发贴也至少编辑了十次
如有疏忽或者错误之处,请指出
2006-6-12 04:09
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
以DEBUG状态创建的进程不用加CREATE_SUSPENDED标志吧,内核在完成进程装载和初始化之后会在被调试进程的上下文环境中自己调用一次int 3的
2006-6-12 04:22
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
4
北极星辛苦!
2006-6-12 09:45
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
Originally posted by drwch
以DEBUG状态创建的进程不用加CREATE_SUSPENDED标志吧,内核在完成进程装载和初始化之后会在被调试进程的上下文环境中自己调用一次int 3的


多谢指点
我测试了你说的,完全正确
在这个地方,我确实做了重复工作
2006-6-12 10:10
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
6
呵呵,系列开始继续了?还怕你受刺激,不搞了呢。支持北极星!
2006-6-12 10:25
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
7
严重支持.....期待好文继续
2006-6-12 10:30
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
8
Originally posted by CCDebuger
呵呵,系列开始继续了?还怕你受刺激,不搞了呢。支持北极星!


这个系列又没有停止过,只不过跟我的初衷不同
原本是想让各位高手出手,但是……
至于我自己嘛,有时间还是会继续的,只不过这样的话,整个流程会拉长。

刚看到的时候是受了点刺激,但是对我的积极性并没有影响

何况,还有你们这些朋友的支持
2006-6-12 10:33
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
9
唉...现在像北极星版版的好人不多了
2006-6-12 11:59
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
支持这个东西 学习
2006-6-12 13:14
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
最初由 北级星 发布
这个软件写的比较久了,回忆了下。加深对加载过程的了解,熟悉WIN32调试API。

大哥如果写文章太累,可以把自己可以发的代码发出来,写个大概说明就好.
其他牛b的大虾们也支持一下啊,多发发你们的程序.强烈支持北极星,来,亲一个.....
2006-6-12 13:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
很详细的资料,可以减少小虾们的入门时间.把附件下了,仔细看看.多谢北极星
2006-6-12 19:52
0
雪    币: 122
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
强烈支持一下啊!!!!!!!
2006-6-12 20:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
非常感谢,大大辛苦了
2006-6-12 22:23
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
支持!下载回头看
2006-6-12 23:32
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
最初由 北极星2003 发布
多谢指点
我测试了你说的,完全正确
在这个地方,我确实做了重复工作


不必客气,好文是要支持的

顺便问一下有没有办法直接提升每日许可发帖的数量,我想PM一下看雪,但是发现论坛连短消息系统都被关掉了
2006-6-13 00:19
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
17
drwch 兄可以来篇精华让我们学习一下,最快的方法就是来一篇精华帖,将会没有发帖限制,还可以上传文件,使用FTP
2006-6-13 00:35
0
雪    币: 267
活跃值: (235)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
18
辛苦了,支持!
2006-6-13 03:43
0
雪    币: 226
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
myd
19
辛苦了,好帖哦!
2006-6-13 12:27
0
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
向所有写作者致敬!

学习ing...
2006-6-13 13:36
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
21
最初由 CCDebuger 发布
drwch 兄可以来篇精华让我们学习一下,最快的方法就是来一篇精华帖,将会没有发帖限制,还可以上传文件,使用FTP


我不知道该写些什么好啊,好像我会的这里基本上都有提到
2006-6-13 18:24
0
雪    币: 1
活跃值: (354)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
【时间】2007年6月12日
2006-6-14 01:13
0
雪    币: 223
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
2006-6-14 10:42
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
24
Originally posted by littlepotato
【时间】2007年6月12日


这个错误可以载入史册了
2006-6-14 11:39
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
各位大侠,我是一个菜鸟,不过我对这个很感兴趣,希望各位大侠多多帮助.
2006-6-14 13:48
0
游客
登录 | 注册 方可回帖
返回
//