c语言怎么编程dll,【C语言】编写的DLL注入工具
[C] 纯文本查看 复制代码// 参数类型
typedef struct _INJECTTHREAD_PARAM
{
FARPROC pFunc[3];
char szBuf[2][128];
} INJECTTHREAD_PARAM, *PINJECTTHREAD_PARAM;
// 此函数以代码形式注入目标进程
DWORD WINAPI InjectThreadProc(LPVOID param)
{
PINJECTTHREAD_PARAM pParam = (PINJECTTHREAD_PARAM)param;
HMODULE hModule;
FARPROC pFunc;
HANDLE hThread;
// 注入的代码里不能直接调用API函数
// LoadLibraryA(szDllPath)
hModule = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);
if (!hModule)
{
return 1;
}
// GetProcAddress(hModule, szFunc)
pFunc = ((PFGETPROCADDRESS)pParam->pFunc[1])(hModule, pParam->szBuf[1]);
if (!pFunc)
{
return 1;
}
// CreateThread()执行加载时要运行的函数, 不知道使用这种方式合不合适
hThread = ((PFCREATETHREAD)pParam->pFunc[2])(NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, NULL, 0, NULL);
return 0;
}
BOOL InjectDll(DWORD dwPID, LPCSTR szDllPath, LPCSTR szFunc)
{
HMODULE hModule;
INJECTTHREAD_PARAM param;
HANDLE hProcess;
HANDLE hThread;
LPVOID pRemoteBuf[2];
DWORD dwSize;
hModule = GetModuleHandleW(L"kernel32.dll");
memset(¶m, 0, sizeof(INJECTTHREAD_PARAM));
// 要进行代码注入, 就必需要把要调用参数先写入目标进程
param.pFunc[0] = GetProcAddress(hModule, "LoadLibraryA");
param.pFunc[1] = GetProcAddress(hModule, "GetProcAddress");
param.pFunc[2] = GetProcAddress(hModule, "CreateThread");
strcpy_s(param.szBuf[0], strlen(szDllPath) + 1, szDllPath);
strcpy_s(param.szBuf[1], strlen(szFunc) + 1, szFunc);
if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
{
return FALSE;
}
// 判断环境
if (Is64BitProcess(GetCurrentProcess()) != Is64BitProcess(hProcess))
{
MessageBox(NULL, TEXT("打开动态链接库文件失败"), TEXT("提示"), MB_ICONERROR | MB_OK);
CloseHandle(hProcess);
return FALSE;
}
dwSize = sizeof(INJECTTHREAD_PARAM);
if (!(pRemoteBuf[0] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE)))
{
return FALSE;
}
// 将全部的参数作为结构体整个写入
if (!WriteProcessMemory(hProcess, pRemoteBuf[0], (LPVOID)¶m, dwSize, NULL))
{
return FALSE;
}
dwSize = (DWORD)InjectDll - (DWORD)InjectThreadProc;
if (!(pRemoteBuf[1] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)))
{
return FALSE;
}
// 再将InjectThreadProc的函数代码写入目标进程
if (!WriteProcessMemory(hProcess, pRemoteBuf[1], (LPVOID)InjectThreadProc, dwSize, NULL))
{
return FALSE;
}
// pRemoteBuf[1]就是InjectThreadProc在目标进程中的起始地址, 已经被写入, pRemoteBuf[0]则是写入的参数地址
if (!(hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuf[1], pRemoteBuf[0], 0, NULL)))
{
return FALSE;
}
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, pRemoteBuf[0], 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pRemoteBuf[1], 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
[align=left]
}
c语言怎么编程dll,【C语言】编写的DLL注入工具相关推荐
- c语言 简单编程题,c语言简单编程练习题.doc
c语言简单编程练习题 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 c语言简单编程练习题 然后输出相应的字符. #include #inc ...
- 企业c语言的编程风格,c语言优秀编程风格.docx
作为一个初学者如何具有良好的程序设计风格呢?我想引用一个关于初学者请教编程大师 的故事让读者自己去领悟. 有一位编程大师,他写非结构化的程序, 一位初学者刻意模仿他, 也写非结构化的程序.当 他让大师 ...
- c语言高效编程pdf,C语言高效编程的四大绝招
编写高效简洁的C语言代码,是许多软件工程师追求的目标.本文就是针对编程工作中的一些体会和经验做相关的阐述. 第一招:以空间换时间 计算机程序中的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考 ...
- c语言面向对象编程显示,c语言面向对象编程
场景:C语言面向对象编程(6):配置文件解析 C语言面向对象编程(六):配置文件解析 在实际项目中,经常会把软件的某些选项写入配置文件. Windows 平台上的 INI 文件格式简单易用,本篇文章利 ...
- c语言cfree编程步骤,C语言初探之利用C-Free编写C语言
在对二进制.十进制.八进制和十六进制的学习以及对C语言输入框架学习的理解后,相信不少朋友都想试试手编写下C语言,作为新手的话课课家笔者推荐大家使用C-Free来进行C语言的编写工作,下面笔者就介绍具体 ...
- c语言 万年历编程,用C语言如何编写“万年历”
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 8 G\?!^ ug1 ...
- c语言设计学生结构体,c语言程序设计编程题目:请 :编写完成对学生相关信息的要求:1.定义一个结构体类型student,其中包括三个成...
#include #include #define STU_NUM 10 /*宏定义学生的数量*/ struct student /*定义一个结构体用来存放学生学号.三门课成绩.总分及平均成绩*/ { ...
- c语言高级编程培训,C语言高级编程
Q:如何提问,能得到快速的解答? A: 1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用[]标出来,比如[第1周编程题在线测试的第1题]求解. 2)内容:内容上要把你不懂的地方说出 ...
- c语言程序编程线性方程,C语言编程求解线性方程.doc
C语言编程求解线性方程 本 科 专 业 学 年 论 文 题目:线性方程组求解方法比较 姓 名 郭 凤 专 业 计算机科学与技术专业 班 级 08级本科(2)班 指导教师 刘 晓 娜 完成日期:2010 ...
- 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf
维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...
最新文章
- 简单html图片轮播_web前端入门到实战:简单的图片轮播
- 又是华为!名校的差距太扎心!清华 2020 年毕业生就业质量报告出炉
- 英伟达Tesla P100超级计算机组件全面登陆PCIe总线
- 深度学习时代的目标检测算法综述
- 区分大小屏幕_第一个Python程序——在屏幕上输出文本
- TensorFlow2.0(九)--Keras实现基础卷积神经网络
- CSS 文本转换 text-transform属性
- 如何快速python入手_初学者怎么才能快速学会Python?
- Android 功耗(24)---功耗相关因子
- 英特尔核显驱动hd630_【惊喜提升】英特尔第十代Cometlake台式机处理器详解与简单评测...
- 上周Asp.net源码(11.5-11.10)免费下载列表
- python复杂网络库networkx:算法
- jfreeChart生成报表
- (七)设定目标:原理与方法
- java.io.ioexception 设备未就绪_AxisFault faultString: java.io.IOException: 设备未就绪。
- win10 c++调用pytorch模型
- 相对位置编码与绝对位置编码
- python计算对数收益率_为VNPY的K线序列管理工具ArrayManager增加对数收益率队列
- SwitchyOmega
- 关于补码1.0000的真值为什么是-1的解答