求教老师们关于这段DLL注入的问题。

whj_hbxf 2017-02-28 09:04:55

//权限调整
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
CString err;
err.Format(L"打开进程令牌 error: %u\n", GetLastError());
AfxMessageBox(err);
return FALSE;
}
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid))
{
CString err;
err.Format(L"查找特权值 error: %u\n", GetLastError());
AfxMessageBox(err);
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
{
CString err;
err.Format(L"调整令牌特权: %u\n", GetLastError());
AfxMessageBox(err);
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
CString err;
err.Format(L"令牌没有指定特权. \n");
AfxMessageBox(err);
return FALSE;
}
//4. 关闭令牌句柄
CloseHandle(hToken);
return TRUE;
}
void CMFCAppDlg::OnBnClickedOk()
{
CString str;//从控件获得的目标进程PID
UpdateData(TRUE);
m_cEdit.GetWindowText(str);
if (str.IsEmpty()) {
MessageBox(_T("请选择进程!"), _T("错误!"));
return;
}
CString szDllPath; //DLL路径
GetModuleFileName(NULL, szDllPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
szDllPath.ReleaseBuffer();
int nPos;
nPos = szDllPath.ReverseFind('\\');
szDllPath = szDllPath.Left(nPos);
szDllPath += "\\Hooker.dll";

HANDLE m_hProcess = NULL;
HANDLE m_hThread = NULL;
FARPROC pFunc = NULL;
FARPROC pThreadProc = NULL;
LPVOID pRemoteBuf = NULL;
DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1) * sizeof(TCHAR);
DWORD dwWritten = 0;
if (SetPrivilege(SE_DEBUG_NAME, TRUE))
{
m_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, _wtoi(str));
if (!m_hProcess) {
CString err;
err.Format(L"获取目标进程句柄失败!!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
pRemoteBuf = VirtualAllocEx(m_hProcess, NULL, dwBufSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (pRemoteBuf == NULL)
{
CString err;
err.Format(L"申请分配内存空间失败!!! [%d]\n", GetLastError());
AfxMessageBox(err);
}
BOOL bw = WriteProcessMemory(m_hProcess, pRemoteBuf, (LPVOID)(&szDllPath), dwBufSize, &dwWritten);
if (!bw || dwWritten != dwBufSize)
{
CString err;
err.Format(L"写入分配的内存失败!!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
HINSTANCE hInst = GetModuleHandle(L"kernel32.dll");
if (hInst == NULL)
{
CString err;
err.Format(L" 获取kernel32失败!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
//m_hThread = MyNtCreateThreadEx(m_hProcess, hInst, pRemoteBuf);

pThreadProc = GetProcAddress(hInst, "LoadLibraryW");
if (pThreadProc == NULL)
{
CString err;
err.Format(L"打开LoadLibraryW失败!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
HINSTANCE hInsts = GetModuleHandle(L"ntdll.dll");
if (hInsts == NULL)
{
CString err;
err.Format(L"获得ntdll失败!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
pFunc = GetProcAddress(hInsts,"NtCreateThreadEx");
if(pFunc == NULL)
{
CString err;
err.Format(L"打开NtCreateThreadEx失败!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
((PFNTCREATETHREADEX)pFunc)(&m_hThread,
0x1FFFFF,
NULL,
m_hProcess,
(LPTHREAD_START_ROUTINE)pThreadProc,
pRemoteBuf,
FALSE,
NULL,
NULL,
NULL,
NULL);
if (m_hThread == NULL)
{
CString err;
err.Format(L"创建远程线程失败!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
//WaitForSingleObject(m_hThread, INFINITE);
if (WAIT_FAILED == WaitForSingleObject(m_hThread, INFINITE))
{
CString err;
err.Format(L"等待线程结束调用失败!!! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
if (WAIT_TIMEOUT == WaitForSingleObject(m_hThread, INFINITE))
{
CString err;
err.Format(L"等待线程结束超时! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
if (WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, INFINITE))
{
CString err;
err.Format(L"等待线程对象的状态被置为信号状态! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
if (WAIT_ABANDONED == WaitForSingleObject(m_hThread, INFINITE))
{
CString err;
err.Format(L"指定对象是互斥对象,在线程被终止前,线程没有释放互斥对象! [%d]\n", GetLastError());
AfxMessageBox(err);
return;
}
VirtualFreeEx(m_hProcess, pRemoteBuf, dwBufSize, MEM_DECOMMIT);
CloseHandle(m_hThread);
CloseHandle(m_hProcess);
SetPrivilege(SE_DEBUG_NAME, FALSE);
}
//CDialogEx::OnOK();
}


64位WIN7系统+VS2015+Unicode 字符集+x86编译环境.代码运行没有报错但是DLL注入不了。DLL基本是个空的,就在初始化时弹出一个对话框。求各位老师们指导一下。
...全文
159 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
引用 8 楼 whj_hbxf 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/
好东西,下载了。就是英文看的头大。。。以后慢慢学习吧。[/quote] 英语也是一门计算机语言的说。
oyljerry 2017-03-01
  • 打赏
  • 举报
回复
是不是有杀毒软件等保护,目标进程是否有自保护
zgl7903 2017-03-01
  • 打赏
  • 举报
回复
1 使用的是 LoadLibraryW, 建议参数明确为 WCHAR* 或 LPCSWTR WCHAR szDllPath[MAX_PATH + 1] …… 2 注入一般是使用 CreateRemoteThread 可以参考我的博客 CreateRemoteThread 牛刀小试
whj_hbxf 2017-03-01
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
1 使用的是 LoadLibraryW, 建议参数明确为 WCHAR* 或 LPCSWTR WCHAR szDllPath[MAX_PATH + 1] …… 2 注入一般是使用 CreateRemoteThread 可以参考我的博客 CreateRemoteThread 牛刀小试
感谢你的提示。我的注入代码应该都没什么大问题。用你的DLL我也注入成功了。看来主要是注入的DLL有问题.我用的MFC项目DLL,在初始化代码里new了一个对话框弹不出来,换成afxmessagebox却可以。结帖散分。。。
whj_hbxf 2017-03-01
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/
好东西,下载了。就是英文看的头大。。。以后慢慢学习吧。
赵4老师 2017-03-01
  • 打赏
  • 举报
回复
三岁、就很帅 2017-03-01
  • 打赏
  • 举报
回复
连接器里面加入你的.lib 包含文件把.h文件路径放进去 把dll拷贝到exe目录下
三岁、就很帅 2017-03-01
  • 打赏
  • 举报
回复
项目->属性->常规 MFC的使用在共享 DLL 中使用 MFC / 在静态库中使用 MFC 换一种加载dll的方式试试看吧
whj_hbxf 2017-03-01
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry的回复:
是不是有杀毒软件等保护,目标进程是否有自保护
没发现杀毒软件拦截,曾关过一次也没成功。
whj_hbxf 2017-03-01
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903的回复:
1 使用的是 LoadLibraryW, 建议参数明确为 WCHAR* 或 LPCSWTR WCHAR szDllPath[MAX_PATH + 1] …… 2 注入一般是使用 CreateRemoteThread 可以参考我的博客 CreateRemoteThread 牛刀小试
回家试试看行不行。。。

15,471

社区成员

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

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