能力值:
( LV2,RANK:10 )
|
-
-
2 楼
64位程序只能注入64位,是不是这个问题?、 按理说照着做的一般不会有太大问题的
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我的是64位的dll也是编译的时候选了64位,引子exe也是编译时候选了64位,我用ce查看了notepad里面是写入了dll,但是最后没有执行。
|
能力值:
( LV4,RANK:40 )
|
-
-
4 楼
可能字符集的问题,注入代码字符集要和目标程序字符集一样
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
你看看这篇文章,https://bbs.pediy.com/thread-259891.htm win10 x64上,像CreateRemoteThread这种API都要进行参数检测,XP上的各种注入DLL办法都无效。
|
能力值:
( LV2,RANK:15 )
|
-
-
6 楼
用管理员权限了吗?进程提权了吗?
|
能力值:
( LV5,RANK:60 )
|
-
-
8 楼
UAC requireAdministrator NtOpenProcessToken NtAdjustPrivilegesToken SeDebugPrivilege
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
wx_hc
可能字符集的问题,注入代码字符集要和目标程序字符集一样
字符我用的是多字符集
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
sixL
你看看这篇文章,https://bbs.pediy.com/thread-259891.htm
win10 x64上,像CreateRemoteThread这种API都要进行参数检测,XP上的各种注 ...
好的,谢谢,学习下
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
严启真
用管理员权限了吗?进程提权了吗?
用了管理员,程序里面没有提权,运行的时候以管理员运行,这个之前找原因时就试了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
hhkqqs
UAC requireAdministrator
NtOpenProcessToken
NtAdjustPrivilegesToken
SeDebugPrivilege
等下午下班后查下提示的方向实验下看行不行
|
能力值:
( LV5,RANK:60 )
|
-
-
13 楼
用LdrLoadDll+ZwCreateThreadEx吧 我这里没问题
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
AperOdry
用LdrLoadDll+ZwCreateThreadEx吧 我这里没问题
好的,非常感谢,试一下
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
这种方法,在 win10 64位也测试也不行呀,楼主有没有实验成功呀
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
找到原因了,是因为 dll 没有写全径。写上全路径就可以了。折腾了半天时间,T﹏T
总结一下可能失败的原因: 1. 被注入程序(notepad.exe)和注入模块(thief.dll)位数必须一致(32位或64位)。 2. 注入程序拥有管理员权限(工程属性设置或动态提权)。 3. 注入模块和被注入程序如果不在同一个目录下,注入模块需要写全路径名,否则注入成功但找不到 dll。
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
你成功了么,我也是没有成功啊,头大,小白一个,什么都不会啊
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
笔记本的对话框不是最上层,View类才是,所以你的消息框弹不出来
|
能力值:
( LV3,RANK:20 )
|
-
-
21 楼
根据20楼,你dll里写修改笔记本内存的代码就知道有没有被执行了
|