KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

有点唐突的帖子...(做程序的进)

[ 4334 查看 / 8 回复 ]

开门见山吧,以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-
分享 转发
TOP

回复:有点唐突的帖子...(做程序的进)

我想問一下你有試過不用debugger跑嗎.

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

P.S.: 用GPRS上網不單止慢, 還頗貴的... 因此從來不用... :P
TOP

回复:有点唐突的帖子...(做程序的进)

当然,不用DEBUGGER的话就什么问题也没有,我的程序是一个简单的DEBUGGER

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

回复:有点唐突的帖子...(做程序的进)

以下引用LOVEHINA-AVC在2006-1-24 20:45:15的发言:
当然,不用DEBUGGER的话就什么问题也没有,我的程序是一个简单的DEBUGGER

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

你是用CreatProcess(), OpenProcess()還是AttachProcess()開的? 就這一段code很難看出甚麼...
TOP

回复:有点唐突的帖子...(做程序的进)

以下引用LOVEHINA-AVC在2006-1-24 20:13:40的发言:
开门见山吧,以DEBUG_PROCESS权限打开目标程序并用WriteProcessMemory写断点,不经过VirtualProtectEx的页属性修改就直接写code segment,将可能引发页面保护错误吗?


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

曾经看过有一个强人做的从内存直接加载DLL文件,就有用户反映需要在某些个地方更改页面保护属性否则会出错,估计是和楼主一样的情况。
飛べない翼に、意味はあるんでしょうか?
TOP

回复:有点唐突的帖子...(做程序的进)

以下引用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....
TOP

回复:有点唐突的帖子...(做程序的进)

Windows 2000/XP中WriteProcessMemory调用了NtProtectVirtualMemory来改变页的保护属性,不会出错的。Windows 9x/Me应该也用了类似的方法。
可能是写入的代码本身有问题吧,我做的CLANNAD中文第一版程序就有个很低级的错误,按说想不引起页面保护异常都难,然而在许多系统上就是不报错。
1

评分次数

    KEYFC第二届版杀 - 川澄 舞
    TOP

    回复:有点唐突的帖子...(做程序的进)

    我是没有跟过WriteProcessMemory,只是理所当然的认为Debugger不会受页面保护限制的……毕竟code segment对于程序自身来说是强制READ ONLY的,不用别名技术无法写东西进去
    TOP

    回复:有点唐突的帖子...(做程序的进)

    OpenProcess()打开程序时用PROCESS_ALL_ACCESS参数的时候,整个Process的内存区都可读写,
    包括code segment如果是想自己写个mini debugger来自调试的话,要确保程序只能被一个debugger在调试,
    否则的话会出错的
    -------------------------
    如果是CreateProcess()的话,试试加个CREATE_SUSPENDED参数,
    创建成功后用WriteProcessMemory()改写内存,
    改写后再用ResumeThread()来恢复进程
    TOP