VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 550|回复: 12

dll注入问题

[复制链接]
12_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-22 18:15:54 | 显示全部楼层 |阅读模式
提权后还是没法完成dll注入 CreateRemoteThread函数失败 getlasterror值为5 拒绝访问
我只是向记事本注入dll都权限不够吗。。。。。
提权代码如下
bool UpPrivilege()
{
        HANDLE hToken;                             //   handle   to   process   token  
        TOKEN_PRIVILEGES tkp;               //   pointer   to   token   structure  
        bool result = OpenProcessToken(GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
                &hToken);
        if (!result)         //打开进程错误  
                return result;
        result = LookupPrivilegeValue(NULL,
                SE_DEBUG_NAME,
                &tkp.Privileges[0].Luid);
        if (!result)         //查看进程权限错误  
                return   result;
        tkp.PrivilegeCount = 1;     //   one   privilege   to   set  
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        result = AdjustTokenPrivileges(hToken,
                FALSE,
                &tkp,
                sizeof(TOKEN_PRIVILEGES),
                (PTOKEN_PRIVILEGES)NULL,
                (PDWORD)NULL);
        return   result;
}




上一篇:GetDlgItem找不到控件ID
下一篇:基于CTK Plugin Framework的插件版本动态升级
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-23 00:34:06 | 显示全部楼层
本帖最后由 691086891 于 2020-4-23 00:35 编辑

试了一晚上发现对于64位程序只有x64配置下才能使函数执行成功(提权后不用管理员模式运行),对于32位程序x64和win32均可使函数执行成功(需要提权后使用管理员模式运行,否则openprocess函数都会被拒绝访问),但是即使函数都执行成功了,dll还是没有被注入啊???dllmain也没有被调用。。。。。怎么办啊??
inject源码如下(ShowError就是个自定义MessageBox)
为什么整个函数执行成功还是没法实现dll注入啊,试了一个64位一个32位程序结果都这样。。。。。
BOOL Inject(LPCTSTR szModule, DWORD dwID)
{
        DWORD d = 0;
        //hProcess: 进程句柄
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_OPERATION, NULL, dwID);
        d = GetLastError();
        if (!hProcess)
        {
                ShowError(_T("hProcess Error!"));
                return FALSE;
        }
        int cByte = (_tcslen(szModule))*sizeof(TCHAR)+1;
        //在目标进程分配内存空间
        LPVOID pAddr = VirtualAllocEx(hProcess, NULL, cByte, MEM_COMMIT, PAGE_READWRITE);
        d = GetLastError();
        //向目标进程写入dll路径 权限问题
        if (!pAddr && WriteProcessMemory(hProcess, pAddr, szModule, cByte, NULL))
        {
                d = GetLastError();
                ShowError(_T("pAddr Error || WriteProcessMemory Error"));
                return FALSE;
        }
        d = GetLastError();
        //获取LoadLibrary函数地址
        FARPROC pFuncProcAddr = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "LoadLibraryW");
        d = GetLastError();
        if (!pFuncProcAddr)
        {
                ShowError(_T("pFuncProcAddr Error"));
                return FALSE;
        }
        DWORD dwThreadID = 0;//线程ID
        //远程创建线程
        HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pAddr, 0, &dwThreadID);
        d = GetLastError();
        if (d == 5)
        {
                ShowError(_T("拒绝访问!"));
                return FALSE;
        }
        if (!hRemoteThread)
        {
                ShowError(_T("CreateRemoteThread Error"));
                return FALSE;
        }
        else
        {
                TCHAR Text[256] = { 0 };
                _stprintf_s(Text, 256, _T("%d"), d);
                ShowError(Text);
        }
        WaitForSingleObject(hProcess, INFINITE);
        CloseHandle(hRemoteThread);
        CloseHandle(hProcess);
        return TRUE;

}
58_avatar_middle
最佳答案
43 
online_vip 发表于 2020-4-22 19:31:08 | 显示全部楼层
用管理员权限启动VS,在编译试试。
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-22 23:16:15 | 显示全部楼层
thzzl 发表于 2020-4-22 19:31
用管理员权限启动VS,在编译试试。

不好使,但我改成64位环境下后GetLastError是0了,但是还是看不到注入的dll,dllmain也没执行
还有不知道为什么vs2013在x64下调试会报错不能调试
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-22 23:19:34 | 显示全部楼层
thzzl 发表于 2020-4-22 19:31
用管理员权限启动VS,在编译试试。

感觉好像是vs2013在x64下有问题啊。。。
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-23 00:24:19 | 显示全部楼层
thzzl 发表于 2020-4-22 19:31
用管理员权限启动VS,在编译试试。

试了好久,还是函数执行成功但是dll没被注入进去,然后dllmain也没被调用
00_avatar_middle
最佳答案
2 
在线会员 发表于 2020-4-23 21:49:36 | 显示全部楼层
本帖最后由 tk3184020 于 2020-4-23 21:53 编辑

1.有的时候不好使,拒绝访问。就用管理员身份打开VS编译运行,我的win10经常这样。

2.int cByte = (_tcslen(szModule) + 1) * sizeof(TCHAR);  
这里的大小和我的不一样

百度VirtualAllocEx
dwSize:
欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍



希望可以帮到你
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-23 23:07:20 | 显示全部楼层
tk3184020 发表于 2020-4-23 21:49
1.有的时候不好使,拒绝访问。就用管理员身份打开VS编译运行,我的win10经常这样。

2.int cByte = (_tcs ...

拒绝访问的问题可以解决了,但是即使我这个注入函数全部执行成功,还是没能调用dllmain
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-23 23:08:58 | 显示全部楼层
tk3184020 发表于 2020-4-23 21:49
1.有的时候不好使,拒绝访问。就用管理员身份打开VS编译运行,我的win10经常这样。

2.int cByte = (_tcs ...

我把这个分配内存的改好了,注入函数确实都能执行成功,但还是没办法让我dllmain里的弹窗函数执行出来。。。
00_avatar_middle
最佳答案
2 
在线会员 发表于 2020-4-23 23:09:39 | 显示全部楼层
691086891 发表于 2020-4-23 23:07
拒绝访问的问题可以解决了,但是即使我这个注入函数全部执行成功,还是没能调用dllmain

2. 试了吗,你和我代码中就哪儿不同
51_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-4-24 13:40:43 | 显示全部楼层
你需要先findwindow获取窗口句柄,在getwindowThreadProcessId()获取PID,在OpenProcess打开进程句柄
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-25 12:35:17 | 显示全部楼层
桔梗i 发表于 2020-4-24 13:40
你需要先findwindow获取窗口句柄,在getwindowThreadProcessId()获取PID,在OpenProcess打开进程句柄

我就是这么做的啊。。。
12_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-25 12:36:18 | 显示全部楼层
tk3184020 发表于 2020-4-23 23:09
2. 试了吗,你和我代码中就哪儿不同

改了,函数都能执行成功,但是dllmain里的代码还是没被执行
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-24 22:14

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表