VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 166|回复: 1

[已解决]有关修改内存的,这段代码为啥执行不成功

[复制链接]
33_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-12-13 10:40:27 | 显示全部楼层 |阅读模式
        HANDLE g_hProcess;         
        char szFileName[] = "D:\\MyProject\\test1.exe";
        STARTUPINFO si = {sizeof(STARTUPINFO)};
        PROCESS_INFORMATION pi;
        ::CreateProcess(NULL,szFileName,NULL,NULL,FALSE,CREATE_NEW_CONSOLE,NULL,NULL,
                &si,&pi);
        ::CloseHandle(pi.hThread);       
        g_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId);
       
        LPCVOID pbase=(LPCVOID)0x00401036;       
        LPCVOID pbase1=(LPCVOID)0x00401037;
        byte buf[] = "\0x90";
        WriteProcessMemory(g_hProcess, (LPVOID)pbase, buf, 2, NULL);
        WriteProcessMemory(g_hProcess, (LPVOID)pbase1, buf,2, NULL);
         ::CloseHandle(g_hProcess);       


不知道为啥执行总是失败,操作系统是64位的
最佳答案
31_avatar_small
2020-12-17 02:11:02
::CloseHandle(pi.hThread); 这一句好象已经关掉了你打开的进程? 不太确定. 可以先注起来.或是移到后面去.
g_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId); 后面可以接个显示一下它的返回值.以确定是否正确打开了.
我记得在64位下修改是需要先提权的.相关代码搜一下就有了,很多.

象这样
//提权
BOOL CMyDlg::AdjustPri()
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;        
        // 取得系统版本
        OSVERSIONINFO osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if (GetVersionEx(&osvi) == 0)
                return false;
       
        if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
                // Windows NT 3.51, Windows NT 4.0, Windows 2000,
                // Windows XP,  Windows .NET Server
                if (!OpenProcessToken(GetCurrentProcess(),
                        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
                        //打开当前进程访问代号
                {return false;}
               
                LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);//获取本地唯一标识用于在特定系统中设置权限
               
                tkp.PrivilegeCount = 1;
                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
               
                AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
                //提升访问令牌权限
                return TRUE;
        }
        return FALSE;
}




上一篇:C++声明的问题
下一篇:关于MFC中的控件问题
31_avatar_middle
最佳答案
1 
在线会员 发表于 2020-12-17 02:11:02 | 显示全部楼层    本楼为最佳答案   
bestAnswer
::CloseHandle(pi.hThread); 这一句好象已经关掉了你打开的进程? 不太确定. 可以先注起来.或是移到后面去.
g_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId); 后面可以接个显示一下它的返回值.以确定是否正确打开了.
我记得在64位下修改是需要先提权的.相关代码搜一下就有了,很多.

象这样
//提权
BOOL CMyDlg::AdjustPri()
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;        
        // 取得系统版本
        OSVERSIONINFO osvi;
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        if (GetVersionEx(&osvi) == 0)
                return false;
       
        if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
                // Windows NT 3.51, Windows NT 4.0, Windows 2000,
                // Windows XP,  Windows .NET Server
                if (!OpenProcessToken(GetCurrentProcess(),
                        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
                        //打开当前进程访问代号
                {return false;}
               
                LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);//获取本地唯一标识用于在特定系统中设置权限
               
                tkp.PrivilegeCount = 1;
                tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
               
                AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
                //提升访问令牌权限
                return TRUE;
        }
        return FALSE;
}
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2021-1-24 13:26

Powered by CcTry.CoM

© 2009-2020 cctry.com

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