dll注入源码
⑴ 求易语言dll注入呼出窗口源码,非模块
.版本 2
.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 返回值被忽略。
.子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
.子程序 mydll, , 公开
设置呼出窗口 ()
.子程序 设置呼出窗口
载入 (窗口1, , 真)
⑵ 易语言传奇世界dll注入器源码
把dll添加到图片或者声音资源
需要用到超级模块,然后输入法注入,注册热键(Home或者End),进游戏呼出。
热键.注册(_启动窗口_创建完毕(),&Home键,#子程序1)
写到文件(取特定目录(10)+“\XX.dll",#DLL)
写到文件(取特定目录(10)+“\Soudou.ime",#Shurufa)
子程序1
局部变量 bool
bool=(进程是否存在(“传奇世界私服.exe”)或 进程是否存在(“传奇世界私服.exe”)
⑶ 易语言怎么注入DLL吖
.版本
2
.子程序
_按钮1_被单击
钩子id
=
全局注入.安装钩子
(“你的dll全局路径.dll”,
游戏窗口的线程id)
.判断开始
(钩子id
≠
0)
信息框
(“注入成功”,
0,
“提示”)
.默认
信息框
(“注入成功”,
0,
“提示”)
.判断结束
.子程序
__启动窗口_将被销毁
全局注入.卸载钩子
()
‘用的是超级模块
⑷ 易语言dll怎么注入别的程序并运行
包括dll和启动两个方面
你这个很搞笑,上面说要dll,下面又说不要dll
如果你是想在目标程序中运行自己的代码的话,可以考虑远线程注入运行
方法具体是先在目标进程开辟内存页,然后将二进制(汇编)代码写入到该内存,再远程运行此代码即可
⑸ 易语言自动注入DLL源码
.版本 2
.支持库 eAPI
.支持库 spec
.支持库 iext
.支持库 shell
.程序集 窗口程序集1
.程序集变量 输入法句柄, 整数型
.子程序 __启动窗口_创建完毕
.局部变量 透明度, 整数型
.局部变量 进度条位置, 整数型
.判断开始 (进程是否存在 (“DNF.exe”))
_启动窗口.移动 (取屏幕宽度 () - (_启动窗口.宽度 + 7), 取屏幕高度 () - _启动窗口.高度 - 37, , )
.变量循环首 (1, 200, 3, 透明度)
设置窗口透明度 (取窗口句柄 (), 透明度)
_启动窗口.可视 = 真
延迟 (2)
.变量循环尾 ()
延时 (5000)
.变量循环首 (1, 100, 1, 进度条位置)
进度条1.位置 = 进度条位置
.如果真 (进度条1.位置 = 20)
透明标签1.标题 = “蝶恋花启动中...”
延时 (1000)
透明标签1.标题 = “蝶恋花更新中...”
注入 ()
.如果真结束
.如果真 (进度条1.位置 = 进度条1.最大位置)
透明标签1.标题 = “开始呼出...”
输入法激活 ()
.如果真结束
.如果真 (进度条1.位置 = 进度条1.最大位置)
透明标签1.标题 = “激活成功...”
延时 (2000)
透明度 = 200
特效.渐隐渐现 (取窗口句柄 (), 假, 5000)
延时 (500)
_启动窗口.可视 = 假
.如果真结束
延迟 (50)
.变量循环尾 ()
.默认
停止播放 ()
信息框 (“请到选择频道处开启本辅助”, 0, )
销毁 ()
.判断结束
.子程序 注入, , , dll文件和输入法需要的文件的写出
写到文件 (取特定目录 (10) + “\Sougoo.ime”, #Shurufa)
输入法句柄 = 输入法.安装 (取特定目录 (10) + “\Sougoo.ime”, “胡胡输入法”)
调试输出 (输入法句柄)
写到文件 (取特定目录 (10) + “\DNF星辰.dll”, #胡胡挂)
.如果 (输入法句柄 ≠ 0)
输入法.设置注入 (取特定目录 (10) + “\Sougoo.ime”, 取特定目录 (10) + “\DNF星辰.dll”)
.否则
透明标签1.标题 = “注入输入法失败....”
_启动窗口.销毁 ()
.如果结束
.子程序 输入法激活
.局部变量 bool, 逻辑型
bool = 进程是否存在 (“DNF.exe”)
.如果真 (bool)
输入法.激活 (取句柄2 (“DNF.exe”, , ), 输入法句柄)
超级延时 (1000, )
时钟1.时钟周期 = 2000
.如果真结束
.子程序 _时钟1_周期事件
.判断开始 (进程是否存在 (“DNF.exe”))
.默认
__启动窗口_将被销毁 ()
.判断结束
.子程序 __启动窗口_将被销毁
延时 (500)
终止进程 (“TXPlatform.exe”)
终止进程 (“TenSafe.exe”)
删除文件 (取特定目录 (10) + “\DNF星辰.dll”)
删除文件 (取特定目录 (10) + “\Sougoo.ime”)
输入法.卸载 (输入法句柄)
延时 (1000)
销毁 ()
.版本 2
.图片 Shurufa
.图片 胡胡挂
⑹ 求易语言钩子注入dll及home呼出源码
易语言钩子DLL注入源码及源码说明2010-04-06 13:52[所有要使用到的API]
.版本 2
.DLL命令 LoadLibraryA, 整数型,"kernel32.dll","LoadLibraryA"
.参数 lpLibFileName, 文本型
.DLL命令 SetWindowsHookExA, 整数型, "user32.dll", "SetWindowsHookExA", 公开, SetWindowsHookEx
.参数 钩子类型, 整数型, , idHook
.参数 回调函数地址, 整数型, , lpfn
.参数 实例句柄, 整数型, , hmod
.参数 线程ID, 整数型, , dwThreadId
.DLL命令 FreeLibrary, 整数型, "kernel32.dll", "FreeLibrary", , 释放指定的动态链接库,它们早先是用LoadLibrary ;API函数装载的 非零表示成功,零表示失败。会设置GetLastError
.参数 库句柄, 整数型, , hLibMole,要释放的一个库句柄,在VB里使用只能用这个函数释放那些由应用程序明确装载的DLL。对LoadLibrary的每一次调用都应该有一个对应的FreeLibrary调用;
.DLL命令 UnhookWindowsHookEx, 整数型, "user32.dll", "UnhookWindowsHookEx", , UnhookWindowsHookEx
.参数 钩子句柄, 整数型, , hHook
.DLL命令 CallNextHookEx, 整数型, "user32.dll", "CallNextHookEx", 公开, CallNextHookEx
.参数 钩子句柄, 整数型, , hHook
.参数 代码值, 整数型, , ncode
.参数 附加参数1, 整数型, , wParam
.参数 附加参数2, 整数型, 传址, lParam
.DLL命令 GetProcAddress, 整数型, "kernel32.dll", "GetProcAddress", , 取进程路径
.参数 模块句柄, 整数型, , hMole
.参数 进程名称, 文本型, , lpProcName
.DLL命令 GetCurrentThreadId, 整数型, "kernel32.dll", "GetCurrentThreadId"
.DLL命令 获取特别文件夹位置_, 整数型, "shell32.dll", "SHGetSpecialFolderLocation"
.参数 窗口句柄, 整数型, , hwndOwner
.参数 文件夹位置, 整数型, , nFolder
.参数 结构, 项目标识符列表_, 传址, pIdl
.DLL命令 从列表id取路径_, 整数型, "shell32.dll", "SHGetPathFromIDListA", , $(b)
.参数 结构指针, 整数型, , pIdl
.参数 路径, 文本型, 传址, pszPath
.DLL命令 CallWindowProcA, 整数型, "user32.dll", "CallWindowProcA"
.参数 动态调用代码, 字节集, , 一定要用本人编写的
.参数 子程序, 子程序指针, , 子程序指针
.参数 参数, 整数型, 数组, 为整数数组,参数1为成员1…类推;文本型和字节集型(自定义结构)为指针
.参数 参数数目, 整数型, , 一定要和参数数组相符,不然会出错
.参数 是否C调用, 整数型, , 真为cdecl调用方式,假为stdcall调用方式(即标准WINAPI方式)
[这里函数所有代码和一个自定义类型,API代码在左边]
.版本 2
.程序集 程序集1
.程序集变量 临时呼出热键, 整数型
.程序集变量 临时载入窗口, 窗口
.程序集变量 钩子模块句柄, 整数型, , "1000"
.程序集变量 钩子句柄, 整数型, , "1000"
.程序集变量 钩子IDx, 整数型
.程序集变量 x, 整数型
.程序集变量 钩子句柄1, 整数型
.程序集变量 temp目录, 文本型
.程序集变量 xxx, 整数型
.程序集变量 热键钩子句柄, 整数型
.程序集变量 第一次, 逻辑型
.子程序 调用_调用子程序, 整数型, 公开, 呼叫某个函数 可以传入无限个参数 返回函数返回值
.参数 子程序指针, 子程序指针, , 指定函数
.参数 参数, 整数型, 可空 数组, 指定参数 可以不写, 参数为数组 格式为 参数[1]=xxx 参数[2]=xxx 文本型或字节集请用 转换指针 格式2 加入成员(参数,xxx)
.局部变量 动态调用代码, 字节集
动态调用代码 = { 85, 139, 236, 86, 139, 117, 16, 141, 78, 255, 133, 201, 124, 21, 139, 69, 12, 141, 4, 136, 65, 139, 16, 137, 85, 16, 255, 117, 16, 131, 232, 4, 73, 117, 242, 255, 85, 8, 137, 69, 12, 139, 69, 20, 133, 192, 116, 13, 141, 4, 181, 0, 0, 0, 0, 137, 69, 16, 3, 101, 16, 139, 69, 12, 94, 93, 194, 16, 0 }
返回 (CallWindowProcA (动态调用代码, 子程序指针, 参数, 取数组成员数 (参数), 0))
.子程序 操作_取特定目录, 文本型, 公开, 取特定的目录(返回所要取的指定目录名 无效返回空)
.参数 欲获取目录类型, 整数型, 可空, 0我的桌面 1临时目录 5我的文档 6我的收藏夹 7我的启动 11我的开始菜单 20系统字体 36Windows安装目录 37系统目录 [99更多]
.局部变量 路径, 文本型
.局部变量 标示结构, 项目标识符列表_
.局部变量 目录类型, 整数型
.如果真 (欲获取目录类型 = 99)
输出调试文本 (“0我的桌面 2我的程序 5我的文档 6我的收藏夹 7我的启动 8我最近的文档 9我的发送到 11我的开始菜单 13我的音乐 14我的视频 16我的桌面 20系统字体 22开始菜单组 23程序组 24启动组 25桌面 31收藏夹 32我的浏览器临时目录 33我的Cookies 34我的历史记录 36Windows安装目录 37系统目录 38文件安装目录 39我的图片 40用户目录 41系统目录 46文档 47管理工具 48我的管理工具 53音乐 54图片 55视频”)
.如果真结束
.如果 (欲获取目录类型 = 1)
目录类型 = 34
.否则
目录类型 = 欲获取目录类型
.如果结束
获取特别文件夹位置_ (0, 目录类型, 标示结构)
路径 = 取空白文本 (255)
从列表id取路径_ (标示结构.结构大小, 路径)
.如果真 (路径 = “”)
返回 (“”)
.如果真结束
.如果真 (欲获取目录类型 = 1)
路径 = 子文本替换 (路径, “History”, “Temp”, , , 真)
.如果真结束
返回 (路径 + “\”)
.子程序 注入_安装钩子DLL, 整数型, 公开, DLL注入 返回0=失败 整数型 DLL接口(代码值,参数1,参数2)
.参数 线程ID, 整数型, , -1 全局钩子
.参数 DLL全名, 文本型, , DLL全名
.参数 DLL接口, 文本型, 可空, 默认 整数型 钩子接口(代码值,参数1,参数2)
.局部变量 临时变量, 整数型
.局部变量 目录, 文本型
.局部变量 窗口句柄, 整数型
.如果真 (是否为空 (DLL接口) = 真)
DLL接口 = “钩子接口”
.如果真结束
.如果真 (线程ID = 0)
返回 (0)
.如果真结束
.如果真 (线程ID = -1)
线程ID = 0
.如果真结束
钩子IDx = 钩子IDx + 1
钩子模块句柄 [钩子IDx] = LoadLibraryA (DLL全名)
钩子句柄 [钩子IDx] = SetWindowsHookExA (3, GetProcAddress (钩子模块句柄 [钩子IDx], DLL接口), 钩子模块句柄 [钩子IDx], 线程ID)
目录 = 操作_取特定目录 (1)
写配置项 (目录 + “ada.ini”, “ada”, “钩子句柄”, 到文本 (钩子句柄 [钩子IDx]))
输出调试文本 (钩子IDx, 钩子模块句柄 [钩子IDx], 钩子句柄 [钩子IDx])
返回 (钩子IDx)
.版本 2
.子程序 注入_卸载钩子DLL, 逻辑型, 公开
.参数 钩子ID, 整数型, 可空, 卸载所有时无效
.参数 卸载所有, 逻辑型, 可空
.局部变量 xx, 整数型
.如果真 (卸载所有)
.如果真 (钩子IDx > 0)
.计次循环首 (钩子IDx, xx)
.如果真 (钩子模块句柄 [xx] ≠ 0)
FreeLibrary (钩子模块句柄 [xx])
UnhookWindowsHookEx (钩子句柄 [xx])
.如果真结束
.计次循环尾 ()
.如果真结束
返回 (真)
.如果真结束
.如果真 (钩子ID > 0)
.如果真 (钩子模块句柄 [钩子ID] ≠ 0)
FreeLibrary (钩子模块句柄 [钩子ID])
UnhookWindowsHookEx (钩子句柄 [钩子ID])
返回 (真)
.如果真结束
.如果真结束
返回 (假)
.子程序 注入_初始化钩子DLL, 整数型, 公开, DLL用.
.参数 代码值, 整数型
.参数 参数1, 整数型
.参数 参数2, 整数型
.参数 初始, 子程序指针
.局部变量 xxxx, 整数型
.如果真 (钩子句柄1 = 0)
temp目录 =操作_取特定目录 (1)
钩子句柄1 = 到整数 (读配置项 (temp目录 + “ada.ini”, “ada”, “钩子句柄”, ))
.如果真结束
.如果真 (第一次 = 假)
第一次 = 真
调用_调用子程序 (初始)
.如果真结束
返回 (CallNextHookEx (钩子句柄1, 代码值, 参数1, 参数2))
.子程序 注入_设置呼出窗口, 逻辑型, 公开
.参数 设置热键, 整数型
.参数 呼出窗口, 窗口
临时呼出热键 = 设置热键
临时载入窗口 = 呼出窗口
热键钩子句柄 = SetWindowsHookExA (2, 到整数 (&呼出键接口), 0, GetCurrentThreadId ())
.如果真 (热键钩子句柄 > 0)
返回 (真)
.如果真结束
返回 (假)
.子程序 呼出键接口, 整数型
.参数 一, 整数型
.参数 二, 整数型
.参数 三, 整数型
.如果真 (一 = 0 且 二 = 临时呼出热键 且 三 > 0)
.如果 (是否已创建 (临时载入窗口))
.如果 (临时载入窗口.可视)
临时载入窗口.可视= 假
.否则
临时载入窗口.可视= 真
.如果结束
.否则
载入 (临时载入窗口, , 假)
临时载入窗口.Esc键关闭= 假
临时载入窗口.最小化按钮= 真
.如果结束
.如果真结束
返回 (CallNextHookEx (热键钩子句柄, 一, 二, 三))
.版本 2
.数据类型 项目标识符列表_, , ITEMIDLIST
.成员 结构大小, 整数型, , , cb
.成员 标识符长度, 字节型, , "255", abID
此函数是用来调用指针函数的.就是CALL
取目录用这个我就不解释了
下面是源码主要函数
函数解释:
本函数参数1为要HOOK的线程ID,参数2为要注入的DLL名,参数3[可空]为DLL接口名字空则为"钩子接口".
下面解释是如何实现的:
1.首先使用LoadLibraryA获取DLL模块地址.
2.然后设置SetWindowsHookExA
参数一为HOOK类型,使用WH_GETMESSAGE(3) Hook来监视从GetMessage or PeekMessage函数返回息。
参数二为接口地址,就是说把消息返回转接到的位置,当然我们这里所使用的是我们DLL所公开的那个函数
参数三为接口模块的句柄即DLL的句柄(地址)
参数四为将要被HOOK的线程ID(0为全局HOOK,不推荐使用全局HOOK)
3.设置完后将钩子句柄写配置项到临时目录(后面将要使用).
说白了其实这个才是真正的接口(DLL里的接口只是在做转接而已),
我先讲这个函数是如何实现的(上面已经说了这才是真正的接口).
1,钩子句柄是一个程序集变量,先判断这个变量是否为0,如果等于0那么就是说这个函数第一次被使用,
第一次使用将读去上个函数写在临时目录的钩子句柄.
2.用一个逻辑变量(程序集变量或全局变量),来判断这个消息钩子是否第一次运行(为了防止后面调用
子程序被多次调用),是的话调用一个子程序(自己设置)
3.使用CallNextHookEx(呼叫下一个钩子)把当前HOOK的信息在传送回被HOOK的钩子里,那个钩子我们
就不用管了.
下来说下到底如何使用
首先在你的EXE程序里写这个(我就不多说这是干吗的了).
然后在DLL里写上这个代码(有人可能觉得眼熟,好像在什么地方见过,对了这个代码和
外挂作坊的钩子注入差不多)
下来说明下按键呼出窗口的函数
用变量把当前参数存起来(主要方便接口调用)
1.为当前运行线程设置一个键盘钩子
2.[接口]设置按键判断,如果按下我们设置的键将呼出窗口,如果这个窗口没创建将判断创建,
如果已经创建再次按下则会隐藏,
载入后的窗口把用ESC关闭的属性弄成假,不需要ESC关闭
3.最后就是再呼叫下以前的钩子.
最后就是卸载钩子DLL了.
判断是否要卸载全部的钩子,如果是就循环将现有钩子DLL全部卸载.
不是就按着ID来卸载
卸载方法:
1.FreeLibrary就是卸载一个载入的DLL
2.UnhookWindowsHookEx乃是卸载这个HOOK
-.-OK了这就是 钩子DLL注入,谢谢大家阅读,如果看不明白,
⑺ 求助一个 易语言DLL注入器源码 要求能注入游戏
用模块
⑻ 有现成的DLL,要最简单的注入源码
BOOL EnableDebugPrivilege(BOOL bEnable)
{
BOOL fOK = FALSE;
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &tp.Privileges[0].Luid); //
tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOK = (GetLastError() ==ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOK;
}
//写内存 注意:注释掉的部分在这个程序里用不上,因为程序可以直接访问,没有权限问题
BOOL me_WriteProcessMemory(DWORD dwProcsPID,DWORD dwAddress,LPVOID Data,SIZE_T SIZE)
{
//EnableDebugPrivilege(true);
DWORD size;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);//PROCESS_VM_WRITE|PROCESS_VM_READ
//DWORD dwOldProc;
//DWORD dwNewProc;
//改变页面属性为读写
//VirtualProtectEx( hProcess,(LPVOID)dwAddress,SIZE,PAGE_READWRITE, &dwOldProc );
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwAddress,Data,SIZE,&size);
//恢复页面文件的属性
//VirtualProtectEx( hProcess,(LPVOID)dwAddress,SIZE,dwOldProc,&dwNewProc );
CloseHandle(hProcess);
//EnableDebugPrivilege(false);
return RE;
}
//读取内存
BOOL me_ReadProcessMemory(DWORD dwProcsPID,DWORD dwAddress,LPVOID Data,SIZE_T SIZE)
{
//EnableDebugPrivilege(true);
DWORD size;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
BOOL RE=ReadProcessMemory(hProcess, (LPVOID)dwAddress,Data,SIZE, &size);
//EnableDebugPrivilege(false);
CloseHandle(hProcess);
return RE;
}
//获取指定窗口名PID
bool me_Findgamewindow(LPCWSTR GAMEWINODWNAME,__out DWORD *pidwin)
{
HWND hWnd=FindWindow(NULL,GAMEWINODWNAME);
if(hWnd)
{
//*GameBaseAdd=(DWORD)GetWindowLongPtr(hWnd, GWL_HINSTANCE);
GetWindowThreadProcessId(hWnd,pidwin);
return true;
}
return false;
}
/*
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetMoleHandle(TEXT("kernel32")),"IsWow64Process");
if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
return FALSE;
}
}
return bIsWow64;
}
*/
//进程注入
bool IntoProcess(/*DWORD dwProcsPID,*/WCHAR *DllPath,WCHAR *WinName,HWND IntoPhWnd=NULL)
{
DWORD dwProcsPID=0;
if(IntoPhWnd!=NULL)//有句柄直接用句柄
GetWindowThreadProcessId(IntoPhWnd,&dwProcsPID);
//只有窗口名那就取找到的第一个窗口
else me_Findgamewindow(WinName,&dwProcsPID);
if(dwProcsPID!=0)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
if(hProcess==NULL)
{
MessageBox(NULL,L"无法打开进程哈",L"ERROR_006",MB_OK);
return false;
}
BOOL ISx64=TRUE;
IsWow64Process(hProcess,&ISx64);
if (!ISx64)
{
MessageBox(NULL,L"无法注入到64位进程哈",L"ERROR_008",MB_OK);
return false;
}
DWORD cb = (1+lstrlenW(DllPath))* sizeof(WCHAR);
LPVOID dwDllAddress=VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwDllAddress,DllPath,cb,&cb);
PTHREAD_START_ROUTINE pfnStartAddr;
pfnStartAddr = (PTHREAD_START_ROUTINE)LoadLibraryW;
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,dwDllAddress,0,NULL);
if(hThread == NULL)
{
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
}
else
{
MessageBox(NULL,L"注入失败",L"ERROR_009",MB_OK);
return false;
}
return true;
}
//进程注入
bool IntoProcess(DWORD dwProcsPID,WCHAR *DllPath)
{
if(dwProcsPID!=0)
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcsPID);
if(hProcess==NULL)
{
MessageBox(GetForegroundWindow(),L"无法打开进程哈",L"ERROR_006",MB_OK);
return false;
}
BOOL ISx64=TRUE;
IsWow64Process(hProcess,&ISx64);
if (!ISx64)
{
MessageBox(GetForegroundWindow(),L"无法注入到64位进程哈",L"ERROR_008",MB_OK);
return false;
}
DWORD cb = (1+lstrlenW(DllPath))* sizeof(WCHAR);
LPVOID dwDllAddress=VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
BOOL RE=WriteProcessMemory(hProcess,(LPVOID)dwDllAddress,DllPath,cb,&cb);
PTHREAD_START_ROUTINE pfnStartAddr;
pfnStartAddr = (PTHREAD_START_ROUTINE)LoadLibraryW;
HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,pfnStartAddr,dwDllAddress,0,NULL);
if(hThread == NULL)
{
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
return false;
}
WaitForSingleObject(hThread,INFINITE);
DWORD ExitCode;
GetExitCodeThread(hThread,&ExitCode);
CloseHandle(hThread);
VirtualFreeEx(hThread,dwDllAddress,cb,MEM_RELEASE);
CloseHandle(hProcess);
if (ExitCode==0)
{
MessageBox(GetForegroundWindow(),L"注入失败,很大的可能是你的DLL文件问题",L"ERROR_010",MB_OK);
return false;
}
}
else
{
MessageBox(GetForegroundWindow(),L"注入失败",L"ERROR_009",MB_OK);
return false;
}
return true;
}