最近的项目涉及了软件破解方面的知识,记录一下。

将dll注入另一个进程。

// Inject.cpp : Defines the exported functions for the DLL application.
// #include "stdafx.h"
#include <TlHelp32.h>
#include <Psapi.h>
#include <tchar.h> // LoadLibrary的不同版本
#if defined _UNICODE
#define _LoadLibrary "LoadLibraryW" //_UNICODE
#else
#define _LoadLibrary "LoadLibraryA" //_MBCS
#endif // 根据进程名获取PID
DWORD GetPID(LPTSTR lpProcess)
{
HANDLE hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); // 获取进程快照句柄 PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL flag = Process32First(hProcSnap, &pe32); // 获取列表的第一个进程 while(flag)
{
if(!_tcsicmp(pe32.szExeFile, lpProcess))
{
CloseHandle(hProcSnap);
return pe32.th32ProcessID; //pid
}
flag=Process32Next(hProcSnap, &pe32); //获取下一个进程
} CloseHandle(hProcSnap);
return ;
} // 获取适当的Privilege
// hProcess 当前进程的handle
// Privilege 需要的Privilege
// 成功返回TRUE,失败返回FALSE
BOOL AdjustProcessPrivilege(HANDLE hProcess, TCHAR *Privilege)
{
HANDLE hToken=NULL;
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken); //打开进程令牌环 if(NULL==hToken)
return FALSE; LUID luid;
if(!LookupPrivilegeValue(NULL, Privilege, &luid)) // 获得进程本地唯一ID
{
CloseHandle(hToken);
return FALSE;
} TOKEN_PRIVILEGES token_privileges;
token_privileges.PrivilegeCount =;
token_privileges.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
token_privileges.Privileges[].Luid = luid; //调整进程权限
if(!AdjustTokenPrivileges(hToken, FALSE, &token_privileges, NULL, NULL, NULL))
{
CloseHandle(hToken);
return FALSE;
} CloseHandle(hToken); return TRUE;
} // 在进程中查找dll
HMODULE CheckProcessModule(LPTSTR lpRemoteProcess, LPTSTR lpInjectDll)
{
DWORD nRemotePID = GetPID(lpRemoteProcess);
HANDLE hRemoteProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, nRemotePID); HMODULE hMods[];
DWORD cbNeeded = ; // Get a handle to the process.
if( EnumProcessModules(hRemoteProcess, hMods, sizeof(hMods), &cbNeeded))
{
for (UINT i=; i<(cbNeeded/sizeof(HMODULE)); i++)
{
TCHAR szModName[MAX_PATH]; // Get the full path to the module's file.
if (GetModuleFileNameEx(hRemoteProcess, hMods[i], szModName, sizeof(szModName)/sizeof(TCHAR)))
{
if (!_tcsicmp(lpInjectDll, szModName))
{
CloseHandle(hRemoteProcess);
return hMods[i];
}
}
}
} CloseHandle(hRemoteProcess);
return NULL;
} BOOL InjectDll(LPTSTR lpRemoteProcess, LPTSTR lpInjectDll, BOOL bInject)
{
// 获取SeDebugPrivilege权限
if(FALSE == AdjustProcessPrivilege(GetCurrentProcess(), _T("SeDebugPrivilege")))
return FALSE; // 函数准备
LPTHREAD_START_ROUTINE pfnThread = NULL;
HINSTANCE hMod = GetModuleHandle(_T("kernel32.dll"));
if (bInject)
pfnThread = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,_LoadLibrary); // LoadLibrary注入
else
pfnThread = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"FreeLibrary"); // FreeLibrary卸载
if(NULL == pfnThread)
return FALSE; __try
{
// 获取目标进程ID
DWORD nRemotePID = GetPID(lpRemoteProcess);
// 打开目标进程
HANDLE hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nRemotePID);
if(hRemoteProcess == NULL)
{
return FALSE;
} if (bInject) //注入
{
// 在远端进程中分配内存
LPVOID ModName = VirtualAllocEx(hRemoteProcess, NULL, (_tcslen(lpInjectDll)+)*sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);
if(!ModName)
__leave; // 在远端进程中写入dll的文件名
if( == WriteProcessMemory(hRemoteProcess, ModName, lpInjectDll, (_tcslen(lpInjectDll)+)*sizeof(TCHAR), NULL))
__leave; // 创建远程线程
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, , pfnThread, ModName, , NULL);
if(NULL == hRemoteThread)
__leave;
WaitForSingleObject(hRemoteThread,INFINITE); VirtualFreeEx(hRemoteProcess, ModName, , MEM_RELEASE);
CloseHandle(hRemoteThread);
}
else //卸载
{
// 在进程中查找需要卸载的dll
HMODULE hTarget = CheckProcessModule(lpRemoteProcess, lpInjectDll);
// 创建远程线程
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, , pfnThread, hTarget, , NULL);
if(NULL == hRemoteThread)
__leave;
WaitForSingleObject(hRemoteThread,INFINITE); CloseHandle(hRemoteThread);
} CloseHandle(hRemoteProcess);
return TRUE;
}
__finally
{
} return FALSE;
}

以上已经将dll成功注入到目标进程,但是怎样让注入的dll执行?可以在dll加载时,执行一段代码。

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Fun(); // 需要执行的代码
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

DLL注入的更多相关文章

  1. Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)

    工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...

  2. [转]Dll注入经典方法完整版

    Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在 ...

  3. 第22章 DLL注入和API拦截(2)

    22.4 使用远程线程来注入DLL 22.4.1 概述 (1)远程线程注入是指一个进程在另一个进程中创建线程,然后载入我们编写的DLL,并执行该DLL代码的技术.其基本思路是通过CreateRemot ...

  4. 第22章 DLL注入和API拦截(1)

    22.1 注入的一个例子(跨进程子类化窗口) ①子类化窗口可以改变窗口的行为,让发往该窗口的消息重新发到我们指定的过程来处理.但这种行为只能在本进程中(如A),对于从一个进程(如B)去子类化另一个进程 ...

  5. DLL注入之注册表

    0x00 唠叨 编写本系列文章纯属为了系统学习DLL注入的方法,所以很多方法可能已经过时,希望各位看官勿喷.当然若有更好的方法,希望不腻赐教.若本文有任何错的地方,也希望各位指正.谢谢! 0x01 适 ...

  6. c++实现dll注入其它进程

    DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术. 技术要点: 1.宿主进程调用LoadLibrary,就可以完成DLL的远程注入.可以通过Create ...

  7. DLL注入_拦截技术之Hook方式

    后卫大师教你进程注入 首先提一下,由于文章完全是我手写,所以打不了太多,请包含,由于我已经提供了源代码,所以我在这里详细讲一下理论,至于想看代码的下载代码就可以了.代码中关于注入的部分做了详细的注释. ...

  8. 反射Dll注入分析

    (源码作者:(HarmanySecurity)Stephen Fewer) 0x01  反射Dll注入的优点  1.反射Dll注入的主要优点是它没有以主机系统的任何方式(例如LoadLibrary和L ...

  9. dll注入遇到CreateRemoteThread()返回错误代码5

    在进行dll注入的时候,发现触发了CreateRemoteThread()的错误并返回错误代码5,刚开始以为权限不够,用了管理员权限和加了SetPrivilege()函数提权和用NtCreateThr ...

随机推荐

  1. html5新增标签和属性

    结构性标签:<header>头部</header><nav>导航</nav><section>用于表达书的一章或一部分</sectio ...

  2. activity跳转到新的activity后清除之前的activity

    Intent intent = new Intent(A.this, B.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Inten ...

  3. BSBuDeJie_02

    一 左边的类别数据 1 模型 和 字典中的数据对应 /* id */ @property (nonatomic, assign) NSInteger *id; /* 总数 */ @property ( ...

  4. 【emWin】例程五:显示数值

    实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1pLexsAf密码:p0jf 实验现象:

  5. JQUERY attr prop 的区别 一个已经被淘汰

    在做jquery 全选 全不选的项目中, 1..prop( propertyName ) 获取匹配集合中第一个元素的Property的值 2. .prop( propertyName, value ) ...

  6. 神奇的 CURL 命令

    CURL? 嗯,说来话长了~~~~ 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1) 二话不说,先从这里开始吧! curl http: //www.yahoo.com   回车之 ...

  7. centos下JDK的卸载与安装

    linux是自带JDK的,但是它自带的JDK是openJDK,我们如果需要安装ant之类的软件,使用这个JDK是不行的.所以我们需要卸载linux下自带的JDK,并安装我们准备的JDK. JDK的卸载 ...

  8. PBOC协议中对于所有电子存折/电子钱包应用的预处理

    下图给出了PBOC协议中规定的对电子存折/电子钱包应用的所有交易类型共有的预处理流程 图1 1.1 插入卡片 终端应具有检测IC卡是否已经插入读卡器的功能.如果IC卡已经插入,终端将继续执行1.2的应 ...

  9. Java 枚举7常见种用法

    DK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是:  ...

  10. iOS 10的正确解锁方式

    在iOS 10上,锁屏状态通过按下电源键点亮屏幕之后,用手指轻触Home键,实际上手机是已经解锁了的,不信请看如下截图: 虽然手机已经解锁,但与iOS 9不同的是,此时手机还处在解锁界面而没有进入主屏 ...