远程进程的Dll注入[黑防]

 

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
/*
一、OpenProcessToken函数
打开进程令牌环
二、LookupPrivilegeValue函数
获得进程本地唯一ID
三、AdjustTokenPrivileges函数
提升进程的权限
*/
int EnableDebugPriv(const char* name)
{
 HANDLE hToken;
 if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
 {
  printf("打开指定令牌环失败!\n");
  return -1;
 }

 LUID luid;

 if( !LookupPrivilegeValue(NULL, name, &luid) )
 {
  printf("查询LUID失败!\n");
  return -1;
 }

 TOKEN_PRIVILEGES tp;
 tp.PrivilegeCount = 1;
 tp.Privileges[0].Luid = luid;
 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 if( !AdjustTokenPrivileges(hToken, FALSE, &tp, NULL, NULL, NULL) )
 {
  printf("提升进程权限失败!\n");
  return -1;
 }

 printf("提升权限成功!\n");
 return 0;
}
/*
一、打开远程进程
OpenProcess函数
二、在远程进程的内存中分配空间
VirtualAllocEx函数
三、远程进程的内存的写入
WriteProcessMemory函数
四、找到LoadLibrary函数在Kernel32中的地址
GetProcAddress函数
五、在远程进程中线程(远程线程)
CreateRemoteThread函数
*/
BOOL InjectDll(const char* DllFullPath, const DWORD dwRemoteProcessId)
{
 HANDLE hRemoteProcess;
 hRemoteProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,
  FALSE, dwRemoteProcessId);
 if( hRemoteProcess == NULL )
 {
  printf("打开远程进程失败!\n");
  return FALSE;
 }

 char *pszLibFileRemote ;

 pszLibFileRemote = (char*)VirtualAllocEx(hRemoteProcess, NULL, lstrlen(DllFullPath)+1, MEM_COMMIT, PAGE_READWRITE);
 if( pszLibFileRemote == NULL )
 {
  printf("分配内存失败!\n");
  return FALSE;
 }

 if( !WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (LPVOID)DllFullPath, lstrlen(DllFullPath)+1, NULL) )
 {
  printf("写入内存失败!\n");
  return FALSE;
 }

 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
 if( pfnStartAddr == NULL )
 {
  printf("获取LoadLibrary函数地址失败!\n");
  return FALSE;
 }

 if( CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL) == NULL)
 {
  printf("创建远程线程失败!\n");
  return FALSE;
 }

 return TRUE;
}
/*
一、系统进程快照
CreateToolhelp32Snapshot函数
二、在快照中搜索指定进程
Process32First函数
Processe32Next函数
*/
unsigned long getprocid(char *pn)
{
 HANDLE hnd;
 hnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if( hnd == NULL )
 {
  printf("获取系统快照失败!");
  return 0;
 }

 PROCESSENTRY32 pe;
 pe.dwSize = sizeof(PROCESSENTRY32);
 BOOL b;
 b = Process32First(hnd, &pe);
 while(b)
 {
  if( strcmp(pe.szExeFile, pn) == 0 )
   return pe.th32ProcessID;
  b = Process32Next(hnd, &pe);
 }
 return 0;
}

int main(int argc, char* argv[])
{

 EnableDebugPriv(SE_DEBUG_NAME);//提升本进程的权限至DEBUG模式
 InjectDll("My.dll", getprocid("NOTEPAD.EXE"));//注入My.dll到NOTEPAD.EXE程序
 return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值