首页
社区
课程
招聘
未解决 [求助]Win10下记事本Dll注入不成功
发表于: 2020-8-20 23:02 12836

未解决 [求助]Win10下记事本Dll注入不成功

2020-8-20 23:02
12836

小白一枚,使用https://bbs.pediy.com/thread-258333.htm的代码自己练习下,发现无法注入,搞了一晚上还是没找到原因,求各位帮指点迷津,不甚感谢!

#include <iostream>
#include <windows.h>
#include <string.h>
#include <string>
using namespace std;

HWND hwnd = NULL;
DWORD dwProcessId = NULL;
HANDLE hProcess = NULL;
PVOID lpPathAddr = NULL;

char pszDllFileName[25] = "F:\\test\\1\\2Dll1.dll";
char loadfunc[25] = "LoadLibraryA";
FARPROC loadfuncaddr = NULL;

BOOL todo(){
 hwnd = ::FindWindow("Notepad", NULL);	//以注入记事本为例
 if (hwnd == NULL)
 {
     MessageBox(NULL, "找不到记事本", "错误", MB_OK);
 }
   GetWindowThreadProcessId(hwnd, &dwProcessId);

// 1.打开目标进程
HANDLE hProcess = OpenProcess(
    PROCESS_ALL_ACCESS,     // 打开权限
    FALSE,                  // 是否继承
    dwProcessId);           // 进程PID
if (NULL == hProcess)
{
    MessageBox(NULL, "打开目标进程失败", "错误", MB_OK);
    return FALSE;
}

// 2.在目标进程中申请空间
LPVOID lpPathAddr = VirtualAllocEx(
    hProcess,                   // 目标进程句柄
    0,                          // 指定申请地址
    strlen(pszDllFileName) + 1,   // 申请空间大小
    MEM_RESERVE | MEM_COMMIT, // 内存的状态
    PAGE_READWRITE);            // 内存属性
if (NULL == lpPathAddr)
{
    MessageBox(NULL, "在目标进程中申请空间失败", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 3.在目标进程中写入Dll路径
SIZE_T dwWriteSize = 0;
if (FALSE == WriteProcessMemory(
    hProcess,                   // 目标进程句柄
    lpPathAddr,                 // 目标进程地址
    pszDllFileName,                 // 写入的缓冲区
    strlen(pszDllFileName) + 1,   // 缓冲区大小
    &dwWriteSize))              // 实际写入大小
{
    MessageBox(NULL, "目标进程中写入Dll路径失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

//获取LoadLibraryA的函数地址
//FARPROC可以自适应32位与64位
FARPROC pFuncProcAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (NULL == pFuncProcAddr)
{
    MessageBox(NULL, "获取LoadLibrary函数地址失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 4.在目标进程中创建线程
HANDLE hThread = CreateRemoteThread(
    hProcess,                   // 目标进程句柄
    NULL,                       // 安全属性
    NULL,                       // 栈大小
    (PTHREAD_START_ROUTINE)pFuncProcAddr,   // 回调函数
    lpPathAddr,                 // 回调函数参数
    NULL,                       // 标志
    NULL                        // 线程ID
);
if (NULL == hThread)
{
    MessageBox(NULL, "目标进程中创建线程失败!", "错误", MB_OK);
    CloseHandle(hProcess);
    return FALSE;
}

// 5.等待线程结束
WaitForSingleObject(hThread, -1);

// 6.清理环境
VirtualFreeEx(hProcess, lpPathAddr, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return TRUE;
}

int main()
{
    std::cout << "Hello World!\n";
    todo();
}


注入Dll如下:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        MessageBox(NULL, L"远程线程注入成功!", L"提示", NULL);
        break;
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


操作系统版本如下:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (20)
雪    币: 2095
活跃值: (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
64位程序只能注入64位,是不是这个问题?、
按理说照着做的一般不会有太大问题的
2020-8-20 23:47
0
雪    币: 223
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我的是64位的dll也是编译的时候选了64位,引子exe也是编译时候选了64位,我用ce查看了notepad里面是写入了dll,但是最后没有执行。
2020-8-20 23:50
0
雪    币: 3619
活跃值: (4889)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
可能字符集的问题,注入代码字符集要和目标程序字符集一样
2020-8-21 00:13
0
雪    币: 248
活跃值: (1121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你看看这篇文章,https://bbs.pediy.com/thread-259891.htm
win10 x64上,像CreateRemoteThread这种API都要进行参数检测,XP上的各种注入DLL办法都无效。
2020-8-21 01:27
0
雪    币: 9700
活跃值: (1680)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
用管理员权限了吗?进程提权了吗?
2020-8-21 09:43
0
雪    币: 42
活跃值: (222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
内存属性
2020-8-21 10:20
0
雪    币: 12527
活跃值: (6029)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
UAC requireAdministrator
NtOpenProcessToken
NtAdjustPrivilegesToken
SeDebugPrivilege
2020-8-21 13:17
0
雪    币: 15
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
wx_hc 可能字符集的问题,注入代码字符集要和目标程序字符集一样
字符我用的是多字符集
2020-8-21 13:56
0
雪    币: 15
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
sixL 你看看这篇文章,https://bbs.pediy.com/thread-259891.htm win10 x64上,像CreateRemoteThread这种API都要进行参数检测,XP上的各种注 ...
好的,谢谢,学习下
2020-8-21 13:56
0
雪    币: 15
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
严启真 用管理员权限了吗?进程提权了吗?
用了管理员,程序里面没有提权,运行的时候以管理员运行,这个之前找原因时就试了
2020-8-21 13:59
0
雪    币: 15
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
hhkqqs UAC requireAdministrator NtOpenProcessToken NtAdjustPrivilegesToken SeDebugPrivilege
等下午下班后查下提示的方向实验下看行不行
2020-8-21 14:02
0
雪    币: 775
活跃值: (2307)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
用LdrLoadDll+ZwCreateThreadEx吧  我这里没问题
2020-8-21 14:04
0
雪    币: 15
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
AperOdry 用LdrLoadDll+ZwCreateThreadEx吧 我这里没问题
好的,非常感谢,试一下
2020-8-21 14:07
0
雪    币: 223
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
非常感谢可以的!
2020-8-21 23:03
0
雪    币: 223
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16

另一种方式学习存档:

// FileName : KernelFuncInject.cpp
// Creator : PeterZheng
// Date : 2019/01/10 21:32
// Comment : Use Kernel Function To Inject
//
////////////////////////////////

#pragma once
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strsafe.h>
#include <Windows.h>
#include <TlHelp32.h>

#ifdef _WIN64
typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
	PHANDLE ThreadHandle,
	ACCESS_MASK DesiredAccess,
	LPVOID ObjectAttributes,
	HANDLE ProcessHandle,
	LPTHREAD_START_ROUTINE lpStartAddress,
	LPVOID lpParameter,
	ULONG CreateThreadFlags,
	SIZE_T ZeroBits,
	SIZE_T StackSize,
	SIZE_T MaximumStackSize,
	LPVOID pUnkown);
#else
typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
	PHANDLE ThreadHandle,
	ACCESS_MASK DesiredAccess,
	LPVOID ObjectAttributes,
	HANDLE ProcessHandle,
	LPTHREAD_START_ROUTINE lpStartAddress,
	LPVOID lpParameter,
	BOOL CreateSuspended,
	DWORD dwStackSize,
	DWORD dw1,
	DWORD dw2,
	LPVOID pUnkown);
#endif

using namespace std;

// 提权函数
BOOL EnableDebugPriv(LPCSTR name)
{
	HANDLE hToken;
	LUID luid;
	TOKEN_PRIVILEGES tp;
	// 打开进程令牌
	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
	{
		printf("[!]Get Process Token Error!\n");
		return false;
	}
	// 获取权限Luid
	if (!LookupPrivilegeValue(NULL, name, &luid))
	{
		printf("[!]Get Privilege Error!\n");
		return false;
	}
	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;
	tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	// 修改进程权限
	if (!AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
	{
		printf("[!]Adjust Privilege Error!\n");
		return false;
	}
	return true;
}

// 根据进程名字获取进程Id
BOOL GetProcessIdByName(CHAR* szProcessName, DWORD& dwPid)
{
	HANDLE hSnapProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnapProcess == NULL)
	{
		printf("[*] Create Process Snap Error!\n");
		return FALSE;
	}
	PROCESSENTRY32 pe32 = { 0 };
	::RtlZeroMemory(&pe32, sizeof(pe32));
	pe32.dwSize = sizeof(pe32);
	BOOL bRet = ::Process32First(hSnapProcess, &pe32);
	while (bRet)
	{
		if (_stricmp(pe32.szExeFile, szProcessName) == 0)
		{
			dwPid = pe32.th32ProcessID;
			return TRUE;
		}
		bRet = ::Process32Next(hSnapProcess, &pe32);
	}
	return FALSE;
}

int main(int argc, char* argv[])
{
	if (argc != 3)
	{
		printf("[*] Format Error!  \nYou Should FOLLOW THIS FORMAT: <APCInject EXENAME DLLNAME> \n");
		return 0;
	}
	LPSTR szExeName = (LPSTR)::VirtualAlloc(NULL, 100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	LPSTR szDllPath = (LPSTR)::VirtualAlloc(NULL, 100, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	::RtlZeroMemory(szExeName, 100);
	::RtlZeroMemory(szDllPath, 100);
	::StringCchCopy(szExeName, 100, argv[1]);
	::StringCchCopy(szDllPath, 100, argv[2]);
	DWORD dwPid = 0;
	// 系统进程必须先提权才能打开,否则在OpenProcess步骤会失败
	EnableDebugPriv(SE_DEBUG_NAME);
	BOOL bRet = GetProcessIdByName(szExeName, dwPid);
	if (!bRet)
	{
		printf("[*] Get Process Id Error!\n");
		return 0;
	}
	HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
	if (hProcess == NULL)
	{
		printf("[*] Open Process Error!\n");
		return 0;
	}
	DWORD dwDllPathLen = strlen(szDllPath) + 1;
	LPVOID lpBaseAddress = ::VirtualAllocEx(hProcess, NULL, dwDllPathLen, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
	if (lpBaseAddress == NULL)
	{
		printf("[*] VirtualAllocEx Error!\n");
		return 0;
	}
	SIZE_T dwWriten = 0;
	// 把DLL路径字符串写入目标进程
	::WriteProcessMemory(hProcess, lpBaseAddress, szDllPath, dwDllPathLen, &dwWriten);
	if (dwWriten != dwDllPathLen)
	{
		printf("[*] Write Process Memory Error!\n");
		return 0;
	}
	// 获取LoadLibrary函数地址
	LPVOID pLoadLibraryFunc = ::GetProcAddress(::GetModuleHandle("kernel32.dll"), "LoadLibraryA");
	if (pLoadLibraryFunc == NULL)
	{
		printf("[*] Get Func Address Error!\n");
		return 0;
	}
	HMODULE hNtdll = ::LoadLibrary("ntdll.dll");
	if (hNtdll == NULL)
	{
		printf("[*] Load NtDLL Error!\n");
		return 0;
	}
	typedef_ZwCreateThreadEx ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");
	if (ZwCreateThreadEx == NULL)
	{
		printf("[*] Get NTDLL Func Address Error!\n");
		return 0;
	}
	DWORD dwStatus = 0;
	HANDLE hRemoteThread = NULL;
	dwStatus = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hProcess, (LPTHREAD_START_ROUTINE)pLoadLibraryFunc, lpBaseAddress, 0, 0, 0, 0, NULL);
	if (hRemoteThread == NULL)
	{
		printf("[*] Create Remote Thread Error!\n");
		return 0;
	}

	// DLL路径分割,方便输出
	LPCSTR szPathSign = "\\";
	LPSTR p = NULL;
	LPSTR next_token = NULL;
	p = strtok_s(szDllPath, szPathSign, &next_token);
	while (p)
	{
		StringCchCopy(szDllPath, 100, p);
		p = strtok_s(NULL, szPathSign, &next_token);
	}
	printf("[*] High Privilege Inject Info [%s ==> %s] Success\n", szDllPath, szExeName);

	::CloseHandle(hProcess);
	::FreeLibrary(hNtdll);
	::VirtualFree(szExeName, 0, MEM_RELEASE);
	::VirtualFree(szDllPath, 0, MEM_RELEASE);
	::ExitProcess(0);
	return 0;

}


2020-8-21 23:04
0
雪    币: 0
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这种方法,在 win10 64位也测试也不行呀,楼主有没有实验成功呀
2020-10-9 16:23
0
雪    币: 0
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
找到原因了,是因为 dll 没有写全径。写上全路径就可以了。折腾了半天时间,T﹏T

总结一下可能失败的原因:
       1. 被注入程序(notepad.exe)和注入模块(thief.dll)位数必须一致(32位或64位)。
       2. 注入程序拥有管理员权限(工程属性设置或动态提权)。
       3. 注入模块和被注入程序如果不在同一个目录下,注入模块需要写全路径名,否则注入成功但找不到 dll。
2020-10-9 17:11
0
雪    币: 4
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
你成功了么,我也是没有成功啊,头大,小白一个,什么都不会啊
2022-1-9 20:02
0
雪    币: 1025
活跃值: (1007)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
笔记本的对话框不是最上层,View类才是,所以你的消息框弹不出来
2023-6-21 18:38
0
雪    币: 1657
活跃值: (4753)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
根据20楼,你dll里写修改笔记本内存的代码就知道有没有被执行了
2023-7-8 10:52
0
游客
登录 | 注册 方可回帖
返回
//