首页
社区
课程
招聘
[求助]为什么这段注入DLL代码只能在我系统中使用?
发表于: 2007-8-30 07:38 5040

[求助]为什么这段注入DLL代码只能在我系统中使用?

2007-8-30 07:38
5040
BOOL RemoteLoadLibrary(LPCSTR pszDllName, DWORD dwProcessId)
{
  // 试图打开目标进程
  char strDllName[MAX_PATH];
  
  DWORD cbSize, dwWritten;

  HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

  if(hProcess == NULL)
  {
    MessageBox(_T("打开目标进程失败."));
    return FALSE;
  }else MessageBox(_T("打开目标进程成功."));

  // 在目标进程申请空间,存放字符串pszDllName,作为远程线程的参数
  cbSize = static_cast<DWORD>(lstrlenA(strDllName) + 1) * sizeof(char);

  LPVOID lpRemoteDllName = ::VirtualAllocEx(hProcess, NULL, cbSize, MEM_COMMIT, PAGE_READWRITE);
  if (::WriteProcessMemory(hProcess, lpRemoteDllName, (LPVOID)strDllName, cbSize, &dwWritten))
  {
    if ( dwWritten != cbSize )
        {
            VirtualFreeEx( hProcess, lpRemoteDllName, cbSize, MEM_DECOMMIT );
            CloseHandle( hProcess );
      MessageBox(_T("在目标进程中存放字符串失败."));
            return FALSE;
        }else  MessageBox(_T("在目标进程中存放字符串成功."));
  }    

  // 取得LoadLibraryA函数的地址,我们将以它作为远程线程函数启动
  HMODULE hModule=::GetModuleHandleW(_T("kernel32.dll"));
  LPTHREAD_START_ROUTINE pfnStartRoutine = (LPTHREAD_START_ROUTINE)::GetProcAddress(hModule, "LoadLibraryA");

  // 启动远程线程
  HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, 0,pfnStartRoutine, lpRemoteDllName, 0, NULL);
  if(hRemoteThread == NULL)
  {
    ::CloseHandle(hProcess);
    MessageBox(_T("启动远程线程失败."));
    return FALSE;

  }
else
   MessageBox(_T("启动远程线程成功."));

  ::CloseHandle(hRemoteThread);
  ::CloseHandle(hProcess);

  return TRUE;
}

这段代码为什么只有在我的系统中能够注入成功,而到了别的系统中(没装VS2005)系统中就失败呢?注:所有提示都是成功,但在目标进程中没有注入的DLL。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
汗,可能是人家开杀软防护了吧,基本的都HOOK了这些API...
2007-8-30 08:35
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是杀软件问题呀,我的双系统中,XP装有VS 测试成功,2003没装注入失败。后来在2003中装了VS后也注入成功,在虚拟机中的2003中还是失败。
2007-8-30 09:10
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
生成的是Debug版本,别人系统没有调试版本的动态链接库支持。
2007-8-30 10:16
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
注入时会提示:
打开目标进程成功.
在目标进程中存放字符串成功.
启动远程线程成功.
但用进程查工具在目标进程中没有发现我注入的DLL。
2007-8-30 11:59
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
VC8的BUG,你用/MT生成代码就可以了,不过体积比较大
2007-8-30 14:35
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用WaitForSingleObject()以确保线程得到执行。
2007-8-31 03:37
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
加上WaitForSingleObject(hThread,INFINITE);后
用GetExitCodeThread(hThread,&RetV)得线程的返回值是0
这是为什么
2007-8-31 18:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这是确保在注入过程中目标进程不被关闭.
还有,个人觉得不是这个WaitForSingleObject()函数的问题,可能是没有提升权限产生的.你的产生的进程无权限进行注入操作.
2007-9-2 17:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这是确保在注入过程中目标进程不被关闭.
还有,个人觉得不是这个WaitForSingleObject()函数的问题,可能是没有提升权限产生的.你的产生的进程无权限进行注入操作.
2007-9-2 17:43
0
雪    币: 125
活跃值: (35)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
遇到过,我当时是再DLLMAIN入口做了太多的事,后来把事情解放出来就没有事了
2007-9-3 14:05
0
游客
登录 | 注册 方可回帖
返回
//