能力值:
( LV2,RANK:10 )
|
-
-
2 楼
你把写保护关了?copy on write依赖这个的。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你的意思是本来会自动CopyOnWrite的,是因为我关了写保护才导致修改后是全局性的吗?
因为改的是映像里的代码默认不可写,不关的话写不进入
我用过别的实现,改后也是全局性的,代码像这样,其实我也不太理解,不知道代码是不是哪里的问题
...
pMdl = IoAllocateMdl((PVOID)pFun, sizeof(_patchcode), FALSE,FALSE,NULL);
if (pMdl)
{
...
MmProbeAndLockPages(pMdl, UserMode, IoReadAccess);
...
pWritableP = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmNonCached, NULL, FALSE, NormalPagePriority);
status = MmProtectMdlSystemAddress(pMdl,PAGE_EXECUTE_READWRITE);
memcpy(pWritableP, &_patchcode, sizeof(_patchcode));
MmUnmapLockedPages(pWritableP,pMdl);
MmUnlockPages(pMdl);
IoFreeMdl(pMdl);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你去查一下copy on write是如何实现的,你应该用NtProtectVirtualMemory修改保护方式,这个和页的写保护不一样
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
ZwProtectVirtualMemory
ZwWriteVirtualMemory
要是内核有导出这两个就没这么麻烦了,偏偏都是不导出,又不想用非常规方法去搜地址
|
能力值:
( LV9,RANK:610 )
|
-
-
6 楼
用其它方法写,直接wpoff就把所有的都改了……
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
因为要写的内存还得解决read-only的问题。
你帮我看看我在3楼贴的那个代码,没有用WP off,同样也会把所有的都给改了
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
3楼的差不多,都是直接改写那块物理地址,而没有备份
利用ntdll.dll调用NtProtectVirtualMemory
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
谢谢你,
在驱动里可以调用ntdll.dll的NtProtectVirtualMemory吗?
内核中ZwProtectVirtualMemory没导出
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
ntdll.dll每次开机后地址固定,它导出了NtProtectVirtualMemory,可以调用
如果不行你可以从ntdll.dll的NtProtectVirtualMemory得到服务号,然后在ssdt中找到地址
|
能力值:
( LV9,RANK:140 )
|
-
-
11 楼
阿弥陀佛!!!路过。。。
|
能力值:
( LV9,RANK:610 )
|
-
-
12 楼
我记得Mdl方法不是全局的啊,而且3楼的代码有WriteAccess吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
有WriteAccess啊,也确实是全局……
看来最简单的,还得是非常规手段,取索引号,搜索代码特征找ZwProtectVirtualMemory,
如果用索引号从ssdt取NtProtectVirtualMemory,Nt*这个调用起来还麻烦点,可能参数地址要处理,否则老失败。
|
|
|