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

将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. Java知识结构

  2. List集合特有的迭代器 ListIterator

  3. istringstream的操作

    今天在stackoverflow上看到这么个问题,写完之后看了看别人的提交的答案,感觉自己的答案虽然能得出正确结果但是有点啰嗦,对于c++还是没有熟练,没有想起有istringstream,而且提问的 ...

  4. CI框架3

    1.CI不能像smarty那样直接{}访问,  <?php echo $ci;?> application\config\ config.php 日志查看      $config['lo ...

  5. PHP关于反斜杠处理函数addslashes()和stripslashes()的用法

    addslashes() 例子: <?php $str = "Who's John Adams?"; echo $str . " This is not safe ...

  6. 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket

    这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...

  7. swift 2.x学习笔记(三)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0. ...

  8. Markdown常用语法

    什么是Markdown Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档. 通过Markdown简单的语法,就可以使普通文本内容具有 ...

  9. Git系列教程三 配置与基本命令

    一.安装Git 网上有很多安装教程,可以参考.这里使用的是Windows版本的Git,点击这里下载. 二.基本设置 安装完成后,通过点击鼠标右键就可以看到新添加了俩个Git命令:Git GUI Her ...

  10. 延时调用的php代码

    比如我们想做一个类似于康盛uchome的定时触发任务,任务靠用户访问触发的,但是你触发任务是不能影响用户本身对页面的访问速度(也就是说不能任务执行十秒钟你就让用户等待十秒钟)刚好昨天把这个弄完了.拿出 ...