#include <iostream>
#include <Windows.h>
#include <TlHelp32.h> using namespace std; /*
APC注入条件:
目标线程处于可唤醒状态
如使用以下API时就处于可唤醒状态
SleepEx, SignalObjectAndWait, WaitForSingleObjectEx, WaitForMultipleObjectsEx,MsgWaitForMultipleObjectsEx
参数dwPid默认为0,表示自动创建目标进程并立刻生效注入,否则,注入现有目标,等待目标唤醒时执行APC回调
*/
BOOL APCInject(char *dllUrl,DWORD dwPid=,char *exeUrl=NULL); int main(void)
{ cout << APCInject("c:\\desktop\\test.dll",) << endl;
return ;
} BOOL APCInject(char *dllUrl,DWORD dwPid,char *exeUrl)
{
HANDLE hSnap=NULL,hPro=NULL,hThr=NULL;
BOOL bOk = FALSE;
LPVOID hVir = NULL;
THREADENTRY32 te = {}; if (!dwPid)
{
STARTUPINFO wi = {};
PROCESS_INFORMATION pi = {}; wi.cb = sizeof(wi);
CreateProcessA("c:\\desktop\\123.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&wi,&pi);
hPro = pi.hProcess;
hThr = pi.hThread;
} else {
te.dwSize = sizeof(te);
hPro = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);
if (!hPro)
return FALSE;
hSnap = CreateToolhelp32Snapshot(,dwPid);
bOk = Thread32First(hSnap,&te);
while (bOk)
{
if (te.th32OwnerProcessID == dwPid)
{
hThr = OpenThread(THREAD_ALL_ACCESS,FALSE,te.th32ThreadID);
break;
} bOk = Thread32Next(hSnap,&te);
}
CloseHandle(hSnap);
} if (!hThr)
return FALSE;
hVir = VirtualAllocEx(hPro,NULL,strlen(dllUrl)+,MEM_COMMIT,PAGE_READWRITE);
if (!hVir)
return FALSE;
if (!WriteProcessMemory(hPro,hVir,dllUrl,strlen(dllUrl)+,NULL))
return FALSE;
CloseHandle(hPro);
if (QueueUserAPC((PAPCFUNC)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"),hThr,(DWORD)hVir))
{
if (!dwPid)
{
ResumeThread(hThr);
CloseHandle(hThr);
}
return TRUE;
}
CloseHandle(hThr);
return FALSE;
}

APCInject的更多相关文章

  1. 安全之路 —— 利用APC队列实现跨进程注入

    简介 在之前的文章中笔者曾经为大家介绍过使用CreateRemoteThread函数来实现远程线程注入(链接),毫无疑问最经典的注入方式,但也因为如此,这种方式到今天已经几乎被所有安全软件所防御.所以 ...

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

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

  3. 注入 - Ring3 APC注入

    系统产生一个软中断,当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数,利用QueueUserAPC()这个API,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的, 1.根据进 ...

  4. Inject-APC (Ring3)

    1 // APCInject.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include "APCInjec ...

随机推荐

  1. Qt学习之网络编程(二)

    UDP协议 UDP协议(用户数据报协议)是一种简单轻量级.不可靠.面向数据报.无连接的传输层协议.之后我们会介绍TCP协议,相对于UDP,TCP是一种可靠的.有连接的协议:既然这样我们就用TCP不就好 ...

  2. Nginx实战(三) 日志配置与切割

    访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义.通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息. Nginx中访问日志相关指令主要有两条,一条是 ...

  3. vue——运行一个项目

    教程:https://segmentfault.com/a/1190000009871504 启动:cnpm run dev

  4. JNA-调用win32 Dll文件

    1. 描述备注 参考地址1 JNA示例代码 1.1 JNA工作原理 JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数. 原来使用JNI,你必须 ...

  5. ElasticSearch入门-增删改查(java api)

    1.增加Index PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(g ...

  6. json解析数组类型的数据

    //微信里一个检测是否有发送模版消息的权限的方法//此处的openid代表的微信用户openid,templateId代表的是模版消息idpublic boolean checkIsSendTempM ...

  7. Java并发基础:线程的创建

    线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Ca ...

  8. 锁丶threading.local丶线程池丶生产者消费者模型

    一丶锁 线程安全: 线程安全能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据,可以由多个线程存取,但是同一时刻只能有一个线程进行存取. import threading v = ...

  9. php 出现空格,换行原因

    1.空格:转换成utf-8无bom格式 2.空格:<?php ?>标签结尾有中文,英文空格 3.换行,一个文件中有多个<?php ?>标签,标签间隔中有换行符合

  10. <script>, <script async>, <script defer> 三种标签的区别

    <script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...