// 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位)的更多相关文章

  1. 【转】win32,win64编程永恒;语言编程需要注意的64位和32机器的区别

    原文网址:http://www.cnblogs.com/kex1n/archive/2010/10/06/1844737.html 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C ...

  2. win64位安装python-mysqldb1.2.5

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:"Cannot open include file: 'config-win.h ...

  3. 在win64位,python64位2.7版本中安装pyHook

    今天看了一篇博文说的是利用pyhook监听键盘鼠标事件(感兴趣的可以看博客园中相关文章),文章中使用的pyHook模块的官方下载地址是:http://sourceforge.net/projects/ ...

  4. 32位vs2010的项目如何在64位系统上运行

    64位注册 1. 关闭Visual Studio.2. 在Visual Studio Tools目录,以管理员身份运行Visual Studio Command Prompt (2010),[注:这个 ...

  5. [Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的哦)

    作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583] ...

  6. win64位安装python-mysqldb1.2.3

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:“Cannot open include file: 'config-win.h': No ...

  7. access 驱动在win64位出现问题

    如果是调试的话,将应用程序池的 启动win32应用程序池 为 true

  8. 【C/C++开发】【VS开发】win32位与x64位下各类型长度对比

    64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂):可以访问大型数据库.本文介绍的是64位下C语言开发程序注意事项. 1. 32 位和 64 ...

  9. win64位 apache2.4 php5.4 mysql5.6

    apache2.4 php5.4 mysql5.6 源文件下载 +以前的配置数据参考 链接:http://pan.baidu.com/s/1skfmGyT 密码:hqtp 比较好的参考资料 http: ...

随机推荐

  1. QT枚举类型与字符串类型相互转换

    在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了. 代码示例: #include <QtCore/QMetaEnum> ...

  2. MTK平台Android中常用的路径

    开机Logo的路径: bootable\bootloader\lk\dev\logo 开机Logo图片分辨率路径: device\rq\rq6735_35gt_b_l1\ProjectConfig.m ...

  3. 《JavaScript高级程序设计》读书笔记 ---RegExp 类型

    ECMAScript 通过RegExp 类型来支持正则表达式.使用下面类似Perl 的语法,就可以创建一个正则表达式.var expression = / pattern / flags ; 其中的模 ...

  4. UEFI安装Win10

    启动方式: Legency UEFI 分区表类型: MBR 主引导记录 最多4个主分区 最大支持2.1T硬盘 GPT 基于可扩展固件接口(EFI) 分区数不限 NTFS格式最大支持256T硬盘 安装模 ...

  5. linux中fork()函数详解(转)

    转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过 ...

  6. CentOS7 安装 Mysql 服务

    我希望所有的软件包都用 rpm.yum 安装,这样卸载.升级.管理方便,可是自带的 yum 仓库里面没有 mysql-server 或者不是最新的,我需要安装MySQL官方的 yum 仓库, http ...

  7. Gdevops2016年全球敏捷运维峰会【上海站】嘉宾阵容

    2016年全球敏捷运维峰会(Gdevops, Global Devops Summit)将于2016年在杭州.北京.广州.上海四城全面启动,本次峰会旨在搭建一个开发者与 运维者沟通交流的平台,围绕各种 ...

  8. 【Apache KafKa系列之一】KafKa安装部署

    kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 高吞吐量:即使是非常普通的 ...

  9. Effective JavaScript :第五章

    1.使用Object的直接实例构造轻量级的字典 字典就是可变长的字符串与值得映射集合.JavaScript甚至提供了枚举一个对象属性名的利器——for...in循环. var dict = { ali ...

  10. lorem ipsum text占位符

    Web开发者通常用lorem ipsum text来做占位符,占位符就是占着位置的一些文字,没有实际意义. 为什么叫lorem ipsum text呢? 是因为lorem ipsum是古罗马西塞罗谚语 ...