CreateProcess启动游戏注入DLL
先来段简单的,亲测成功!!!
// test2.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <Windows.h>
#include<iostream>
#include<stdlib.h>using namespace std;int _tmain(int argc, _TCHAR* argv[])
{TCHAR szDll[] = TEXT("d:\\zlib1.dll"); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; TCHAR szCommandLine[MAX_PATH] = TEXT("D:\\软件目录\\dll查看器\\ViewApi.exe"); CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); LPVOID Param = VirtualAllocEx(pi.hProcess, NULL, MAX_PATH, MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(pi.hProcess, Param, (LPVOID)szDll, _tcslen(szDll)*2+sizeof(TCHAR), NULL); HANDLE hThread = CreateRemoteThread(pi.hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryW,Param, CREATE_SUSPENDED, NULL); ResumeThread(pi.hThread); if (hThread) { ResumeThread(hThread); WaitForSingleObject(hThread, INFINITE); } return 0;
}
==============================================================================================
一、DLL注入技术的用途
DLL注入技术的用途是很广泛的,这主要体现在:
1、假如你要操纵的对象涉及的数据不在进程内;
2、你想对目标进程中的函数进行拦截(甚至API函数,嘿嘿,由此编写个拦截timeGettime的过程,变速齿轮不就出来了么?改天我试试),比如对它所属窗口进行子类化。
3、你想编写一些函数用于增强或增加目标进程功能,比如可以给目标进程的某个窗口插入个消息循环增加其响应能力。(Mfc Windows程序设计称之为消息泵)。
4、隐藏自己的程序,很多恶意程序都是这样做的,即使你将恶意程序的进程结束掉也毫无意义了,因为它自己已经插入到很多进程中去了,唯一有效的办法只有注销windows.。如果你是个爱搞破坏的人就更应该掌握该技术了,不但可以利用该技术实现隐藏自己的进程,还可以破坏某个目标进程。因为将破坏代码插入到目标进程进行破坏的话简直易如反掌。不信试试?:(
二、实现DLL注入的另一种方法
- // 监视程序和DLL共用的结构体
- #pragma pack (push ,1) // 保证下面的结构体采用BYTE对齐(必须)
- typedef struct
- {
- BYTE int_PUSHAD; // pushad 0x60
- BYTE int_PUSH; // push &szDLL 0x68
- DWORD push_Value; // &szDLL = "ApiSpy.dll"的path
- BYTE int_MOVEAX; // move eax &LoadLibrary 0xB8
- DWORD eax_Value; // &LoadLibrary
- WORD call_eax; // call eax 0xD0FF(FF D0) (LoadLibrary("ApiSpy.dll");
- BYTE jmp_MOVEAX; // move eax &ReplaceOldCode 0xB8
- DWORD jmp_Value; // JMP的参数
- WORD jmp_eax; // jmp eax 0xE0FF(FF E0) jmp ReplaceOldCode;
- char szDLL[MAX_PATH]; // "ApiSpy.dll"的FullPath
- }INJECT_LOADLIBRARY_CODE, *LPINJECT_CODE;
- #pragma pack (pop , 1)
上面结构体的代码为汇编代码,对应的汇编为:
- pushad
- push szDll
- mov eax, &LoadLibraryA
- call eax // 实现调用LoadLibrary(szDll)的代码
- mov eax, oldentry
- jmp eax // 实现在LoadLibrary运行完后, 跳至目标进程的入口继续运行
- // FileMaping的结构体
- typedef struct
- {
- LPBYTE lpEntryPoint; // 目标进程的入口地址
- BYTE oldcode[sizeof(INJECT_CODE)]; // 目标进程的代码保存
- }SPY_MEM_SHARE, * LPSPY_MEM_SHARE;
准备工作:
第一步:用CreateProcess(CREATE_SUSPENDED)启动目标进程。
- CreateProcessA(0, szRunFile, 0, 0, FALSE, CREATE_SUSPENDED
- 0, NULL, &stInfo,
- &m_proInfo) ;
用CreateProcess启动一个暂停的目标进程;
找到目标进程的入口点,函数如下
第二步:找到目标进程的入口,用ImageHlp中的函数可以实现。
- pEntryPoint = GetExeEntryPoint(szRunFile);
- LPBYTE GetExeEntryPoint(char *filename)
- {
- PIMAGE_NT_HEADERS pNTHeader;
- DWORD pEntryPoint;
- PLOADED_IMAGE pImage;
- pImage = ImageLoad(filename, NULL);
- if(pImage == NULL)
- return NULL;
- pNTHeader = pImage->FileHeader;
- pEntryPoint = pNTHeader->OptionalHeader.AddressOfEntryPoint + pNTHeader->OptionalHeader.ImageBase;
- ImageUnload(pImage);
- return (LPBYTE)pEntryPoint;
- }
// 创建FileMapping
- hMap = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
- PAGE_READWRITE, 0, sizeof(SPY_MEM_SHARE), “MyDllMapView”);
// 保存目标进程的代码
第三步:将目标进程入口的代码保存起来。
- LPSPY_MEM_SHARE lpMap = pMapViewOfFile(hMap, FILE_MAP_ALL_ACCESS,0, 0, 0);
- ReadProcessMemory(m_proInfo.hProcess, pEntryPoint,&lpMap->oldcode, sizeof(INJECT_CODE),&cBytesMoved);
- lpMap->lpEntryPoint = pEntryPoint;
// 第四步:在目标进程的入口写入LoadLibrary(MyDll)实现Dll的注入。
// 准备注入DLL的代码
- INJECT_CODE newCode;
- // 写入MyDll―――用全路径
- lstrcpy(newCode.szDLL, szMyDll);
- // 准备硬代码(汇编代码)
- newCode.int_PUSHAD = 0x60;
- newCode.int_PUSH = 0x68;
- newCode.int_MOVEAX = 0xB8;
- newCode.call_eax = 0xD0FF;
- newCode.jmp_MOVEAX = 0xB8;
- newCode.jmp_eax = 0xE0FF;
- newCode.eax_Value = (DWORD)&LoadLibrary;
- newCode.push_Value=(pEntryPoint + offsetof(INJECT_CODE,szDLL));
- // 将硬代码写入目标进程的入口
- // 修改内存属性
- DWORD dwNewFlg, dwOldFlg;
- dwNewFlg = PAGE_READWRITE;
- VirtualProtectEx(m_proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD), dwNewFlg, &dwOldFlg);
- WriteProcessMemory(m_proInfo.hProcess, pEntryPoint,&newCode, sizeof(newCode), NULL);//&dwWrited);
- VirtualProtectEx(proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD), dwOldFlg, &dwNewFlg);
- // 释放FileMaping 注意,不是Closehandle(hMap)
- UnmapViewOfFile(lpMap);
// 继续目标进程的运行
第五步:用ResumeThread运行目标进程。
- ResumeThread(m_proInfo.hThread);
在监视进程中就结束了自己的任务,剩下的第6,7,8步就需要在Dll的DllMain中进行配合。
DLL中用来保存数据的结构体
- typedef struct
- {
- DWORD lpEntryPoint;
- DWORD OldAddr;
- DWORD OldCode[4];
- }JMP_CODE,* LPJMP_CODE;
- static JMP_CODE _lpCode;
// 在DllMain的DLL_PROCESS_ATTACH中调用InitApiSpy函数
// 在该函数中实现第6,7,8步
第六步:目标进程就运行了LoadLibrary(MyDll),实现DLL的注入。
- int WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
- {
- switch(dwReason)
- {
- case DLL_PROCESS_ATTACH:
- return InitApiSpy();
- ……
// InitApiSpy函数的实现
- BOOL WINAPI InitApiSpy()
- {
- HANDLE hMap;
- LPSPY_MEM_SHARE lpMem;
- DWORD dwSize;
- BOOL rc;
- BYTE* lpByte;
- // 取得FileMapping的句柄
- hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, “MyDllMapView”);
- if(hMap)
- {
- lpMem = (LPSPY_MEM_SHARE)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0, 0, 0);
- if(lpMem)
- {
第七步:目标进程运行完LoadLibrary(MyDll)后,将原来的代码写回目标进程的入口。
- BOOL WINAPI InitApiSpy()
- {
- HANDLE hMap;
- LPSPY_MEM_SHARE lpMem;
- DWORD dwSize;
- BOOL rc;
- BYTE* lpByte;
- // 取得FileMapping的句柄
- hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, “MyDllMapView”);
- if(hMap)
- {
- lpMem = (LPSPY_MEM_SHARE)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0, 0, 0);
- if(lpMem)
- {
- // 恢复目标进程的入口代码
- // 得到mov eax, value代码的地址
- _lpCode.OldAddr = (DWORD)((BYTE*)lpMem->lpEntryPoint + offsetof(INJECT_CODE, jmp_MOVEAX));
- _lpCode.lpEntryPoint = (DWORD)lpMem->lpEntryPoint;
- // 保存LoadLibrary()后面的代码
- memcpy(&_lpCode.OldCode, (BYTE*)lpMem->oldcode + offsetof(INJECT_CODE, jmp_MOVEAX), 2*sizeof(DWORD));
- // 恢复目标进程的入口代码
- rc = WriteProcessMemory(GetCurrentProcess(), lpMem->lpEntryPoint, lpMem->oldcode, sizeof(INJECT_CODE), &dwSize);
- lpByte = (BYTE*)lpMem->lpEntryPoint + offsetof(INJECT_CODE, jmp_MOVEAX);
- UnmapViewOfFile(lpMem);
- }
- CloseHandle(hMap);
- }
- // 实现自己Dll的其他功能,如导入表的替换
- // ……
- // 将LoadLibrary后面的代码写为转入处理程序中
- // 指令为:mov eax, objAddress
- // jmp eax
- {
- BYTE* lpMovEax;
- DWORD* lpMovEaxValu;
- WORD* lpJmp;
- DWORD fNew, fOld;
- fNew = PAGE_READWRITE;
- lpMovEax = lpByte;
- VirtualProtect(lpMovEax, 2*sizeof(DWORD), fNew, &fOld);
- *lpMovEax = 0xB8;
- lpMovEaxValu = (DWORD*)(lpMovEax + 1);
- *lpMovEaxValu = (DWORD)&DoJmpEntryPoint;
- lpJmp = (WORD*)(lpMovEax + 5);
- *lpJmp = 0xE0FF; // (FF E0)
- VirtualProtect(lpMovEax, 2*sizeof(DWORD), fOld, &fNew);
- }
- return TRUE;
- }
- // 转入处理程序
- DWORD* lpMovEax;
- DWORD fNew, fOld;
- void __declspec(naked) DoJmpEntryPoint ()
- {
- // 恢复LoadLibrary后面的代码
- _gfNew = PAGE_READWRITE;
- _glpMovEax = (DWORD*)_lpCode.OldAddr;
- VirtualProtect(_glpMovEax, 2*sizeof(DWORD), _gfNew, &_gfOld);
- *_glpMovEax = _lpCode.OldCode[0];
- *(_glpMovEax + 1) = _lpCode.OldCode[1];
- VirtualProtect(_glpMovEax, 2*sizeof(DWORD), _gfOld, &_gfNew);
- //第八步:目标进程Jmp至原来的入口,继续运行程序。
- // 跳至目标代码的入口
- _asm popad
- _asm jmp _lpCode.lpEntryPoint
- }
第八步:目标进程Jmp至原来的入口,继续运行程序。
- // 跳至目标代码的入口
- _asm popad
- _asm jmp _lpCode.lpEntryPoint
- }
这样就实现了原来的目标,将DLL的注入放在目标进程的入口运行,实现了目标进程运行之前运行我们的注入Dll的功能。
CreateProcess启动游戏注入DLL相关推荐
- c语言游戏注入dll能干什么,教大家写一个远程线程的DLL注入,其实还是蛮简单的……………………...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 然后新建一个win32 application 的工程 新建c++ source file 写入: #include #include int WINAP ...
- windows 启动exe程序前注入dll(c++)
//需要的头文件: #include <iostream> #include <stdarg.h> #include <Windows.h> #include &l ...
- 后渗透篇:劫持技术(lpk.dll劫持游戏注入【Win7 实例】)
当你的才华 还撑不起你的野心时 那你就应该静下心来学习 lpk.dll劫持游戏注入 由于 输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL文件.首先会尝试从当前程序所在的目 ...
- 无法启动游戏 计算机丢失,win7系统无法启动游戏提示缺少vcomp100.dll文件怎么办...
许多游戏玩家喜欢在雨林木风win7系统电脑安装各种游戏软件,但是在运行过程中总会遇到一些问题.最近有位用户在win7系统下运行三国无双系列游戏,提示"无法启动此程序,因为计算机中丢失vcom ...
- 编程实现木马的ActiveX启动和注入IE的启动方式
木马的启动方式有很多种,现在比较流行的就是注册为系统服务启动(只适合Windows 2000以上的系统),或者以驱动的方式启动.不过,最近以ActiveX方式启动又比较流行了,因为它适合Windows ...
- 驱动无模块注入dll
文章目录 实现效果 三环无模块注入的方案 反射型dll注入方式的改进 零环无模块注入方案 petoshellcode 无模块注入流程 实现代码 Xenos注入方案研究 IT_MMap注入 IT_Thr ...
- visual studio 怎么生成coredump文件_玩游戏丢失dll文件别着急 认识这些就妥了
点击上方电脑爱好者关注我们 装好游戏之后,一打开就跳出各种报错信息的情况小伙伴一定见过,其中缺少各种dll文件最常见.小伙伴们一定奇怪,用得好好的电脑,怎么会缺文件呢?为啥其他游戏/应用就没事呢?其实 ...
- dll中使用dialogbox_玩游戏丢失dll文件别着急 认识这些就妥了
点击上方电脑爱好者关注我们 装好游戏之后,一打开就跳出各种报错信息的情况小伙伴一定见过,其中缺少各种dll文件最常见.小伙伴们一定奇怪,用得好好的电脑,怎么会缺文件呢?为啥其他游戏/应用就没事呢?其实 ...
- 易语言大漠实现辅助一键启动游戏
我们要实现一键登录游戏, 首先要通过易语言启动您系统里的游戏,这里主要使用易语言的 运行()和 执行()命令,但直接使用是无法启动游戏的,所有我们可以采用创建进程,运行,执行,API封装等等. 易语言 ...
最新文章
- Python集合之set()使用方法详解
- 关于FluentNhibernate数据库连接配置,请教
- kafka mysql安装与配置_Mac环境canal+mysql+kafka的安装及使用
- SpringBoot+Mybatis加载Mapper.xml文件的两种方式
- [Leetcode][第112题][JAVA][路径总和][递归][队列]
- 带你认识Flink容错机制的两大方面:作业执行和守护进程
- c++ 游戏_C/C++编程笔记:C语言实现连连看游戏,项目源码分享
- 石头剪刀布代码android,微信小程序源码解说:石头剪刀布(附源码下载)
- 最简单的PHP MVC留言本实例(二)
- 在Java中通过线程池实现异步执行
- vce 题库导入_Visual CertExam(VCE)试题制作教程.pdf
- 智能安防及视频监控系统
- JUCE框架教程(3)—— Component ClassGraphics入门
- 一图搞懂梯度、散度、旋度、Jacobian、Hessian、Laplacian之间的关系
- 起底身份倒卖产业:那些被公开叫卖的人生
- 打造超级IP,你真悟错了道!
- 异常:java.lang.ArithmeticException
- 【互补松弛定理】12.7.16省队集训
- 视频特效剪辑小技巧,给每个视频添加反相特效
- Stata:面板数据,一般加上个体固定效应和时间固定效应