VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1094|回复: 19

[求助] 快崩溃了,为啥DLL无法注入程序啊! 求各路大神老师帮忙指导一下

[复制链接]
12_avatar_middle
在线会员 发表于 2016-5-28 17:36:32 | 显示全部楼层 |阅读模式
3驿站币

按小强老师的教程,把程序放到vc6下就不好使了,DLL无法注入到游戏 ,这到底是为啥子捏,DLL文件和LIB文件都拷贝到主工程下面了,求各位大神老师帮忙指导一下我这个小菜快崩溃了,为啥DLL无法注入程序啊! 求各路大神老师帮忙指导一下
BOOL InjectDLL()
{
        DWORD dwProcessID;
        TCHAR sDllPath[MAX_PATH];
        //检测游戏是否启动
        HWND hWnd=FindWindow(NULL,_T("植物大战僵尸中文版"));
        if(!hWnd)
        {
                AfxMessageBox("游戏未启动");
                return FALSE;
        }
        //获取进程
        GetWindowThreadProcessId(hWnd,&dwProcessID);
        //提升权限
        HANDLE hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
        //获取远程进程 进行注入操作
        PTHREAD_START_ROUTINE pFunStartAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
        GetCurrentDirectory(MAX_PATH, sDllPath);  
    strcat(sDllPath,_T("\\DLL.dll"));
        LPVOID *pszLibFileRemote = (LPVOID*)VirtualAllocEx(hRemoteProcess, NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
        WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (LPVOID*)sDllPath, MAX_PATH, NULL);
        HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, NULL, pFunStartAddress, pszLibFileRemote, NULL, NULL);
        if (!hRemoteProcess)
        {
                AfxMessageBox("进程注入失败");
                return FALSE;
        }
        else
        {
                CloseHandle(hRemoteProcess);
                CloseHandle(hRemoteThread);
                return TRUE;
        }
}

最佳答案

查看完整内容

在窄字节环境下 要用LoadLibraryA




上一篇:如何獲取安全日誌通知
下一篇:GetQueuedCompletionstatus函数的问题
45_avatar_middle
online_vip 发表于 2016-5-28 17:36:33 | 显示全部楼层
在窄字节环境下  要用LoadLibraryA
17_avatar_middle
online_supermod 发表于 2016-5-28 18:10:07 | 显示全部楼层
要检查函数返回值+GetLastError判断,hWnd检查了,后面怎么又不检查了
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-28 18:26:16 | 显示全部楼层
Koma 发表于 2016-5-28 18:10
要检查函数返回值+GetLastError判断,hWnd检查了,后面怎么又不检查了

我是新手 对代码还不是很熟悉 GetLastError 这个函数该怎么使用啊?
这些代码在vs2013下可以正常运行怎么到有vc6里编译能通过 可是去掉strcat(sDllPath,_T("\\DLL.dll"));一样能够编译成功,运行exe文件却又不能把dll注入到游戏,这是为什么?编译器的原因吗?望老师给予解答一下
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-28 22:45:20 | 显示全部楼层
Koma 发表于 2016-5-28 18:10
要检查函数返回值+GetLastError判断,hWnd检查了,后面怎么又不检查了
  1. void ErrorExit(LPCWSTR strcat)
  2. {
  3.         TCHAR szBuf[80];
  4.         LPVOID lpMsgBuf;
  5.         DWORD dw = GetLastError();
  6.        
  7.         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL);
  8.        
  9.         wsprintf(szBuf,_T("%s failed with error %d: %s"), strcat, dw, lpMsgBuf);
  10.        
  11.         MessageBox(NULL, szBuf, _T("Error"), MB_OK);
  12.        
  13.         LocalFree(lpMsgBuf);
  14.         ExitProcess(dw);
  15. }
复制代码

是不是这样用的啊?怎么没有效果呢?
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-28 22:46:53 | 显示全部楼层
大神老师们周末都放假了啊!咋没人给我解答一下啊快崩溃了,为啥DLL无法注入程序啊! 求各路大神老师帮忙指导一下
45_avatar_middle
online_vip 发表于 2016-5-29 22:47:54 | 显示全部楼层
你调试一下就知道GetCurrentDirectory(MAX_PATH, sDllPath);    strcat(sDllPath,_T("\\DLL.dll"));得到的DLL.dll路径,和DLL.dll真实所在的路径不一样。




   
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-29 23:24:49 | 显示全部楼层
neverCF 发表于 2016-5-29 22:47
你调试一下就知道GetCurrentDirectory(MAX_PATH, sDllPath);    strcat(sDllPath,_T("\\DLL.dll"));得到的 ...

我使用AfxMessageBox(sDllPath);得到的路径是正确的。
应该是后面的代码出了问题吧??
45_avatar_middle
online_vip 发表于 2016-5-30 08:45:44 | 显示全部楼层
zhirenhun 发表于 2016-5-29 23:24
我使用AfxMessageBox(sDllPath);得到的路径是正确的。
应该是后面的代码出了问题吧??

把代码传上来  我帮你看看
45_avatar_middle
online_vip 发表于 2016-5-30 08:47:08 | 显示全部楼层
zhirenhun 发表于 2016-5-29 23:24
我使用AfxMessageBox(sDllPath);得到的路径是正确的。
应该是后面的代码出了问题吧??

把AfxMessageBox(sDllPath);得到的结果  给我看看
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 10:59:37 | 显示全部楼层
neverCF 发表于 2016-5-30 08:47
把AfxMessageBox(sDllPath);得到的结果  给我看看
  1. HCURSOR CZWFZDlg::OnQueryDragIcon()
  2. {
  3.         return (HCURSOR) m_hIcon;
  4. }

  5. BOOL InjectDLL()
  6. {
  7.         DWORD dwProcessID;
  8.         TCHAR sDllPath[MAX_PATH];
  9.         //检测游戏是否启动
  10.         HWND hWnd=FindWindow(NULL,_T("植物大战僵尸中文版"));
  11.         if(!hWnd)
  12.         {
  13.                 AfxMessageBox("游戏未启动");
  14.                 return FALSE;
  15.         }
  16.         //获取进程
  17.         GetWindowThreadProcessId(hWnd,&dwProcessID);
  18.         //提升权限
  19.         HANDLE hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
  20.         //获取远程进程 进行注入操作

  21.         PTHREAD_START_ROUTINE pFunStartAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
  22.         GetCurrentDirectory(MAX_PATH, sDllPath);  
  23.   
  24.         strcat(sDllPath,_T("\\DLL.dll"));
  25.     AfxMessageBox(sDllPath);
  26.         LPVOID *pszLibFileRemote = (LPVOID*)VirtualAllocEx(hRemoteProcess, NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
  27.         WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (LPVOID*)sDllPath, MAX_PATH, NULL);
  28.         HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, NULL, pFunStartAddress, pszLibFileRemote, NULL, NULL);
  29.         if (!hRemoteProcess)
  30.         {
  31.                 AfxMessageBox("进程注入失败");
  32.                 return FALSE;
  33.         }
  34.         else
  35.         {
  36.                 CloseHandle(hRemoteProcess);
  37.                 CloseHandle(hRemoteThread);
  38.                 return TRUE;
  39.         }
  40. }
复制代码

快崩溃了,为啥DLL无法注入程序啊! 求各路大神老师帮忙指导一下
麻烦帮我看看 谢谢了
45_avatar_middle
online_vip 发表于 2016-5-30 11:05:13 | 显示全部楼层
zhirenhun 发表于 2016-5-30 10:59
麻烦帮我看看 谢谢了

你确定 DLL.dll是在ZWFZ目录下,而不是在Debug或Release下
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 11:13:32 | 显示全部楼层
确定!我把编译好的dll和lib都复制到zwfz和debug目录下了
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 11:18:21 | 显示全部楼层
neverCF 发表于 2016-5-30 11:05
你确定 DLL.dll是在ZWFZ目录下,而不是在Debug或Release下

我用进程查看器查看目标进程模块 dll未能注入到目标进程 同样的代码在vs2013下面就能成功,在vc6我就把wcscat_s(sDllPath, sizeof(sDllPath), _T("\\DLL.dll"));改成strcat(sDllPath,_T("\\DLL.dll"));但是就是无法注入了
45_avatar_middle
online_vip 发表于 2016-5-30 11:20:57 | 显示全部楼层
HANDLE hRemoteProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,false,dwProcessID);   这个改了  试试
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 11:46:47 | 显示全部楼层
neverCF 发表于 2016-5-30 11:20
HANDLE hRemoteProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPE ...

一样无法注入!郁闷啊
45_avatar_middle
online_vip 发表于 2016-5-30 11:49:41 | 显示全部楼层
zhirenhun 发表于 2016-5-30 11:46
一样无法注入!郁闷啊

可能是宽窄字节的问题    在宽字节环境下可以用      在窄字节环境下不可以用   暂时还没找到原因
45_avatar_middle
online_vip 发表于 2016-5-30 12:27:03 | 显示全部楼层
  PTHREAD_START_ROUTINE pFunStartAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32.dll")), "LoadLibraryA");

这次应该可以了  把 LoadLibraryW改成LoadLibraryA

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
12_avatar_small zhirenhun + 1 + 1

查看全部评分

12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 13:37:51 | 显示全部楼层
neverCF 发表于 2016-5-30 12:27
在窄字节环境下  要用LoadLibraryA

谢谢 可以了 vc6不支持宽字节,开始都遇到过了,太粗心了
12_avatar_middle
ico_lz  楼主| 发表于 2016-5-30 15:03:38 | 显示全部楼层
感谢大家的解答,特别感谢@ neverCF
没有你的帮助 不知道会卡这里多久!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-19 00:24

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表