前言

​ 这里所说的代码注入和上篇的DLL注入有类似之处。DLL文件的注入与卸载在上篇中都完成了,整个注入与卸载的过程其实就是让远程线程执行一次LoadLibrary函数或者FreeLibrary函数远程线程装载或者卸载一个DLL文件,通过dllMain()调用DLL中具体功能代码,这样注入DLL以后就可以让DLL做很多事情了。

​ 是否可以不依赖DLL文件直接向目标进程写入要执行的代码,完成特定的功能呢?当然是可以的。这节我们就来实现代码注入到指定的进程中。

代码注入思路

​ 要在目标进程中完成一定的特定功能,就需要使用相关的API函数,不同的API函数实现在不同的DLL中。Kernel32.dll文件在每个进程中的地址是相同的,但是并不代表其他的DLL文件在每个进程中的地址都是一样的。这样,在目标进程中调用每一个API函数时,必须使用LoadLibrary(或GetModuleHandle)函数和GetProcAddress函数动态导出用到的每个API函数必需的)。把想要使用的API函数及API函数所在的DLL文件都封装进一个结构体 (作为写的函数代码的参数)直接写入目标进程的空间中。直接把要在远程执行的代码也写入到目标进程的内存空间中,最后调用CreateRemoteThread函数即可将其运行。

界面效果

有图有真相!我们往QQ.exe进程中 注入代码




核心代码

选择注入的进程,这里主要是用到了进程遍历,可以参考 Qt:Windows编程—Qt实现进程管理 这篇博文。

封装的结构体

这个数据类型就是要传递 线程回调函数的参数,也就是我们注入的函数代码的参数。

#define STRLEN 20
typedef struct _mydata{// 4个不变函数的函数地址DWORD dwLoadLibrary;DWORD dwGetProcAddress;DWORD dwGetModuleFileName;DWORD dwGetModuleHandle;char user32dll[STRLEN]; // user32.dll 含有MessageBoxA函数char MessageBoxFun[STRLEN]; // "MessageBoxA" 字符串char msvcrtdll[STRLEN]; // MSVCRT.DLL 微软运行库 含有strcat函数char strcatFun[STRLEN]; // "strcat" 字符串char caption[STRLEN]; // 消息框标题 "Inject Code!"char content[MAX_PATH]; // 消息框内容
}MyData;

注入的代码

// 注入的可执行代码,执行弹框功能
DWORD WINAPI CodeFunc(LPVOID param)
{MyData* data = (MyData*)param;// 定义函数指针类型 方便下面的类型转换typedef HMODULE (__stdcall *MyLoadLibrary)(LPCSTR);typedef FARPROC (__stdcall *MyGetProcAddress)(HMODULE,LPCSTR);typedef DWORD (__stdcall *MyGetModuleFileName)(HMODULE,LPSTR,DWORD);typedef HMODULE (*MyGetModuleHandle)(LPCSTR);typedef int (__stdcall *MyMessageBox)(HWND,LPCSTR,LPCSTR,UINT);typedef char*(*Mystrcat)(char *dest, const char *src);// 获取函数地址MyLoadLibrary myLoadLibrary = (MyLoadLibrary)data->dwLoadLibrary;MyGetProcAddress myGetProcAddress = (MyGetProcAddress)data->dwGetProcAddress;MyGetModuleFileName myGetModuleFileName = (MyGetModuleFileName)data->dwGetModuleFileName;MyGetModuleHandle myGetModuleHandle = (MyGetModuleHandle)data->dwGetModuleHandle;// 所有用的函数,都需像下面一样 导出函数地址然后再使用,包括标准库函数也一样// 笔者刚开始就犯了一个错,直接使用sprintf、strcat 等函数,这样是不行!因为我们自己注入的代码,函数地址需要我们自己确定!HMODULE user32dll = myLoadLibrary(data->user32dll);HMODULE msvcrtdll = myGetModuleHandle(data->msvcrtdll);// msvcrt.dll 微软运行库,可直接获取MyMessageBox myMessageBox = (MyMessageBox)myGetProcAddress(user32dll,data->MessageBoxFun);Mystrcat mystrcat = (Mystrcat)myGetProcAddress(msvcrtdll,data->strcatFun);// 调用获取到的函数char curFile[MAX_PATH] = {0};myGetModuleFileName(NULL,curFile,MAX_PATH);mystrcat(data->content,curFile);myMessageBox(NULL, data->content ,data->caption, MB_OK);return 0;
}

注入代码操作

// 注入Code操作
void WorkerThread::injectCode()
{HANDLE targetProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_pId);if( targetProc == NULL ){qDebug() << "OpenProcess error";return;}MyData data = {0};strcpy(data.user32dll,"user32.dll");strcpy(data.msvcrtdll,"msvcrt.dll");strcpy(data.MessageBoxFun,"MessageBoxA");strcpy(data.strcatFun,"strcat");strcpy(data.caption,"Inject Code!");strcpy(data.content,"current process:");// 这里使用中文会乱码HMODULE module = GetModuleHandleA("kernel32.dll");data.dwLoadLibrary = (DWORD)GetProcAddress(module,"LoadLibraryA");data.dwGetProcAddress = (DWORD)GetProcAddress(module,"GetProcAddress");data.dwGetModuleFileName = (DWORD)GetProcAddress(module,"GetModuleFileNameA");data.dwGetModuleHandle = (DWORD)GetProcAddress(module,"GetModuleHandleA");int dataLen = sizeof(MyData);// 1.目标进程申请空间 存放data数据,也就是注入的 可执行代码函数 的参数LPVOID pData = VirtualAllocEx(targetProc,NULL,dataLen,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE );if( pData == NULL ){qDebug() << "VirtualAllocEx error 1";return;}int ret = WriteProcessMemory(targetProc,pData,&data,dataLen,NULL);if( ret == 0 ){qDebug() << "WriteProcessMemory error 1";return;}// 2.目标进程申请空间 存放CodeFunc可执行代码函数int codeLen = 0x4000; // 4 * 16^3 = 16KB足够了// 第5个参数,数据具有可执行权限LPVOID pCode = VirtualAllocEx(targetProc,NULL,codeLen,MEM_COMMIT,PAGE_EXECUTE_READWRITE );if( pCode == NULL ){qDebug() << "VirtualAllocEx error 2";return;}ret = WriteProcessMemory(targetProc,pCode,(LPCVOID)&CodeFunc,codeLen,NULL);if( ret == 0 ){qDebug() << "WriteProcessMemory error 2";return;}// 3.创建远程线程 执行可执行代码HANDLE tHandle = CreateRemoteThread(targetProc,NULL,NULL,(LPTHREAD_START_ROUTINE)pCode,pData,NULL,NULL);if(tHandle == NULL){qDebug() << "CreateRemoteThread error";return ;}qDebug() << "注入,wait ..." ;WaitForSingleObject(tHandle,INFINITY);CloseHandle(tHandle);CloseHandle(targetProc);qDebug() << "注入,finish ...";emit doInjectFinish();
}

完整代码

完整代码工程请在这里下载。

Qt:Windows编程—代码注入相关推荐

  1. Qt:Windows编程—DLL注入与卸载

    前言 这里说的DLL注入 是将我们指定的DLL注入到指定的进程中,DLL卸载也就是将指定进程中的DLL卸载下来.在Windows提供的API中有 CreateRemoteThread函数 见名知意 创 ...

  2. C/C++:Windows编程—代码实现IE保护模式的关闭和开启

    前言 最近项目有需求需要通过程序实现了IE保护模式的关闭,自己网上查了下,关于IE的很多设置都可以通过修改IE相关的注册表来实现的.这里我们只要熟悉注册表的操作就可以了. -------------- ...

  3. C/C++:Windows编程—代码获取本地所有网卡信息(网卡描述,IP地址,子网掩码,MAC地址)

    先看效果 看代码 使用 GetAdaptersInfo 函数获取网卡的所有信息. MSDN函数说明 https://docs.microsoft.com/en-us/windows/desktop/a ...

  4. C/C++:Windows编程—Hook IE浏览器实现URL拦截及更改(上)

    Hook IE浏览器实现URL拦截及更改(上) 前言+思路 笔者这里有个需求,针对IE浏览器 用户访问URL 做一个判断,是否为 限制访问的url,如果是 在另一个软件上给与警告提示.笔者在拿到这个需 ...

  5. Windows编程初步(一)

    第一节:安装帮助文档 使用C语言进行Windows开发,必然使用到WindowsSDK.Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集.里面提 ...

  6. Qt:Windows编程—Qt实现进程管理

    前言 继续学window编程,学呀学呀 学无止境,学到Windows进程相关API了.利用相关的API使用Qt写界面实现了一个简单的进程管理.主要用到 进程的创建.进程的枚举.线程的枚举.DLL的枚举 ...

  7. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为" ...

  8. 基于visual c++之windows核心编程代码分析(24)IO控制、内核通信

    我们在进行Windows编程的时候,经常需要进行IO控制与内核通信,我们来实现IO控制与内核通信.请见代码实现与注释讲解 驱动代码实现与分析 /* 头文件 */ #include <ntddk. ...

  9. Microsoft Windows MHTML脚本代码注入漏洞 (MS11-026) (CVE-2011-0096)

    MS11-026 1️⃣漏洞测试 2️⃣详细描述 3️⃣解决办法 1️⃣漏洞测试 2️⃣详细描述 Microsoft Windows是微软发布的非常流行的操作系统. Microsoft Windows ...

最新文章

  1. echarts柱状图间距调整_Excel每天学个统计图(1)-折线柱状图
  2. leetcode 449. Serialize and Deserialize BST | 449. 序列化和反序列化二叉搜索树(BST后序遍历性质)
  3. 2021中国新流量价值洞察报告
  4. 通过SQL直接插入、修改ArcGIS SDE空间表中的数据
  5. 大话设计模式-原型模式的浅复制与深复制
  6. spark笔记之Scala中的协变、逆变、非变
  7. Vijos P1786 质因数分解【质因数分解】
  8. 用PYTHON画谢尔宾斯基三角形(代码可复制)
  9. 用批处理的方式解压文件
  10. 如何开展分销渠道管理
  11. 取消唤醒计算机需要密码怎么设置密码,Win10唤醒睡眠时需要输入密码如何取消_win10系统取消唤醒密码的方法...
  12. linux系统发送短信,使用Linux发送短信
  13. ThinkPhp6+Vue智慧医疗后台管理系统
  14. 站点主机安全档案(转)
  15. 魂斗罗(CONTRA EVOLUTION):进化革命PC版
  16. java编写九宫格拼图游戏_九宫格拼图游戏
  17. echarts 设置平均线,警戒线markLine属性
  18. # 计算机科学导论习题见解(机械工业)
  19. 二、Vue2.0项目结构内容及配置解析
  20. 无线射频技术是什么技术 RFID技术与无线技术的区别

热门文章

  1. 学习生物信息的系列书籍
  2. python匿名函数调用_python中引用局部变量的匿名函数
  3. jquery 判断点击次数_jquery编程开发实现点击页面计算点击次数
  4. settimeout需要清除吗_前端20个真正灵魂拷问,前端初级到中级你还需要这个!
  5. STM32F407+CubeMX - 使用GPIO翻转+示波器测量函数的执行时间
  6. python交流群教学视频_自学 Python,视频教程和代码一看就懂,动手就废,应该这么学...
  7. 最新SSM完整模板(Spring+SpringMVC+MybatisPlus)
  8. sql 整改措施 注入_SQL注入入侵防范措施
  9. Web前端笔记-HTML加载SVG图片及简单修改
  10. 信息安全工程师笔记-综合知识冲刺(三)