InjectAPC全部项目(Win32和Win64位)
// InjectAPC.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <vector>
#include <TlHelp32.h> using namespace std;
BOOL GrantPrivileges(WCHAR* PrivilegeName);
BOOL GetProcessIDByProcessImageName(IN WCHAR* wzProcessImageName, OUT UINT32* TargetProcessID);
BOOL GetThreadIDByProcessID(UINT32 ProcessID, vector<UINT32>& ThreadIDVector);
BOOL Inject(UINT32 ProcessID, UINT32 ThreadID); WCHAR DllFullPath[MAX_PATH] = { };
PVOID DllFullPathBufferData = NULL; int main()
{
if(GrantPrivileges(SE_DEBUG_NAME)==FALSE)
{
printf("GrantPrivilege Error\r\n");
}
UINT32 ProcessID = ;
GetCurrentDirectory(MAX_PATH, DllFullPath);
wcscat(DllFullPath, L"\\Dll.dll");
//getchar();
//printf("%S\r\n", DllFullPath); #ifdef _WIN64
GetProcessIDByProcessImageName(L"Taskmgr.exe", &ProcessID);
// GetProcessIDByProcessImageName(L"explorer.exe", &ProcessID);
#else
GetProcessIDByProcessImageName(L"Taskmgr.exe", &ProcessID);
#endif
vector<UINT32> ThreadIDVector;
//printf("%d\r\n", ProcessID);
GetThreadIDByProcessID(ProcessID, ThreadIDVector); UINT32 ThreadID = ;
while (!ThreadIDVector.empty())
{
ThreadID = ThreadIDVector.back();
Inject(ProcessID, ThreadID);
ThreadIDVector.pop_back();
}
/*size_t ThreadCount = ThreadIDVector.size();
for (INT_PTR i = ThreadCount - 1; i >= 0; i--)
{
UINT32 ThreadID = ThreadIDVector[i];
Inject(ProcessID, ThreadID);
}*/
getchar();
return ;
}
//提高的是自己的权限,提成自己想要的。 BOOL GrantPrivileges(WCHAR* PrivilegeName)
{
HANDLE TokenHandle = NULL;
TOKEN_PRIVILEGES PrivilegesToken;
LUID v1;
//打开权限令牌
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &TokenHandle))
{
return FALSE;
}
if (!LookupPrivilegeValue(NULL, PrivilegeName, &v1))
{
CloseHandle(TokenHandle);
return FALSE;
}
PrivilegesToken.PrivilegeCount = ;
PrivilegesToken.Privileges[].Luid = v1;
PrivilegesToken.Privileges[].Attributes = SE_PRIVILEGE_ENABLED;
//调整权限 //特权启用. 特权被用来访问一个对象或服务
if (!AdjustTokenPrivileges(TokenHandle, FALSE, &PrivilegesToken, sizeof(PrivilegesToken), NULL, NULL))
{
CloseHandle(TokenHandle);
TokenHandle = NULL;
return false;
}
//启用特权
CloseHandle(TokenHandle); return TRUE;
}
//做好放的笔记里
BOOL GetProcessIDByProcessImageName(IN WCHAR * wzProcessImageName, OUT UINT32 * TargetProcessID)
{
HANDLE ProcessSnapshotHandle = NULL; //1.初始化 ProcessSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
//一个班的学生
if (ProcessSnapshotHandle == INVALID_HANDLE_VALUE)
{
return FALSE;
} PROCESSENTRY32 ProcessEntry32 = { }; //用来存放快照进程信息的一个结构体
ProcessEntry32.dwSize = sizeof(PROCESSENTRY32);//初始化PROCESSENTRY结构
Process32First(ProcessSnapshotHandle, &ProcessEntry32); //把第一个进程 放在结构体中 do
{
if (lstrcmpi(ProcessEntry32.szExeFile, wzProcessImageName)==) //不区分大小写
{ //进程的名称
*TargetProcessID = ProcessEntry32.th32ProcessID;
break;
}
} while (Process32Next(ProcessSnapshotHandle, &ProcessEntry32));
//printf("%d\r\n", *TargetProcessID);
CloseHandle(ProcessSnapshotHandle);
ProcessSnapshotHandle = NULL;
return TRUE;
return ;
}
//枚举对方的指定进程ID的所有线程,压入vector中,返回线程集合
BOOL GetThreadIDByProcessID(UINT32 ProcessID, vector<UINT32>& ThreadIDVector)
{
HANDLE ThreadSnapshotHandle = NULL;
THREADENTRY32 ThreadEntry32 = { };
ThreadEntry32.dwSize = sizeof(THREADENTRY32);
ThreadSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, );
if (ThreadSnapshotHandle == INVALID_HANDLE_VALUE) //指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,
{ //在其他情况下该参数被忽略,所有的进程都会被快照。所以不用修改0为ProcessID。
return FALSE;
}
BOOL bOk = Thread32First(ThreadSnapshotHandle, &ThreadEntry32);
if (bOk)
{
do
{
if (ThreadEntry32.th32OwnerProcessID == ProcessID)
{
ThreadIDVector.emplace_back(ThreadEntry32.th32ThreadID); //怀疑可能push.back枚举可以
}
} while (Thread32Next(ThreadSnapshotHandle, &ThreadEntry32));
}
CloseHandle(ThreadSnapshotHandle);
ThreadSnapshotHandle = NULL;
return TRUE;
} BOOL Inject(UINT32 ProcessID, UINT32 ThreadID)
{
HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
HANDLE ThreadHandle = INVALID_HANDLE_VALUE;
//
SIZE_T ReturnLength = ; size_t DllFullPathLength = wcslen(DllFullPath) + ; if (DllFullPathBufferData == NULL)
{
//在对方进程空间申请内存,存储Dll完整路径。
DllFullPathBufferData = VirtualAllocEx(ProcessHandle, NULL, DllFullPathLength * , MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (DllFullPathBufferData == NULL)
{
CloseHandle(ProcessHandle);
CloseHandle(ThreadHandle);
return FALSE;
}
//将DllFullPath写进刚刚申请的内存中 size是双字长度
BOOL bOk = WriteProcessMemory(ProcessHandle, DllFullPathBufferData, DllFullPath, DllFullPathLength*,
&ReturnLength); if (bOk == FALSE)
{
VirtualFreeEx(ProcessHandle,DllFullPathBufferData,(DllFullPathLength * ), MEM_RELEASE);
CloseHandle(ProcessHandle);
CloseHandle(ThreadHandle);
return FALSE;
}
} UINT_PTR LoadLibraryAddress = (UINT_PTR)GetProcAddress(GetModuleHandle(L"Kernel32.dll"),"LoadLibraryW");
//当前进程中获得导入模块Kernel32基地址
//Kernel32模块中的导出表中获得函数LoadLibraryW /*
为什么这里用导出表中的地址LoadLibraryW不用导入表中的函数地址?
LoadLibraryW 当前进程导入表中的地址 比如 LoadLibraryW = 0x1234 0x1234 -->0x7564 相当于 0x1234[0x7564] 1.防止中一种病毒叫Hook IAT(ImportAddressTable) Hook
中这种病毒,修改了Kernel 地址 0x7564,这样寻不到址
2.确保地址OK */
if (LoadLibraryAddress == NULL)
{
VirtualFreeEx(ProcessHandle, DllFullPathBufferData, (DllFullPathLength * ), MEM_RELEASE);
CloseHandle(ProcessHandle);
return FALSE;
}
_try
{
ThreadHandle = OpenThread(THREAD_ALL_ACCESS, FALSE, ThreadID);
QueueUserAPC((PAPCFUNC)LoadLibraryAddress,ThreadHandle,(UINT_PTR)DllFullPathBufferData);
//LoadLibraryAddress(DllFullPathBufferData)
}
_except(EXCEPTION_CONTINUE_EXECUTION)
{ }
CloseHandle(ProcessHandle);
CloseHandle(ThreadHandle);
return ;
}
卷珠帘
InjectAPC全部项目(Win32和Win64位)的更多相关文章
- 【转】win32,win64编程永恒;语言编程需要注意的64位和32机器的区别
原文网址:http://www.cnblogs.com/kex1n/archive/2010/10/06/1844737.html 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C ...
- win64位安装python-mysqldb1.2.5
在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:"Cannot open include file: 'config-win.h ...
- 在win64位,python64位2.7版本中安装pyHook
今天看了一篇博文说的是利用pyhook监听键盘鼠标事件(感兴趣的可以看博客园中相关文章),文章中使用的pyHook模块的官方下载地址是:http://sourceforge.net/projects/ ...
- 32位vs2010的项目如何在64位系统上运行
64位注册 1. 关闭Visual Studio.2. 在Visual Studio Tools目录,以管理员身份运行Visual Studio Command Prompt (2010),[注:这个 ...
- [Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...
- win64位安装python-mysqldb1.2.3
在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:“Cannot open include file: 'config-win.h': No ...
- access 驱动在win64位出现问题
如果是调试的话,将应用程序池的 启动win32应用程序池 为 true
- 【C/C++开发】【VS开发】win32位与x64位下各类型长度对比
64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 ...
- win64位 apache2.4 php5.4 mysql5.6
apache2.4 php5.4 mysql5.6 源文件下载 +以前的配置数据参考 链接:http://pan.baidu.com/s/1skfmGyT 密码:hqtp 比较好的参考资料 http: ...
随机推荐
- 寒假学干货之------android开发环境
1.下载安装jdk(http://www.oracle.com/technetwork/java/javase/downloads/index.html)装se版的就可以了,复制jdk目录路径,之后配 ...
- java 方法学习
手写随机代码 public class suiji{private static final int N = 200;private static final int LEFT = 40;privat ...
- python并行任务之生产消费模式
一. 生产者/消费者模式 概念:生产者产生一块数据,放到buffer中,与此同时,消费者在从buffer中取出并消耗这些数据 理解:像生活中厂家生产出产品,顾客购买消耗这些产品,buffer就是存放商 ...
- 第八十六节,html5+css3pc端固定布局,网站结构,CSS选择器,完成导航
html5+css3pc端固定布局,网站结构,CSS选择器,完成导航 页面采用1280的最低宽度设计,去掉滚动条为1263像素. 项目是PC端的固定布局,会采用像素(px)单位. 网站结构语义 在没有 ...
- 2016年团体程序设计天梯赛-决赛 L1-1. 正整数A+B(15)
本题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A和B不一定是满 ...
- win2008服务器,fastCGI完美设置教程
在WIN2008的IIS7上使用FASTCGI调用PHP-CGI.EXE,默认只有4个进程,这样对于大流量的网站为说,进程数不足带来的进程排队现象十分严重,解决方案如下.32位系统 http://ww ...
- dplyr 数据操作 列操作(select / mutate)
在R中,我们通常需要对数据列进行各种各样的操作,比如选取某一列.重命名某一列等. dplyr中的select函数子在数据列的操作上也同样表现了它的简洁性,而且各种操作眼花缭乱. select(.dat ...
- hdu和poj的基础dp30道
题目转自:https://crazyac.wordpress.com/dp%E4%B8%93%E8%BE%91/ 1.hdu 1864 最大报销额 唔,用网上的算法连自己的数据都没过,hdu的数据居然 ...
- 浙大pat 1059 题解
1059. Prime Factors (25) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given ...
- OMCS开发手册(03) -- 多媒体服务器
前面我们已经详细介绍了基于OMCS开发网络多媒体应用的客户端程序所必需掌握的内容,现在我们来看一下OMCS服务端的开发.对于使用者而言,OMCS的服务端就非常简单了,只要实现一个用户验证的接口,挂接到 ...