dll注入简单实现

// InjectDll.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <string>
#include "stdio.h"
#include <iostream>
using namespace std;

#define DEF_BUF_SIZE 1024
//用于存储注入模块DLL的路径全名
char szDllPath[DEF_BUF_SIZE] ={0};
//使用远程线程向指定ID的进程注入模块
BOOL InjectModuleToProcessById(DWORD dwProcessId){
	if(dwProcessId == 0)
	{
		return FALSE;
	}

	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE ,dwProcessId);
	if(hProcess == NULL){
		return FALSE;
	}
	//申请存放文件名的空间
	UINT nLen = (UINT)strlen(szDllPath)+1;
	LPVOID lpRemoteDllName = VirtualAllocEx(hProcess ,NULL ,nLen,MEM_COMMIT,PAGE_READWRITE);
	if (lpRemoteDllName == NULL)
	{
		printf("[ERROR]VirtualAllocEx(%d)/n", GetLastError() );
		return FALSE;
	}
	//把dll文件名写入申请的空间
	if (WriteProcessMemory(hProcess,lpRemoteDllName,szDllPath,nLen,NULL) ==FALSE)
	{
		printf ( "[ERROR]WriteProcessMemory(%d)/n", GetLastError() );
		return FALSE ;
	}

	//获取动态库函数地址
	HMODULE hModule = GetModuleHandle(L"kernel32.dll");
	LPTHREAD_START_ROUTINE fnStartAddr = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule ,"LoadLibraryA");
	if ((DWORD)fnStartAddr ==0)
	{
		printf ( "[ERROR]GetProcAddress(%d)/n", GetLastError() );
		return FALSE ;
	}

	//创建远程线程
	HANDLE hRemoteThread = CreateRemoteThread(hProcess ,NULL ,0,fnStartAddr ,lpRemoteDllName ,0,NULL);
	if(hRemoteThread == NULL){
		printf ( "[ERROR]CreateRemoteThread(%d)/n", GetLastError() );
		return FALSE ;
	}

	//等待远程线程结束
	if(WaitForSingleObject(hRemoteThread,INFINITE)!= WAIT_OBJECT_0 ){
		printf ( "[ERROR]WaitForSingleObject(%d)/n", GetLastError() );
		return FALSE ;
	}

	CloseHandle(hRemoteThread);
	CloseHandle(hModule);
	CloseHandle(hProcess);
	return TRUE;

}

int _tmain(int argc, _TCHAR* argv[])
{

	GetCurrentDirectoryA(DEF_BUF_SIZE ,szDllPath);
	strcat(szDllPath ,"dll");

	DWORD dwProcessId = 0;
	while (printf("请输入目标进程ID")&& cin>> dwProcessId && dwProcessId>0)
	{
		BOOL bRet = InjectModuleToProcessById(dwProcessId);
		printf (bRet ? "注入成功!/n":"注入失败!/n") ;
	}
	return 0;
}

  

时间: 2024-10-08 19:43:37

dll注入简单实现的相关文章

DLL注入的学习(未完)

参考:http://andylin02.iteye.com/blog/459483 进程注入的方法分类如下: 带DLL的注入 利用注册表注入 利用Windows Hooks注入 利用远程线程注入 利用特洛伊DLL注入 不带DLL的注入 直接将代码写入目标进程,并启动远程线程 1. 利用注册表注入(appinit_dll 注入) 在Windows NT/2000/XP/2003中,有一个注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft \WindowsHKEY_

&lt;ReversingEngineering&gt;关于windows32位系统下的dll注入技术经验汇

上个学期把自己闷在图书馆一直在看关于逆向工程技术方面的书,从入门到初级,现在也敢说自己一条腿已经迈进了这片知识的大门里,因为该博客刚开通先将一些经验记录下来,也是留给自己一方面做个参照. <逆向工程核心原理>((韩)李承远 )<Reversing:逆向工程揭密(电子工业出版社)><黑客反汇编揭密>((俄)卡巴斯基 ) dll注入技术是一门逆向工程中非常基础非常初步的技术,也是打开大门的钥匙,逆向破解的前提条件.API勾取 ,Rootkit进程隐藏都需要dll注入为先决条

[转载]Dll注入技术之注册表注入

转自:黑客反病毒论坛 DLL注入技术之REG注入    DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     REG注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件.当如果遇到有多个DLL文件时,需要用逗号或者空格隔开

[转载]Dll注入技术之ComRes注入

转自:黑客反病毒 DLL注入技术之ComRes注入     ComRes注入的原理是利用Windows 系统中C:\WINDOWS\system32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateInstance()这个API时,COM服务器会加载ComRes.dll到EXE中,我们利用这个加载过程,移花接木的把ComRes.dll替换掉,并在伪造的ComRes.dll,然后利用LoadLibrary()将事先准备好的DLL加载到目标的EXE中. 1.编写测试文件  

[转载]Dll注入技术之消息钩子

转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中.主要流程如下图所示 1.准备阶段     需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下: LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)

[00030]-[2015-09-26]-[00]-[DLL注入应用案例---修改任务管理器的实现]

案例需求: 学习了DLL注入的基础知识,需要通过一个简单的应用案例,来真正的实现DLL注入(注:为什么提倡使用DLL来实现远程进程的控制呢?因为DLL文件的编写相对规范和比较容易 操作,相对于纯粹的代码注入,因为纯粹的代码注入,需要考虑远程代码内存空间和本地进程 内存空间,这两个如果不好好思忖,就很容易出现,内存访问错误):本案例实现在任务管理 器上ListView添加两列显示: 实现策略:[1]需要spy++工具来获取 任务对话框的标题以获取应用程序的句柄 获取任务管理器指定控 件的ID,以获

反病毒攻防研究第011篇:DLL注入(下)——无DLL的注入

一.前言 一般来说,想要将自己编写的程序注入到其它进程中,是必须要使用DLL文件的,这种方法已经在上一篇文章中讨论过了.但是事实上,可以不依赖于DLL文件来实现注入的.只不过这种方法不具有通用性,没有DLL注入那样灵活,因为它需要把代码写入"注入程序"中,一旦想要注入的内容发生了变化,就需要重写整个"注入程序".而不像DLL注入那样,只要修改DLL程序即可.即便如此,无DLL进行注入的方式,也是一种值得讨论的方法. 二.无DLL注入的基本原理 在注入与卸载方面,无论

反病毒攻防研究第009篇:DLL注入(上)——DLL文件的编写

一.前言 我之前所编写的用于模拟计算机病毒的对话框程序都是exe文件,所以运行时必将会产生一个进程,产生进程就非常容易被发现.而为了不被发现,可以选择将对话框程序创建为DLL文件.这种文件会加载到已有进程的地址空间中,这样就不会再次创建出进程,隐蔽性相对较好,DLL注入也是恶意程序总会使用的手段.这次我带算用几篇文章的篇幅来论述DLL注入的问题,而这篇文章就首先来讨论一下如何把我之前的对话框程序改写为DLL文件. 二.编写对话框DLL程序 这里我依旧使用VC++6.0,创建一个简单的Win32

Dll注入方法之二

有了第一种方法,我们不难举一反三,由于原理是只需要我们的执行函数被写入到目标进程,所有相关的变量也在目标函数里,那么我们的函数就能被正确执行(前提是没有互相调用我们注入的函数,否则需要做地址处理.这也是为什么整个可执行文件注入时,要做很多重定位).这里,我们进一步尝试,将LoadLibrary放在一个函数里,在同一个函数里,我们再调用一个MessageBox(这里只是一个测试,以后你可以调用任何你的函数,但必须要对地址进行处理). 步骤一和步骤二:请参考Dll注入方法之一. 步骤三:书写需要被注