请问:我用NtWriteVirtualMemory写内存为何总是失败?(RING 3) 谢谢!

ztxnet 2010-05-03 02:55:40
typedef
NTSTATUS
(NTAPI*pfnNtWriteVirtualMemory)(
HANDLE ProcessHandle,
PVOID BaseAddress,
PVOID Buffer,
ULONG BufferLength,
PULONG ReturnLength OPTIONAL
);

pfnNtWriteVirtualMemory NtWriteVirtualMemory = (pfnNtWriteVirtualMemory)GetProcAddress(GetModuleHandle ( "ntdll.dll" ),"NtWriteVirtualMemory");


int main()
{
UpTokenPrivileges(); //提权

NTSTATUS status;

HANDLE w_hopen = OpenProcess(PROCESS_ALL_ACCESS,0,632);

DWORD temp=0x74;

status = NtWriteVirtualMemory(w_hopen,(LPVOID)0x6F2A0930,&temp,1,NULL);

if(!NT_SUCCESS(status))
MessageBox(NULL,"0","0",MB_OK);

return 0;
}

NtWriteVirtualMemory函数的地址已获取到.难道是我参数的问题吗? 总是失败,郁闷死了.

请各位指点一下,我这是第一次这样用.我这是在ring3下调用的
...全文
834 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fewf333 2010-11-16
  • 打赏
  • 举报
回复
一看就是war3的哈
fly4free 2010-05-08
  • 打赏
  • 举报
回复
兔子大赠的是内核态代码?
mszjk 2010-05-04
  • 打赏
  • 举报
回复
WriteProcessMemory不需要VirtualProtect么?
jingzhongrong 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mszjk 的回复:]

WriteProcessMemory不需要VirtualProtect么?
[/Quote]

同问
sanguomi 2010-05-04
  • 打赏
  • 举报
回复

DWORD OldProtect;
::VirtualProtect((LPVOID)0x6F2A0930, temp, PAGE_READWRITE, &OldProtect);
::WriteProcessMemory(w_hopen, (LPVOID)0x6F2A0930, &temp, 1, NULL);
::VirtualProtect((LPVOID)0x6F2A0930, temp, OldProtect, 0);
ztxnet 2010-05-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
保护都没关,你能写才怪。

ZwOpenProcess->ZwProtectVirtualMemory->ZwWriteVirtualMemory
[/Quote]

非常感谢您的指点

我以为跟WriteProcessMemory一样,不需要解除保护一样可写...我是第一次用native函数,所以完全是门外汉,谢谢指点,代码我会仔细研究的
MoXiaoRab 2010-05-03
  • 打赏
  • 举报
回复
礼品附赠


NTSTATUS
MyWriteMemory(IN HANDLE hProcess,OUT PVOID BaseAddress,IN PVOID Pbuff,IN ULONG BufferSize)
{
PEPROCESS EProcess;
KAPC_STATE ApcState;
PVOID writebuffer=NULL;
NTSTATUS status;

status = ObReferenceObjectByHandle(
hProcess,
PROCESS_VM_WRITE|PROCESS_VM_READ,
NULL,
KernelMode,
&EProcess,
NULL
);

if(!NT_SUCCESS(status))
{
ObDereferenceObject(EProcess);
return STATUS_UNSUCCESSFUL;
}
writebuffer = ExAllocatePoolWithTag (NonPagedPool, BufferSize, 'Sys');

if(writebuffer==NULL)
{
ObDereferenceObject(EProcess);
ExFreePool (writebuffer);
return STATUS_UNSUCCESSFUL;
}
*(ULONG*)writebuffer=(ULONG)0x1;

if (MmIsAddressValid(Pbuff))
{
__try
{
ProbeForRead ((CONST PVOID)Pbuff, BufferSize, sizeof(CHAR));
RtlCopyMemory (writebuffer, Pbuff, BufferSize);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
status = STATUS_UNSUCCESSFUL;
}
}
else
{
status = STATUS_UNSUCCESSFUL;
}

if (NT_SUCCESS(status))
{
KeStackAttachProcess (EProcess, &ApcState);
if (MmIsAddressValid(BaseAddress))
{
__try
{
ProbeForWrite ((CONST PVOID)BaseAddress, BufferSize, sizeof(CHAR));
RtlCopyMemory (BaseAddress,writebuffer, BufferSize);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
status = STATUS_UNSUCCESSFUL;
}
}
else
{
status = STATUS_UNSUCCESSFUL;
}
KeUnstackDetachProcess (&ApcState);
}

ObDereferenceObject(EProcess);
ExFreePool (writebuffer);
return status;
}
MoXiaoRab 2010-05-03
  • 打赏
  • 举报
回复
保护都没关,你能写才怪。

ZwOpenProcess->ZwProtectVirtualMemory->ZwWriteVirtualMemory
jingzhongrong 2010-05-03
  • 打赏
  • 举报
回复
用NtOpenProcess打开进程。
郁金香VC++过驱动保护全套 免key版 天異赤提供 教程下载地址获取方法: 第一步:打开下方链接,填QQ邮箱,系统会往QQ邮箱发一封确认订阅邮件 第二步:打开QQ邮箱查看邮件,确认订阅,订阅成功后系统会自动把下载地址和解压密码一起发送到你QQ邮箱http://list.qq.com/cgi-bin/qf_invite?id=585e150c59f30e1213af9a9352367711b2e45c217582cf35 最近时间有些多,一时对网络游戏的保护机制感兴趣了,来研究了一下,听说QQ系列的TesSafe.sys 有些强,于是拿来看看驱动都做了些什 么.以下是对DNF和QQffo(自由幻想)研究结果(xp sp2) 在网上找了些TesSafe的资料,说TesSafe并不怎么样 现在这个版本保护的结果为:任务管理器中可以看到游戏进程,但OD和CE看不见,更不用说什么调试了,iceword可以 看到EPROCSS,但WSysCheck看 郁金香驱动 不见,自己程序,也不能注入受保护的游戏进程. 可见,NtOpenProcess被Hook了,恢复SSDT后,没有任何效果,可见是inline hook , 用一般的软件检测一下,没有发现inline hook,看来hook得比较深,在网上一找资料才发现,原来的确够隐藏的 郁金香驱动 以下是上一个TesSafe版本的分析结果 从网上找出来的资料,TesSafe.sys保护原理(DNF的保护,我听说,QQ系列游戏的保护机制都是一样的) ================================================================= 保护得比较没有意思,强度也不高.可能隐藏性稍好一些. 用IDA反汇编TesSafe.sys可以看到: 这个驱动一加载,ExAllocPoolWithTag分配了一块内存,然后将一个函数进这块内存,接着做好保护,然后 PsCreateSystemThread()创建的 郁金香驱动 线程调用ZwUnloadDriver将驱动卸载。虽 然驱动被卸载了,但是ExAllocPoolWithTag分配的内存仍然在起作用。 具体来看它如何进行保护: 郁金香驱动 先是得到了ObOpenObjectByPointer的地址,然后在 NtOpenProcess中搜索0xe8 ,也就是跳转指令,直到遇见RET为止。 一但得到0xe8,比较后面的四个字节,如果转换后为 ObOpenObjectByPointer的地址,就把这个地址用自己代理函数的地址转换后替换掉,达到 保护自己的目的。 郁金香驱动 用WinDbg看了看,果然在我的机器上:0x80570e41这个在 NtOpenProcess中的区域被TesSafe.sys修改,原来这里是:80570e41 e87c8dffff call nt!ObOpenObjectByPointer (80569bc2) 系统通过ObOpenObjectByPointer来通过 EPROCESS得到Handle返回给调用者。TENCENT在这里下了一个跳转:(TesSafe.sys加载后。)80570e41 e826542a78 call f881626c 很明显,系统执行到这里就会调用0x6881626c的函数,也就是 TesSafe.sys的 ObOpenObjectByPointer代理函数。这 样,Client.exe就会在这里被过滤掉,从而让R3程序无法得到QQT的句柄,从而保护进程。 郁金香驱动 ================================================================================= 我手头拿到的版本是2008年8月5号的,把TesSafe逆出来一看,比上个版本有所加强. 在这个新版本中,TesSafe一共InLine Hook了六个函数,我只逆出并恢复了五个 其中: 1. KeAttachProcess NtOpenProcess NtOpenThread 这三个函数的HOOK方式与上一个版本一样,就是上面蓝色字体的方法,把本应该call ObOpenObjectByPointe的代码修改成了call他自己的代码, 然后在他自己的代码中处理保护的进程 上面三个函数,原来正常的代码为 80581ce3 e8a658ffff call nt!ObOpenObjectByPointer (8057758e) 被HOOK后的代码变成了 call a8724af4(TesSafe自己搞出来的函数) lkd> u a8724af

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧