KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » 有点唐突的帖子...(做程序的进)
LOVEHINA-AVC - 2006/1/24 20:13:00
开门见山吧,以DEBUG_PROCESS权限打开目标程序并用WriteProcessMemory写断点,不经过VirtualProtectEx的页属性修改就直接写code segment,将可能引发页面保护错误吗?

以下是我在EFZ.NET中的做法,没有使用VirtualProtectEx,但在我的JP VLK XP SP2上work well.不少用户向我呈递了执行异常的报告,状况大多为目标程序在初始化后被迅速关闭,因此我想就此了解一下原因所在

@@:

  push  ecx
  mov edx,OFFSET arrayBreakPoint
  invoke  WriteProcessMemory,procinfo.hProcess,[edx + ecx * 4],ADDR Int3Code,1,NULL
  pop ecx
  inc ecx
  cmp ecx,8
  jb  @b
  invoke  WriteProcessMemory,procinfo.hProcess,0040C7BCh,ADDR DICode,1,NULL
  jmp DebugContinue


PS:由于暂时无法将做好的程序弄到网上来...so,拜托各位了m(_ _)m
PS2:昨晚试了用GPRS上网,吐血的感觉-o-
cheong00 - 2006/1/24 20:37:00
我想問一下你有試過不用debugger跑嗎.

根據PSDK的Documentation., 執行這API的process需要PROCESS_VM_WRITE和PROCESS_VM_OPERATION屬性. 在debugger下跑的話, 恐怕會被繼承下來... (這兩個屬性可以在OpenProcess()時設定)

P.S.: 用GPRS上網不單止慢, 還頗貴的... 因此從來不用... :P
LOVEHINA-AVC - 2006/1/24 20:45:00
当然,不用DEBUGGER的话就什么问题也没有,我的程序是一个简单的DEBUGGER

照理DEBUGGER应该是默认全权开放的.一定有一些地方没有做对,否则OD这些为什么就可以正常使用呢
cheong00 - 2006/1/24 20:51:00
以下引用LOVEHINA-AVC在2006-1-24 20:45:15的发言:
当然,不用DEBUGGER的话就什么问题也没有,我的程序是一个简单的DEBUGGER

照理DEBUGGER应该是默认全权开放的.一定有一些地方没有做对,否则OD这些为什么就可以正常使用呢

你是用CreatProcess(), OpenProcess()還是AttachProcess()開的? 就這一段code很難看出甚麼...
Prz - 2006/1/25 0:39:00
以下引用LOVEHINA-AVC在2006-1-24 20:13:40的发言:
开门见山吧,以DEBUG_PROCESS权限打开目标程序并用WriteProcessMemory写断点,不经过VirtualProtectEx的页属性修改就直接写code segment,将可能引发页面保护错误吗?


理论上说,应该会引发错误。但是可能不是100%在所有机器上都引发。如同1楼说的,在加载Debugger后运行的话,可能Debugger已经作了修改属性或者捕获了这个Exception。

曾经看过有一个强人做的从内存直接加载DLL文件,就有用户反映需要在某些个地方更改页面保护属性否则会出错,估计是和楼主一样的情况。
Rinrin - 2006/1/25 9:48:00
以下引用LOVEHINA-AVC在2006-1-24 20:13:40的发言:
开门见山吧,以DEBUG_PROCESS权限打开目标程序并用WriteProcessMemory写断点,不经过VirtualProtectEx的页属性修改就直接写code segment,将可能引发页面保护错误吗?

以下是我在EFZ.NET中的做法,没有使用VirtualProtectEx,但在我的JP VLK XP SP2上work well.不少用户向我呈递了执行异常的报告,状况大多为目标程序在初始化后被迅速关闭,因此我想就此了解一下原因所在

@@:

  push  ecx
  mov edx,OFFSET arrayBreakPoint
  invoke  WriteProcessMemory,procinfo.hProcess,[edx + ecx * 4],ADDR Int3Code,1,NULL
  pop ecx
  inc ecx
  cmp ecx,8
  jb  @b
  invoke  WriteProcessMemory,procinfo.hProcess,0040C7BCh,ADDR DICode,1,NULL
  jmp DebugContinue


PS:由于暂时无法将做好的程序弄到网上来...so,拜托各位了m(_ _)m
PS2:昨晚试了用GPRS上网,吐血的感觉-o-

代码段一般是只读的
写进去会出错呀
怎么会成功呢orz....
wdx04 - 2006/1/25 10:17:00
Windows 2000/XP中WriteProcessMemory调用了NtProtectVirtualMemory来改变页的保护属性,不会出错的。Windows 9x/Me应该也用了类似的方法。
可能是写入的代码本身有问题吧,我做的CLANNAD中文第一版程序就有个很低级的错误,按说想不引起页面保护异常都难,然而在许多系统上就是不报错。
LOVEHINA-AVC - 2006/1/25 10:21:00
我是没有跟过WriteProcessMemory,只是理所当然的认为Debugger不会受页面保护限制的……毕竟code segment对于程序自身来说是强制READ ONLY的,不用别名技术无法写东西进去
fish - 2006/1/25 15:48:00
OpenProcess()打开程序时用PROCESS_ALL_ACCESS参数的时候,整个Process的内存区都可读写,
包括code segment如果是想自己写个mini debugger来自调试的话,要确保程序只能被一个debugger在调试,
否则的话会出错的
-------------------------
如果是CreateProcess()的话,试试加个CREATE_SUSPENDED参数,
创建成功后用WriteProcessMemory()改写内存,
改写后再用ResumeThread()来恢复进程
1
查看完整版本: 有点唐突的帖子...(做程序的进)