把DLL注入计算器,怎么计算器 崩溃了,高手指点一下,10多天了无法解决

yongkuiluo 2013-12-19 10:32:09
以下是把DLL注入计算器,怎么计算器 崩溃了
MFC 代码:

BOOL EnableDebugPriv()
{
TOKEN_PRIVILEGES tp;
LUID luid;
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
if (hToken==NULL)
{
AfxMessageBox("没有得到令牌句柄");
return 0;
}
///获得进程本地唯一ID
LookupPrivilegeValue(0,SE_DEBUG_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
//调整权限
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
return TRUE;
}
void Main()
{
CString ErrStr;
if (!EnableDebugPriv())
{
return ;
}

char dllFullPath[MAX_PATH]={"H:\\VC++编程\\数据库\\TestDll\\TestHook\\Debug\\Hook.dll"};
// dllFullPath="H:\\VC++编程\\数据库\\TestDll\\TestHook\\Debug\\Hook.dll";
HWND hCal=::FindWindow(NULL,"计算器");
if (hCal==0)
{
AfxMessageBox("请先打开计算器");
return;
}
DWORD Pid;
DWORD hThread=::GetWindowThreadProcessId(hCal,&Pid);
HANDLE hProcess=::OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,FALSE,Pid);
if (hProcess==NULL)
{
AfxMessageBox("无法打开计算器");
return;
}
int cb=(1+lstrlen(dllFullPath))*sizeof(char);
LPVOID lpDllRemote=::VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if (lpDllRemote==NULL)
{
AfxMessageBox("无法分配内存");
return;
}
DWORD dwWriteBuf;
WriteProcessMemory(hProcess,lpDllRemote,dllFullPath,cb,(LPDWORD)&dwWriteBuf);
if (cb!=dwWriteBuf)
{
AfxMessageBox("写入内存失败");
return;
}
HMODULE hMod=::LoadLibrary("Hook.dll");
LPTHREAD_START_ROUTINE StartHook=(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook");
if ((DWORD)StartHook==0)
{
AfxMessageBox("取函数地址失败");
return;
}
HANDLE hCreateThread=::CreateRemoteThread(hProcess,NULL,0,StartHook,lpDllRemote,0,NULL);
//hCreateThread运行后,计算器 崩溃了 显示 "0x00d2dv7b"指令引用的"0x00d2dv7b" 内存。该内存不能为"written"
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,::GetLastError(),0,(LPTSTR)&ErrStr,0,NULL);
AfxMessageBox(ErrStr);
WaitForSingleObject(hCreateThread,INFINITE);
CloseHandle(hCreateThread);
CloseHandle(hProcess);
}
...全文
419 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2013-12-21
  • 打赏
  • 举报
回复
你上面应该是写了个键盘钩子,但是这个钩子你没有安装啊!你可以在DLL的入口 函数中安装钩子
yongkuiluo 2013-12-21
  • 打赏
  • 举报
回复
以下是DLL代码: 问题出在哪里呢?
HHOOK hook;

LRESULT CALLBACK KeyProc(int Code,WPARAM wparam,LPARAM lparam)
{
if (wparam==VK_F4)
{
CTestDialog dlg;
dlg.DoModal();
dlg.ShowWindow(TRUE);
return 0;
}
return CallNextHookEx(hook,Code,wparam,lparam);
}
void StartHook()
{
HWND hCal=::FindWindow(NULL,L"计算器");
if (hCal==0)
{
AfxMessageBox(L"请先打开计算器");
return;
}
DWORD hThread=::GetWindowThreadProcessId(hCal,NULL);
hook=::SetWindowsHookEx(WH_KEYBOARD,KeyProc,::GetModuleHandle(_T("Hook.dll")),hThread);
if (hook==NULL)
{
AfxMessageBox(L"没有得到hook");
return;
}
}
wltg2001 2013-12-21
  • 打赏
  • 举报
回复
可以注入DLL了,现在发现一个新的问题,我按下F4没有反应,我是想按下F4会跳出一下窗口的 =============== 这个要看你DLL的实现了。
yongkuiluo 2013-12-21
  • 打赏
  • 举报
回复
谢谢各位老大!!
zwfgdlc 2013-12-21
  • 打赏
  • 举报
回复
http://www.vckbase.com/index.php/wv/1580 估计你还没有把这个教程完全看完
zwfgdlc 2013-12-21
  • 打赏
  • 举报
回复
DLL

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

HHOOK hook;

LRESULT CALLBACK KeyProc(int Code,WPARAM wparam,LPARAM lparam)
{
	if (wparam==VK_F4)
	{
		/*CTestDialog dlg;
		dlg.DoModal();
		dlg.ShowWindow(TRUE);*/
		::MessageBox(0, L"F4", 0, 0);
		return 0;
	}
	return CallNextHookEx(hook,Code,wparam,lparam);
}

void _stdcall StartHook()
{
	HWND hCal=::FindWindow(NULL,L"计算器");
	if (hCal==0)
	{
		::MessageBox(0, L"请先打开计算器", 0, 0);
		return;
	}
	DWORD hThread=::GetWindowThreadProcessId(hCal,NULL);
	hook=::SetWindowsHookEx(WH_KEYBOARD,KeyProc,::GetModuleHandle(_T("Hook.dll")),hThread);
	if (hook==NULL)
	{
		::MessageBox(0, L"没有得到hook", 0, 0);
		return;
	}
}

EXE
#include "stdafx.h"
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	HMODULE hDll = LoadLibrary(TEXT("hook.dll")); 
	FARPROC  StartHook = GetProcAddress(hDll,"StartHook");
	StartHook();
	return 0;
}
以上代码完全是没问题的. DLL注入可以用CreateRemoteThread远程线程方式注入, 也可以用SetWindowsHookEx消息钩子注入
yongkuiluo 2013-12-20
  • 打赏
  • 举报
回复
非常感谢!! 我改后 //LPTHREAD_START_ROUTINE StartHook=(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook"); LPTHREAD_START_ROUTINE StartHook=(LPTHREAD_START_ROUTINE)GetProcAddress(::GetModuleHandle(_T("Kernel32")),"LoadLibraryA"); 可以注入DLL了,现在发现一个新的问题,我按下F4没有反应,我是想按下F4会跳出一下窗口的
wltg2001 2013-12-20
  • 打赏
  • 举报
回复
引用 7 楼 yongkuiluo 的回复:
远程线程注入的话, 一般是在写入dll路径后, 调用远程的LoadLibrary函数来加载这个dll. 然后在dll入口函数中自动调用你需要要函数. 对啊,我就是这样做的啊。 我是自学VC++,教材上是这么做,为什么我不成功呢?
注意人家说的,是调用远程的LoadLibrary,是远程的LoadLibrary,对你而言就是计算器进程中的LoadLibrary,你上面代码不是这样写的。因为几乎每个进程都会加载Kernel32.dll,而Kernel32中存在函数LoadLibary,因为不管哪个进程,加载的Kernel32的虚拟地址总是一样的,所以你可以在自己的进程中用LPTHREAD_START_ROUTINE pfnThread=(LPTHREAD_START_ROUTINE )::GetProcAddress(::GetModuleHandle(_T("Kernel32")),"LoadLibraryW")获取LoadLibrary的虚拟地址,这个虚拟地址和目标进程中的LoadLibrary的虚拟地址是一样的,所以你可以用这个地址来调用CreateRemoteThread,启动远程进程,也就是通过CreateRemoteThread来调用目标进程中的LoadLibrary,因为此时的LoadLibrary是通过目标进程启动的,所以它加载的DLL当然就是加载进目标进程了,所以也就达到注入的目的了。
yongkuiluo 2013-12-20
  • 打赏
  • 举报
回复
谢谢,我先学习一下
wltg2001 2013-12-20
  • 打赏
  • 举报
回复
引用 7 楼 yongkuiluo 的回复:
远程线程注入的话, 一般是在写入dll路径后, 调用远程的LoadLibrary函数来加载这个dll. 然后在dll入口函数中自动调用你需要要函数. 对啊,我就是这样做的啊。 我是自学VC++,教材上是这么做,为什么我不成功呢?
你没有看懂教材吧。 我写的一个远程注入的例子,你看看: void WINAPI ModifyPriles() //进程加debug权限 { HANDLE hToken; TOKEN_PRIVILEGES tp; if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) { tp.PrivilegeCount=1; tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; ::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid); AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL); CloseHandle(hToken); } } DWORD WINAPI ProcessEnum(LPWSTR pszProcessName) //枚举进程,返回进程ID { HANDLE hProcessSnap; BOOL fok; PROCESSENTRY32 pe32; pe32.dwSize=sizeof(PROCESSENTRY32); hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); fok=::Process32First(hProcessSnap,&pe32); while (fok) { // MessageBox(NULL,pe32.szExeFile,pe32.szExeFile,MB_OK); if (wcscmp(pszProcessName,pe32.szExeFile)==0) { return pe32.th32ProcessID; } fok=::Process32Next(hProcessSnap,&pe32); } return 0; } BOOL WINAPI InjectLib(DWORD dwProcessId,PCWSTR pszLibFile) //利用远程线程将pszLibFile注入到目标进程中去,dwProcessId是目标进程的ID { HANDLE hProcess,hThread; PWSTR pszLibFileRemote; ModifyPriles();//提权 hProcess=::OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwProcessId); if (hProcess==NULL ) return FALSE; int cch=lstrlenW(pszLibFile)+1; int cb=cch*sizeof(WCHAR); pszLibFileRemote=(PWSTR)::VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE); if (pszLibFileRemote==NULL) return FALSE; if(!WriteProcessMemory(hProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL)) return FALSE; LPTHREAD_START_ROUTINE pfnThread=(LPTHREAD_START_ROUTINE )::GetProcAddress(::GetModuleHandle(_T("Kernel32")),"LoadLibraryW"); if (pfnThread==NULL) return FALSE; hThread=::CreateRemoteThread(hProcess,NULL,0,pfnThread,pszLibFileRemote,0,NULL); if(hThread==NULL) return FALSE; ::WaitForSingleObject(hThread,INFINITE); if(pszLibFileRemote!=NULL) ::VirtualFreeEx(hProcess,pszLibFileRemote,0,MEM_RELEASE); if(hThread!=NULL) CloseHandle(hThread); if(hProcess!=NULL) CloseHandle(hProcess); return TRUE; } 上面三个函数的功能分别是进程提权、进程遍历,远程注入。
wltg2001 2013-12-20
  • 打赏
  • 举报
回复
HANDLE hCreateThread=::CreateRemoteThread(hProcess,NULL,0,StartHook,lpDllRemote,0,NULL); ============= 这个要求你的线程函数是处于目标进程空间内的,很明显,你上面的 HMODULE hMod=::LoadLibrary("Hook.dll"); LPTHREAD_START_ROUTINE StartHook=(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook"); 说明你的DLL并没有加载进目标进程中。所以上面有人说你根本就没有注入,因为确实没有注入,注入是指将DLL加载进目标进程。
yongkuiluo 2013-12-20
  • 打赏
  • 举报
回复
远程线程注入的话, 一般是在写入dll路径后, 调用远程的LoadLibrary函数来加载这个dll. 然后在dll入口函数中自动调用你需要要函数. 对啊,我就是这样做的啊。 我是自学VC++,教材上是这么做,为什么我不成功呢?
yongkuiluo 2013-12-20
  • 打赏
  • 举报
回复
注入DLL不用你CreateRemoteThread远程线程注入,SetWindowsHookEx自动会帮你注入. 你直接在你的程序里 C/C++ code ? 1 2 3 HMODULE hMod=::LoadLibrary("Hook.dll"); FARPROC StartHook =(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook"); StartHook(); 这是注入当前的程序吧,我是想把DLL注入系统自带带计算器软件中
zwfgdlc 2013-12-20
  • 打赏
  • 举报
回复
注入DLL不用你CreateRemoteThread远程线程注入,SetWindowsHookEx自动会帮你注入. 你直接在你的程序里
HMODULE hMod=::LoadLibrary("Hook.dll");
FARPROC  StartHook =(LPTHREAD_START_ROUTINE)GetProcAddress(hMod,"StartHook");
StartHook();
xiaohuh421 2013-12-20
  • 打赏
  • 举报
回复
lpStartAddress A pointer to the application-defined function of type LPTHREAD_START_ROUTINE to be executed by the thread and represents the starting address of the thread in the remote process. The function must exist in the remote process. For more information, see ThreadProc. 远程线程注入的话, 一般是在写入dll路径后, 调用远程的LoadLibrary函数来加载这个dll. 然后在dll入口函数中自动调用你需要要函数.
「已注销」 2013-12-20
  • 打赏
  • 举报
回复
貌似流程就不对,你根本没有注入啊。
yongkuiluo 2013-12-19
  • 打赏
  • 举报
回复
以下是DLL代码: 问题出在哪里呢? HHOOK hook; LRESULT CALLBACK KeyProc(int Code,WPARAM wparam,LPARAM lparam) { if (wparam==VK_F4) { CTestDialog dlg; dlg.DoModal(); dlg.ShowWindow(TRUE); return 0; } return CallNextHookEx(hook,Code,wparam,lparam); } void StartHook() { HWND hCal=::FindWindow(NULL,L"计算器"); if (hCal==0) { AfxMessageBox(L"请先打开计算器"); return; } DWORD hThread=::GetWindowThreadProcessId(hCal,NULL); hook=::SetWindowsHookEx(WH_KEYBOARD,KeyProc,::GetModuleHandle(_T("Hook.dll")),hThread); if (hook==NULL) { AfxMessageBox(L"没有得到hook"); return; } }
xiaohuh421 2013-12-19
  • 打赏
  • 举报
回复
最大的可能是你自己注入的dll崩溃了.

15,471

社区成员

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

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