我的一个注入进程的一个程序在注入申请内存空间VirtualAllocEx的时候,出现了一个Access is denied错误(错误代码5)。这个应该是没有对此进程具有相应操作权限的错误。
可是我把注入进程的程序利用//方法声明
BOOL EnablePrivilege(HANDLE hToken,LPCTSTR szPrivName,BOOL fEnable){
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL,szPrivName,&tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED:0;
AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
return((GetLastError() == ERROR_SUCCESS));
}
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);  
EnablePrivilege(hToken,SE_DEBUG_NAME,TRUE);
提升了权限之后,仍然是Access is deni错误。一开始我以为这是进程对自己的一个保护,通过提升操作权限的方法应该行不通,不过后来我想起OD对程序的调试好象运用的也是注入这个原理,因为OD通过修伽程序的汇编代码改变程序的流程,应该是用了类似于WriteProcessMemory这样的方法使其改变的。而如果调用WriteProcessMemory方法,势必要在程序中利用VirtualAllocEx申请一块空间以便于写入。也就是说,在这方面OD突破了“Access is denied”的这个权限问题,所以我想请教一下,OD这方面的原理应该是什么?也就是说通过什么办法能够像OD那样拥有对所有ring3级进程的调试权限?

解决方案 »

  1.   

    OpenProcess时要给出PROCESS_VM_OPERATION标志。
      

  2.   

    我用的是PROCESS_ALL_ACCESS标志,应该没有问题吧……
      

  3.   

    难道你是 Vista 或者装了什么nb的杀毒软件?
    我知道卡吧死机会拦截这个的
      

  4.   

    用PROCESS_ALL_ACCESS没问题。OpenProcess成功了吗?VirtualAllocEx的参数怎么给的?
      

  5.   

    OpenProcess成功了,就是到了VirtualAllocEx的时候调用失败,返回的0VirtualAllocEx的调用方式://这个可有可无
    //VirtualFreeEx(AhProcess, (LPVOID)ThreadAdd, 0, MEM_RELEASE);ThreadAdd =VirtualAllocEx(AhProcess, NULL,4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    hThread =CreateRemoteThread(AhProcess, NULL, 0, (LPTHREAD_START_ROUTINE)ThreadAdd,0, CREATE_SUSPENDED,hreadID);
      

  6.   

    而且这个程序的VirtualAllocEx,一开始没有问题。
    后来可能由于被注入进程的那个程序改版了,才出现的这个权限错误问题。
      

  7.   

    你在安装了目标程序和没有安装目标程序两种环境下分别看一下VirtualAllocEx的地址和入口代码是否相同。
      

  8.   

    没有明白你的意思~~~~是不是认为我的那个目标程序改变了系统的API?
    不过我安装了目标程序以后,可以通过这个方式注入其他的进程,并且利用VirtualAllocEx成功的申请到了空间,我想应该不是这个的问题吧。
      

  9.   

    我的意思是目标程序阻止其它程序在它的进程中分配内存。
    也可能是目标程序Hook了OpenProcess,把PROCESS_VM_OPERATION权限给去掉了。
      

  10.   


    用OD进行调试的时候,可以修改里面的汇编来改变程序流程。OD如果要实现这个功能,那么必须要用OpenProcess加载程序的进程,然后用VirtualAllocEx申请一段内存,再用WriteProcessMemory方法改变汇编。如果目标程序Hook了OpenProcess或者阻止了其他程序对其进程的内存分配,那么OD也应该完成不了这个功能才对啊。
    WriteProcessMemory不也是先要VirtualAllocEx申请一块儿内存空间才能向进程里写数据吗?
      

  11.   

    郁闷,刚才试了一下。WriteProcessMemory也发生了那个权限的错误。
      

  12.   

    郁闷,刚才试了一下。WriteProcessMemory也发生了那个权限的错误。