能力值:
( LV4,RANK:50 )
|
-
-
51 楼
看看怎么个Hook法,mark一下
|
能力值:
( LV2,RANK:10 )
|
-
-
52 楼
|
能力值:
( LV12,RANK:750 )
|
-
-
53 楼
注意操作系统的写时复制机制
|
能力值:
( LV2,RANK:10 )
|
-
-
54 楼
mark……学习ing
|
能力值:
( LV2,RANK:10 )
|
-
-
55 楼
路过,发现好帖,于是顶之
|
能力值:
( LV8,RANK:120 )
|
-
-
56 楼
好像蛮好看的..
|
能力值:
( LV4,RANK:50 )
|
-
-
57 楼
我来淡一下个人看法:
这一个问题是关于内存copy by written的问题,其实这不算bug,只不过半斤你研究时现解不对导致的问题,因为你下int 3断点时,使用的方法不对,导致破坏了这一种机制的产生,打比方,window的进程是独立的,意思就是说,他的独立性是针对进程内部的程序来说的,你要是在他程序里面使用mov byte ptr[7743F8EB],0cch,这样的代码来加入int 3断点的,你就可以看到他只会修改一个进程的内容,另外的进程不受影响,另外如果其它进程需要修改它产生同样的效果,可以用函数WriteProcessMemory,这样也可以成功产生相同的效果,但你使用的windbg的内存修改内存的办法,这样他只不过是简单地直接把0xcc写到了物理页内存上,那样就变为全局断点了,我猜测windbg修改这一个int 3断点时,根本没有触发0x0e异常,也不会触发到copy write的处理过程。
|
能力值:
( LV13,RANK:520 )
|
-
-
58 楼
NICE!
不知在R3下,能实现COW的效果吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
59 楼
R3下是可以实现,你进程内直接用mov byte ptr[7743F8EB],0cch来写断点,就可以产生了。
|
能力值:
( LV13,RANK:520 )
|
-
-
60 楼
[QUOTE=cpu;1119982]R3下是可以实现,你进程内直接用mov byte ptr[7743F8EB],0cch来写断点,就可以产生了。[/QUOTE]
CPU您好,你误解我的意思了,我是说,R3下,能否实现,COW.
我的意思是说自己编程实现. 修改一进程的USER32内存,能实现修改所有进程中的USER32中的数据.
并不是在WINDBG下实现修改.
|
能力值:
( LV4,RANK:50 )
|
-
-
61 楼
RING3下好象不成,RING0才可以,因为RING3修改时,会产生异常的,系统对于系统的dll有保护,虽然你可以用API改变内存地址的属性,但还是突破不了。
|
能力值:
( LV13,RANK:520 )
|
-
-
62 楼
看来我在WINDBG中修改的.并不是R3下实现的了.
谢谢啦.
|
能力值:
( LV2,RANK:10 )
|
-
-
63 楼
分析得很精僻,可惜看不太懂,留个脚印,收下以后看
|
能力值:
( LV15,RANK:440 )
|
-
-
64 楼
由于是用windbg连接虚拟机中的操作系统内部的调试模块,实质上还是R0中完成的写内存,更改物理内存的的任务.如果LZ用windbg调试主系统的进程那就是纯R3了.
|
能力值:
( LV2,RANK:10 )
|
-
-
65 楼
先回复,再学习!
|
能力值:
( LV13,RANK:388 )
|
-
-
66 楼
不可能,r3下关不掉写保护,必然触发写异常,继而触发cow
|
能力值:
( LV3,RANK:20 )
|
-
-
67 楼
我估计,系统有一个函数,和硬盘还原原理差不多,当某个DLL物理地址被更改时,在别处写下更改值,当当前进程再次读取时.读取新址.但是你直接把虚拟机系统中断了.系统没办法运行.不能知道你修改了哪个.所以直接当作你没修改处理.而已经加载过的程序不影响,我也不太清楚,或许系统在每个进程空间有备份.新建的进程,他就会读取源地址,但是物理地址已经在系统不知情的状态下被更改,所以...
|
能力值:
( LV7,RANK:110 )
|
-
-
68 楼
大概明白了楼主的意思,其实,楼主第一次是用OD修改,引发了COW,实际上修改的是map以后的物理代码,但是映射是在同一个虚拟地址上,第二次是wdg来修改的,未触发COW,直接改的物理内存实体的代码,然后根据这个修改的内存映射到不同进程的虚拟地址中。
|
能力值:
( LV9,RANK:140 )
|
-
-
69 楼
在OD里修改页面触发PAGE_WRITECOPY,代码将引起代码访问违规,系统在页交换文件中创建该页面的私有副本,修改的是页交换文件上数据,所以其它进程不受到影响~
“转换公式,我们就按照虚拟机的小内存(10/10/12)的方式来转换.
重点看二进制. Binary: 01110111 01000011 11111000 11101011
我们将这32位线性地址,按10/10/12 方式拆分为.
01110111 01000011 11111000 11101011 // 拆分前
0111011101 0000111111 100011101011 // 拆分后
0001 1101 1101 // 前10位重组后为 0x1DD
0000 0011 1111 // 中10位重组后为 0x3F
1000 1110 1011 // 后12位重组后为 0x8EB
”
小内存也不一定是10/10/12 方式拆分,
也可能是2/9/9/12拆分,
当然也有大页面的10/22等其它拆分方式,
不同的线性地址拆分方法是不一样的,
如果笼统认为10/10/12 方式拆分那算出来的物理地址不一定正确~
|
能力值:
( LV2,RANK:10 )
|
-
-
70 楼
make
|
|
|