一个神奇的注入问题

aCracker 2011-10-18 08:43:24
loader工程是unicode,dll是ansi。
RemoteLoadLibrary返回true,但是实际注入失败。
以下代码部分来自网上,改了一下。
我也不知道问题出在哪儿。
在注入之前也有提权。SE_DEBUG_NAME。



TCHAR szTarget[MAX_PATH]=_T("war3.exe");
dwProcessID = FindTarget( szTarget );
if ( 0 != dwProcessID )
{
//KillTimer(nIDEvent);
if(bRun == false)
{
if ( !RemoteLoadLibrary( dwProcessID,_T("MHCD.dll" )) )
{
MessageBox(_T("加载dll失败,请关闭杀毒再试!"),_T("提示"),0);
}
else
{
bRun = true;
MessageBox(_T("D:\\Program Files\\Warcraft III\\MHCD.dll" ),_T("注入成功"),0);
CListMsg.ResetContent();

}
}
}





BOOL RemoteLoadLibrary( DWORD dwProcessID, LPCTSTR lpszDll )
{
// 打开目标进程
HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessID );

if(!hProcess)
{
//AfxMessageBox( (LPCTSTR)"OpenProcess失败。");
return FALSE;
}
// 向目标进程地址空间写入DLL名称
DWORD dwSize, dwWritten;
dwSize = lstrlen( lpszDll ) + 1;
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
if ( NULL == lpBuf )
{
//AfxMessageBox( (LPCTSTR)"VirtualAllocEx失败1。");
CloseHandle( hProcess );
return FALSE;
}

//if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )
//原来是这样的。
if ( WriteProcessMemory( hProcess, lpBuf, lpszDll, dwSize, &dwWritten ) )
{
// 要写入字节数与实际写入字节数不相等,仍属失败
if ( dwWritten != dwSize )
{
// AfxMessageBox( (LPCTSTR)"VirtualAllocEx失败2。");
VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
CloseHandle( hProcess );
return FALSE;
}
}
else
{
//AfxMessageBox( (LPCTSTR)"WriteProcessMemory失败。");
CloseHandle( hProcess );
return FALSE;
}
// 使目标进程调用LoadLibrary,加载DLL
DWORD dwID;
LPVOID pFunc = LoadLibraryW;//原来是LoadLibraryA HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
// 等待LoadLibrary加载完毕
//WaitForSingleObject( hThread, INFINITE );
// 释放目标进程中申请的空间
//VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
if(hThread ==NULL)
{
CloseHandle( hThread );
CloseHandle( hProcess );
return false;
}
else
{
CloseHandle( hThread );
CloseHandle( hProcess );
return TRUE;
}
}
...全文
154 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
aCracker 2011-10-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mdianng 的回复:]
亲!
dwSize = lstrlen( lpszDll ) + 1;
改成
dwSize = (lstrlen( lpszDll )+1)*sizeof(TCHAR); // 疏忽了。

把你的dll拷贝到魔兽文件夹下或者
BOOL RemoteLoadLibrary( DWORD dwProcessID, LPCTSTR lpszDll )
lpszDll用全路径。

我在x……
[/Quote]
嘎嘎,果然,通过了。不过unicode的和ansi 通信,真有点麻烦。
加我一下啊QQ吧。请教方便一点。四四七陆四一五零四
MDianng 2011-10-21
  • 打赏
  • 举报
回复
还没有搞定?

出现这种问题我就会从几方面考虑。

1.
首先自己要注入的进程如果是窗口性质的。我会用spy去测试spy的dll是否能注入到这个进程。
如果spy不能注入那可能就是那个进程可能有防注入措施。

2.
是不是被杀毒软件的阻止了。

3.
建议用LoadLibraryA。

4.
注入一个进程的前提是那个进程模块中必须kernel32.dll。
还有就是loader的LoadLibraryA(W) 地址要和要注入进程LoadLiraryA(W)相同。
(一般情况下都是一样的)

5.
你那个Dll是否能正常使用。自己写个工程LoadlibraryA(W)它。
aCracker 2011-10-21
  • 打赏
  • 举报
回复
顶起来。
顶出血
MDianng 2011-10-21
  • 打赏
  • 举报
回复
亲!
dwSize = lstrlen( lpszDll ) + 1;
改成
dwSize = (lstrlen( lpszDll )+1)*sizeof(TCHAR); // 疏忽了。

把你的dll拷贝到魔兽文件夹下或者
BOOL RemoteLoadLibrary( DWORD dwProcessID, LPCTSTR lpszDll )
lpszDll用全路径。

我在xp下测试通过了。



gameslq 2011-10-21
  • 打赏
  • 举报
回复
用OpenProcessToken来提升权限
http://baike.baidu.com/view/1304692.htm
MDianng 2011-10-21
  • 打赏
  • 举报
回复
你注入的进程是魔兽争霸?
另外的loader可以。有代码吗。比较一下和你loader代码上的异同!
aCracker 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mdianng 的回复:]
还没有搞定?

出现这种问题我就会从几方面考虑。

1.
首先自己要注入的进程如果是窗口性质的。我会用spy去测试spy的dll是否能注入到这个进程。
如果spy不能注入那可能就是那个进程可能有防注入措施。

2.
是不是被杀毒软件的阻止了。

3.
建议用LoadLibraryA。

4.
注入一个进程的前提是那个进程模块中必须kernel32.dll。
还有就是……
[/Quote]
谢谢你再次看这个帖子。
1.我没用spy++查看,但是我用另外的loader可以加载。
2.关闭杀毒也试过。
3.也试过
4.不清楚怎么弄
5.同一
aCracker 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanshen2891 的回复:]
啊,检查一下目标进程的loadlibrary和你当前进程的loadlibrary地址是一样的么??
[/Quote]
怎么检查?
但是 我有个ansi版本的loader,用上面的代码都正常注入啊。我上面的代码就是那个ansi版本的loader里面的,改了一点点而已。
zhanshen2891 2011-10-20
  • 打赏
  • 举报
回复
啊,检查一下目标进程的loadlibrary和你当前进程的loadlibrary地址是一样的么??
shenyi0106 2011-10-19
  • 打赏
  • 举报
回复
需要提升权限
zhanshen2891 2011-10-19
  • 打赏
  • 举报
回复
首先最重要的是你检查一下CreateRemoteThread是否成功,如果失败检查一下lasterror就知道怎么回事了
cczlp 2011-10-19
  • 打赏
  • 举报
回复
LoadLibraryW 或者 LoadLibraryA 要用
::GetProcAddress(::GetModuleHandle("Kernel32"), "LoadLibraryA")
这样来读取.
另外, 运行的系统是XP还是Win7, 64位吗?
MDianng 2011-10-19
  • 打赏
  • 举报
回复
既然用到LoadLibraryW
那个注入dll名称也要用宽字节的字符串。

既然是unicode的工程。确认字符串都是wchar类型的。

dwSize = lstrlen( lpszDll ) + sizeof(TCHAR);
还有LoadLibrary要用GetProcAddress获得真实的地址。

这样LPVOID pFunc = LoadLibraryW有可能这个地址指向loader IAT
aCracker 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhanshen2891 的回复:]
首先最重要的是你检查一下CreateRemoteThread是否成功,如果失败检查一下lasterror就知道怎么回事了
[/Quote]
[Quote=引用 4 楼 shenyi0106 的回复:]
需要提升权限
[/Quote]
麻烦把题目看完整了。谢谢。
aCracker 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cczlp 的回复:]
LoadLibraryW 或者 LoadLibraryA 要用
::GetProcAddress(::GetModuleHandle("Kernel32"), "LoadLibraryA")
这样来读取.
另外, 运行的系统是XP还是Win7, 64位吗?
[/Quote]
这样吗?
LPVOID pFunc = GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
是32位XP 系统。
aCracker 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 acracker 的回复:]
loader工程是unicode,dll是ansi。
RemoteLoadLibrary返回true,但是实际注入失败。
以下代码部分来自网上,改了一下。
我也不知道问题出在哪儿。
在注入之前也有提权。SE_DEBUG_NAME。

C/C++ code



TCHAR szTarget[MAX_PATH]=_T("war3.exe");
dwProcess……
[/Quote]
字符串都是WCHAR.
dwSize = lstrlen( lpszDll ) + sizeof(TCHAR);改成这样也还是不行
还有LoadLibrary要用GetProcAddress获得真实的地址。
是这样吗? 还是不行。

LPVOID pFunc = GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryW");

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧