使用C++实现CE中的代码注入
1、关键函数VirtualAllocEx、WriteProcessMemory
2、实现步骤:先使用CE将代码插入写好,拷贝其机器码。之后使用WriteProcessMemory写入这些机器码
3、注意事项:对于拷贝过来的机器码,不能直接写入内存中,直接写的话需要将jmp的地址转换成机器码以后才能够写入:转换的公式可以参考如下连接:windows下的内联hook实现_其疾如风 其徐如林 侵略如火 不动如山-CSDN博客_内联hook
代码如下:实现的功能主要是修改植物大战僵尸中增加的阳光数
#include<Windows.h>
#include<TlHelp32.h>
#include<stdio.h>void HexToDB(DWORD DstAddr, DWORD srcAddr, PBYTE dArry); // 地址转机器码//获取模块基地址
void iDumpModule(LPCSTR szAppName, DWORD& bsAddr, DWORD PID);//写内存
void WriteNewMemory(DWORD bsAddr, DWORD offset, DWORD PID);void FindPID(DWORD& PID);void GetDebug();int main()
{ //PlantsVsZombies.exeLPCSTR szAppName = "PlantsVsZombies.exe";DWORD baAddr = 0;DWORD offset = 0x4BA45;DWORD PID = 0;GetDebug();FindPID(PID);iDumpModule(szAppName, baAddr, PID);WriteNewMemory(baAddr, offset, PID);printf("BaseAddr : %0x, PID: %d\n", baAddr, PID);getchar();return 0;
}void HexToDB(DWORD DstAddr, DWORD srcAddr, PBYTE dArry)
{//机器码 = 目标地址 - 原地址 - jcc指令长度DWORD addr = DstAddr - srcAddr - 0x5;dArry[0] = (BYTE)WORD(addr);dArry[1] = (BYTE)(WORD(addr) >> 8);dArry[2] = (BYTE)(DWORD(addr)>>16);dArry[3] = (BYTE)(DWORD(addr) >> 24);
}void WriteNewMemory(DWORD bsAddr, DWORD offset, DWORD PID)
{if (PID == 0 || bsAddr == 0){printf("传入的数据有误\n");return;}BYTE bNewCode[] = { 0xB8, 0x00, 0x10, 0x00, 0x00,0x01, 0x87, 0x78, 0x55, 0x00, 0x00, 0xE9, 0x3B, 0xBA, 0xBC, 0xFF };BYTE jmpCode[] = { 0xE9, 0x00, 0x00, 0x00, 0x00, 0x90 };BYTE VCode[4] = { 0x00, 0x00, 0x00, 0x00 };DWORD cbWrite = 0;DWORD dstAddr = bsAddr + offset;DWORD cBnum = sizeof(bNewCode) / sizeof(BYTE);DWORD cDnum = sizeof(jmpCode) / sizeof(BYTE);HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, PID);if (hProcess == 0){printf("打开进程失败\n");return;}LPVOID lpAddr = VirtualAllocEx(hProcess, 0, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (lpAddr == 0){printf("申请内存失败\n");goto end;}printf("lpAddr : %d, %0x\n", lpAddr, lpAddr);//起跳数据HexToDB((DWORD)lpAddr, dstAddr, VCode);jmpCode[1] = VCode[0];jmpCode[2] = VCode[1];jmpCode[3] = VCode[2];jmpCode[4] = VCode[3];//回跳数据HexToDB(dstAddr + cDnum + 1, (DWORD)lpAddr + cBnum - 4, VCode);for (int i = 0; i < 4; i++){bNewCode[cBnum - 4 + i] = VCode[i];}WriteProcessMemory(hProcess, lpAddr, bNewCode,sizeof(bNewCode)/sizeof(BYTE),&cbWrite);if (cbWrite == 0){printf("失败\n");goto end;}//堆空间代码WriteProcessMemory(hProcess, lpAddr, bNewCode,cBnum, NULL);//起跳代码WriteProcessMemory(hProcess, (LPVOID)dstAddr, jmpCode,sizeof(jmpCode) / sizeof(BYTE), NULL);end:CloseHandle(hProcess);return;
}void iDumpModule(LPCSTR szAppName, DWORD& bsAddr, DWORD PID)
{MODULEENTRY32 md32;HANDLE hSanp;md32.dwSize = sizeof(md32);hSanp = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);if (hSanp == NULL){printf("失败\n");return;}BOOL bRet = Module32First(hSanp, &md32);int i = 0;while (1){i++;if (lstrcmp(szAppName, md32.szModule) == 0){bsAddr = (DWORD)md32.modBaseAddr;break;}Module32Next(hSanp, &md32);if (GetLastError() == ERROR_NO_MORE_FILES){break;}}CloseHandle(hSanp);
}void FindPID(DWORD& PID)
{DWORD iPID = 0;HWND hMain = FindWindow(NULL, "Plants vs. Zombies GOTY ");if (!IsWindow(hMain)){printf("查找窗口失败\n");return;}GetWindowThreadProcessId(hMain, &iPID);if (iPID == 0){printf("获取PID失败\n");return;}PID = iPID;
}void GetDebug()
{TOKEN_PRIVILEGES tkp;HANDLE hToken;OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY |TOKEN_ADJUST_PRIVILEGES, &hToken);LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);tkp.PrivilegeCount = 1;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE,&tkp, 0, NULL, NULL);}
使用C++实现CE中的代码注入相关推荐
- 【Unity框架】XLua中Lua代码注入C#代码操作
文章目录 一.干净的基于XLua的框架下载地址 二.使用步骤 1.操作步骤 2.脚本添加 1.在游戏逻辑代码文件夹创建脚本HotFixTest.cs: 2.在游戏脚本管理代码文件夹创建脚本HotFix ...
- iOS应用代码注入防护
在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能.代码健壮相关的问题,我们有时还需要考虑到应用安全的问题. 那么应用安全的问题涉及到很多方面.比如防止静态分析的,代码混淆.逻辑混淆:防 ...
- proxy aspectj_使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍
proxy aspectj 静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助. 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除. 代码注入 ...
- 使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍
静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助. 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除. 代码注入对于处理涉及整个应用程序的问 ...
- Qt:Windows编程—代码注入
前言 这里所说的代码注入和上篇的DLL注入有类似之处.DLL文件的注入与卸载在上篇中都完成了,整个注入与卸载的过程其实就是让远程线程执行一次LoadLibrary函数或者FreeLibrary函数 ...
- iOS应用代码注入防护 1
在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能.代码健壮相关的问题,我们有时还需要考虑到应用安全的问题. 那么应用安全的问题涉及到很多方面.比如防止静态分析的,代码混淆.逻辑混淆:防 ...
- 用户领域 API 监控和代码注入检测
原文地址:Userland API Monitoring and Code Injection Detection 原文作者:dtm 译文出自:掘金翻译计划 本文永久链接:github.com/xit ...
- iOS开发技术之应用代码注入防护
1.介绍 在应用开发过程中,我们需要考虑到应用安全的问题.而应用安全的问题涉及到很多方面的内容,随着iOS系统的不断更新,我们需要在防护的手段上发生一些改变. 如下所示: [1]防止静态分析:代码混淆 ...
- 【转】内存中找怪物之代码注入篇
导读: 网上看了N多的文章,对内存中找怪极少有详细介绍,大多数人搞定人物内存中的有关参数后,止步于内存中的找怪.人物只有一个,而怪有各种各样的,数量又同时出现多个,比在内存中找人物坐标难度要大得多. ...
最新文章
- Meet new Sentinel Go committers!
- 接口测试工具postman(六)添加变量(参数化)
- JsonException: Max allowed object depth reached while trying to export from type System.Single
- elasticsearch之Recovery
- python小细节之else
- P2446 [SDOI2010]大陆争霸
- Linux 恢复rm -rf命令所删除的达梦数据文件
- 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
- 如何按距离排序 php,php做附近的人,根据距离由近到远进行排序
- Myeclipse中web project各种常见错误及解决方法(持续更新)
- Servlet chapter 1
- 云南昆明美容美发店务管理软件
- 青橙N1云OS系统刷机
- 草稿草稿草稿22.10.9 “yuyu“ IO进程线程
- 怎么下载高清无水印的视频号作品?视频号下载要用什么工具?1分钟解决微信视频号下载
- 一个故事带你看透HTTPS(上)
- vivado安装步骤
- android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。
- MFC VS2010 Open CASCADE新建自己的工程
- 原型模式——java实现原型模式的几种写法