[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注入工具相关推荐

  1. c语言 简单编程题,c语言简单编程练习题.doc

    c语言简单编程练习题 精品文档 2016全新精品资料-全新公文范文-全程指导写作 –独家原创 PAGE1 / NUMPAGES1 c语言简单编程练习题 然后输出相应的字符. #include #inc ...

  2. 企业c语言的编程风格,c语言优秀编程风格.docx

    作为一个初学者如何具有良好的程序设计风格呢?我想引用一个关于初学者请教编程大师 的故事让读者自己去领悟. 有一位编程大师,他写非结构化的程序, 一位初学者刻意模仿他, 也写非结构化的程序.当 他让大师 ...

  3. c语言高效编程pdf,C语言高效编程的四大绝招

    编写高效简洁的C语言代码,是许多软件工程师追求的目标.本文就是针对编程工作中的一些体会和经验做相关的阐述. 第一招:以空间换时间 计算机程序中的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考 ...

  4. c语言面向对象编程显示,c语言面向对象编程

    场景:C语言面向对象编程(6):配置文件解析 C语言面向对象编程(六):配置文件解析 在实际项目中,经常会把软件的某些选项写入配置文件. Windows 平台上的 INI 文件格式简单易用,本篇文章利 ...

  5. c语言cfree编程步骤,C语言初探之利用C-Free编写C语言

    在对二进制.十进制.八进制和十六进制的学习以及对C语言输入框架学习的理解后,相信不少朋友都想试试手编写下C语言,作为新手的话课课家笔者推荐大家使用C-Free来进行C语言的编写工作,下面笔者就介绍具体 ...

  6. c语言 万年历编程,用C语言如何编写“万年历”

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 8 G\?!^ ug1 ...

  7. c语言设计学生结构体,c语言程序设计编程题目:请 :编写完成对学生相关信息的要求:1.定义一个结构体类型student,其中包括三个成...

    #include #include #define STU_NUM 10 /*宏定义学生的数量*/ struct student /*定义一个结构体用来存放学生学号.三门课成绩.总分及平均成绩*/ { ...

  8. c语言高级编程培训,C语言高级编程

    Q:如何提问,能得到快速的解答? A: 1)标题:撰写标题时,要注意把要问的问题的出处和核心词写出来,最好用[]标出来,比如[第1周编程题在线测试的第1题]求解. 2)内容:内容上要把你不懂的地方说出 ...

  9. c语言程序编程线性方程,C语言编程求解线性方程.doc

    C语言编程求解线性方程 本 科 专 业 学 年 论 文 题目:线性方程组求解方法比较 姓 名 郭 凤 专 业 计算机科学与技术专业 班 级 08级本科(2)班 指导教师 刘 晓 娜 完成日期:2010 ...

  10. 汇编c语言混合编程pdf,C语言及汇编语言混合编程的方法.pdf

    维普资讯 1993矩 化 工 电 子 计 算 第 2期 C语言与汇编语言混合编程的方法 f/1) (南京犬李葛于如丽顶吾学系) 摘 要 本文通过实例阐述了当前较为漉行的两种c语盲 (Microsoft ...

最新文章

  1. 简单html图片轮播_web前端入门到实战:简单的图片轮播
  2. 又是华为!名校的差距太扎心!清华 2020 年毕业生就业质量报告出炉
  3. 英伟达Tesla P100超级计算机组件全面登陆PCIe总线
  4. 深度学习时代的目标检测算法综述
  5. 区分大小屏幕_第一个Python程序——在屏幕上输出文本
  6. TensorFlow2.0(九)--Keras实现基础卷积神经网络
  7. CSS 文本转换 text-transform属性
  8. 如何快速python入手_初学者怎么才能快速学会Python?
  9. Android 功耗(24)---功耗相关因子
  10. 英特尔核显驱动hd630_【惊喜提升】英特尔第十代Cometlake台式机处理器详解与简单评测...
  11. 上周Asp.net源码(11.5-11.10)免费下载列表
  12. python复杂网络库networkx:算法
  13. jfreeChart生成报表
  14. (七)设定目标:原理与方法
  15. java.io.ioexception 设备未就绪_AxisFault faultString: java.io.IOException: 设备未就绪。
  16. win10 c++调用pytorch模型
  17. 相对位置编码与绝对位置编码
  18. python计算对数收益率_为VNPY的K线序列管理工具ArrayManager增加对数收益率队列
  19. SwitchyOmega
  20. 关于补码1.0000的真值为什么是-1的解答

热门文章

  1. R-FCN/Faster-rcnn使用snapshot继续训练
  2. Windows下VS2013 C++编译测试faster-rcnn
  3. 关于Qt的三种协议以及是否收费
  4. 有关概率图模型中的D-Seperation的理解,附cousera例题解读
  5. 【加法笔记系列】逻辑电路的实现
  6. Oracle 10g数据库基础之基本查询语句-中-函数
  7. 【java读书笔记】——java的异常处理
  8. 浅析 Linux 初始化 init 系统: UpStart
  9. 故障排查:是什么 导致了客户端批量心跳超时掉线
  10. (转)ASIHTTPRequest 详解, http 请求终结者