DLL注入

    刚刚整理的代码注入(远程线程注入)现在整理这个DLL注入,DLL注入比较常用,相比远程代码注入DLL注入没有什么太多的限制,而且实现起来比较简单,当然远程线程需要注意的问题DLL很多情况都需要注意,这里不做重复,只说代码注入里面没有说过的部分。DLL注入的方式不唯一,比如你如果完全看懂了代码注入,那么你直接LoadLibrary地址和一个dll路径传进去然后在里面load一下就行了,也就是之前的代码注入完全可以实现dll注入,今天就说下一通常dll的注入方式吧,通常dll的注入比我刚刚说的那个方法还要简单,流程和代码注入差不多但是简单了很多,思路是这样,LoadLibrary这个函数所有的进程都是地址一样,我们直接获取LoadLibrary的地址,然后在CreateRemoteThread里面直接把这个地址作为线程地址传过去,然后参数就是我们已经拷贝到对方内存里的那个字符串,这样直接就跑起来了,非常简单,在DLL里想干什么就干什么,可以和本地写代码一样,然后还有一个问题,就是注意一下,dll在入口的switch里面的第一个分支直接调用你想干的事就行了,那个分支的意思就是说当dll被第一次载入的时候就自动执行了,OK就这么简单,如果你觉得没听懂,那么需要看我之前说的那个代码注入,这个里面只说了新的东西,还有就是dll注入应该注意的几个地方:

1.dll的入口记得就调用自己的函数,别走正当的流程,如果你非蛋疼的想调用某个指定函数,当然可以用代码注入结合dll注入的方式,但是 然并卵。

2.注意系统问题,32exe+32dll注入32位程序,64exe+64dll注入64位程序。

3.加入你注入了QQ,发现第一次注入成功了,但是第二次注入代码没报错,但是么执行自己想要的,什么情况?,原因在于同一个dll被加同一个程序加载两次的时候,第二次不会加载,给优化掉了,把QQ关了重开就行,或者自己找到某个地方free掉自己的dll。OK一共就这些,接下来是我封装好的一个DLL调用库,没有写的很细,如果是使用建议简单修改整理(我写了测试例子,在这里http://download.csdn.net/detail/u013761036/9603051)。

.H
#pragma once
#include <Windows.h>
#include <stdlib.h>
#include <tlhelp32.h>
#include <Psapi.h>
#include <string> using std::string;
using std::wstring; #pragma comment (lib,"Psapi.lib") #pragma warning(disable:4996) class CInstDll
{
private:
bool AdjustProcessTokenPrivilege();
bool Camp2str(wstring wsStrA ,wstring wsStrB);
DWORD GetProcessIdByName(const wstring &wsProcessName);
std::string ws2s(const std::wstring& s_src,UINT CodePage = CP_ACP);
std::wstring s2ws( const std::string& s_src,UINT CodePage = CP_ACP); public:
bool InjectionDll2ProA(const string &strPorcessName ,const string &strDllPath);
bool InjectionDll2ProW(const wstring &wsPorcessName ,const wstring &wsDllPath);
}; .CPP
#include "stdafx.h"
#include "InstDll.h" bool CInstDll::AdjustProcessTokenPrivilege()
{
LUID luidTmp;
HANDLE hToken;
TOKEN_PRIVILEGES tkp; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp))
{
CloseHandle(hToken);
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luidTmp;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
{
CloseHandle(hToken);
return FALSE;
}
return true;
} bool CInstDll::Camp2str(wstring wsStrA ,wstring wsStrB)
{
int nSize = wsStrA.length();
for(int i = 0 ;i < nSize ;i ++)
{
if(wsStrA[i] >= 'A' && wsStrA[i] <= 'Z')
wsStrA[i] += 'a'- 'A';
} nSize = wsStrB.length();
for(int i = 0 ;i < nSize ;i ++)
{
if(wsStrB[i] >= 'A' && wsStrB[i] <= 'Z')
wsStrB[i] += 'a'- 'A';
} return wsStrA == wsStrB;
} DWORD CInstDll::GetProcessIdByName(const wstring &wsProcessName)
{
HANDLE hProcess = 0;
DWORD dwProcess[2048] ,dwNeeded;
TCHAR tcProcName[MAX_PATH] = {0};
wstring wsNowProcessName = L"";
int nTempSize = 0;
int nPos = 0; EnumProcesses(dwProcess, sizeof(dwProcess), &dwNeeded); for(int i = 0 ;i < dwNeeded / sizeof(DWORD) ;i++)
{
if(0 != dwProcess[i])
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcess[i]);
GetModuleFileNameEx(hProcess, NULL, tcProcName, MAX_PATH);
nPos = wstring(tcProcName).find_last_of(L'\\');
if(nPos != wstring::npos)
{
wsNowProcessName = wstring(wstring(tcProcName).substr(nPos + 1));
if(Camp2str(wsProcessName ,wsNowProcessName))
{
DWORD aa = dwProcess[i];
return aa;
}
//if(wsProcessName == wsNowProcessName)
// return dwProcess[i];
}
}
}
return 0;
} std::string CInstDll::ws2s(const std::wstring& wide, UINT CodePage)
{
int wide_length = static_cast<int>(wide.length());
if (wide_length == 0)
return std::string(); // Compute the length of the buffer we'll need.
int charcount = WideCharToMultiByte(CodePage, 0, wide.data(), wide_length,
NULL, 0, NULL, NULL);
if (charcount == 0)
return std::string(); std::string mb;
mb.resize(charcount);
WideCharToMultiByte(CodePage, 0, wide.data(), wide_length,
&mb[0], charcount, NULL, NULL); return mb;
} std::wstring CInstDll::s2ws( const std::string& mb,UINT CodePage)
{
if (mb.empty())
return std::wstring(); int mb_length = static_cast<int>(mb.length());
// Compute the length of the buffer.
int charcount = MultiByteToWideChar(CodePage, 0,
mb.data(), mb_length, NULL, 0);
if (charcount == 0)
return std::wstring(); std::wstring wide;
wide.resize(charcount);
MultiByteToWideChar(CodePage, 0, mb.data(), mb_length, &wide[0], charcount); return wide;
} bool CInstDll::InjectionDll2ProW(const wstring &wsPorcessName ,const wstring &wsDllPath)
{
//1.提权
if(!AdjustProcessTokenPrivilege())
return false; //2.获取pid
DWORD dwProPID = 0;
if((dwProPID = GetProcessIdByName(wsPorcessName)) == 0)
return false; //3.打开进程
HANDLE hProcess = NULL;
if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE ,dwProPID)) == NULL)
return false; //4.初始化参数数据 PTHREAD_START_ROUTINE dwLoadLibraryAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryA");
if(dwLoadLibraryAddress == 0)
return false;
char tcCache[MAX_PATH] = {0};
strcat(tcCache ,ws2s(wsDllPath).c_str()); //5.在宿主进程里分配内存,用于存参数
char *pPara = NULL;
pPara = (char *)VirtualAllocEx(hProcess , 0 ,sizeof(tcCache) ,MEM_COMMIT,PAGE_READWRITE);
if(pPara == NULL) return false; //6.把参数写入宿主进程里,注意结构体的命名(_REMOTE_PARAMETER)
if(!WriteProcessMemory(hProcess ,pPara ,tcCache ,sizeof(tcCache) ,0))
return false; //7.启动注入宿主进程的进程
DWORD dwThreadId = 0;
HANDLE hThread = CreateRemoteThread(hProcess ,0 ,0 ,dwLoadLibraryAddress ,pPara ,0 ,&dwThreadId);
if(!hThread) return false; //9.等待线程结束,然后清理内存 WaitForSingleObject(hThread ,INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hProcess ,pPara ,0 ,MEM_RELEASE);
CloseHandle(hProcess);
return true;
} bool CInstDll::InjectionDll2ProA(const string &strPorcessName ,const string &strDllPath)
{
return InjectionDll2ProW(s2ws(strPorcessName) ,s2ws(strDllPath));
} USER
#include "stdafx.h"
#include "InstDll.h" int _tmain(int argc, _TCHAR* argv[])
{
CInstDll cIn;
//cIn.InjectionDll2ProW(L"qq.exe" ,L"c:\\MyFirstDll32.dll"); //"explorer.exe
cIn.InjectionDll2ProA("explorer.exe" ,"c:\\MyFirstDll64.dll"); //"explorer.exe
return 0;
} 我再把当时测试用的一个简单DLL代码贴出来吧
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h" void DoSomethings()
{
MessageBoxW(NULL ,L"do some things" ,L"T" ,MB_OK);
} BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
DoSomethings();
}break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

windows-DLL注入的更多相关文章

  1. 【windows核心编程】远程线程DLL注入

    15.1 DLL注入 目前公开的DLL注入技巧共有以下几种: 1.注入表注入 2.ComRes注入 3.APC注入 4.消息钩子注入 5.远线程注入 6.依赖可信进程注入 7.劫持进程创建注入 8.输 ...

  2. Dll注入:Windows消息钩子注入

    SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之 ...

  3. DLL注入之windows消息钩取

    DLL注入之windows消息钩取 0x00 通过Windows消息的钩取 通过Windows消息钩取可以使用SetWindowsHookEx.该函数的原型如下: SetWindowsHookEx( ...

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

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

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

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

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

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

  7. DLL注入之注册表

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

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

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

  9. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...

  10. 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现

    20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...

随机推荐

  1. C# 应用 - 使用 HttpWebRequest 发起 Http 请求

    helper 类封装 调用 1. 引用的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll Syste ...

  2. 危害api收集

    以下每一条代码,无论其通过什么方式被调用,在哪个类里被调用,传入什么参数,都具有唯一不变性(在逆向出来的的smali文件里),故可以作为匹配的凭证.     网络操作相关: Ljava/net/URL ...

  3. canvas-修改图片亮度

    canvas操作-修改图片亮度 目录 canvas操作-修改图片亮度 图片亮度的概念 下面用ps截图举一个例子: 调整图片亮度的方案 实现方案一 从RGB到HSV的转换 转换的公式 javascrip ...

  4. SpingCloud Alibaba实战(1:微服务与SpringCloud Alibaba)

    1.什么是微服务? 微服务可谓是这几年比较热门的技术,从2017开始逐渐爆火,逐渐大大小小的公司纷纷将微服务技术引入并在实际业务中落地. 微服务的概念最早是在2014年由Martin Fowler和J ...

  5. 基于ceph rbd 在kubernetes harbor 空间下创建动态存储

    [root@bs-k8s-ceph ~]# ceph osd pool create harbor 128 Error ETIMEDOUT: crush test failed with -110: ...

  6. Python数据分析入门(十六):设置可视化图表的信息

    现在我们添加图后,没有指定x轴代表什么,y轴代表什么,以及这个图的标题是什么.因此以下我们通过一些属性来设置一下. 设置线条样式: 使用plot方法:plot方法就是用来绘制线条的,因此可以在绘制的时 ...

  7. ubuntu16.04 下同时打开多个终端窗口

    reference :https://forums.solydxk.com/viewtopic.php?t=5139 reference : http://blog.51cto.com/huqilon ...

  8. Toolkit 大更新:UI 更美观,用起来更方便!

    前言 前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了.就突然想起来,很久没有更新这个插件. PS:我是用它申请了 License,一般时候使用 Json 格式化功能. 趁着周 ...

  9. Polly-故障处理和弹性应对很有一手

    前言 对于运行中的系统,可以说百分百的小伙伴会经常遇见以下问题: 网络不通,突然又好了: 服务器宕机了: 调用服务接口超时了: 调用接口报错啦: 通讯信息发送失败需要重发: 以上只是列举了一些常遇到的 ...

  10. 【笔记】《Redis设计与实现》chapter2 简单动态字符串

    ------------恢复内容开始------------ 2.1 SDS的定义 struct sdshdr{ // 记录buf数组中已使用字节的数量 // 等于SDS所保存字符串的长度(不含'\0 ...