能力值:
( LV3,RANK:20 )
|
-
-
2 楼
呼叫大牛阿, 这问题郁闷了小弟好久了阿。 感觉来说应该是什么选项的问题, 因为虚拟机里没事,实体机有问题,那应该就是选项哪里不同了, 可问题是什么选项 搞了老半天了也不知道。惆怅啊---
|
能力值:
( LV13,RANK:240 )
|
-
-
3 楼
我曾经测试是在虚拟机内有问题。在实体机没问题。好像问题是 我要搜索的特征码内存中不存在,假设是内核中的函数a,WIN32对应函数是b.我先搜a的特征码,居然在内核中不存在,但是我R3调用一次函数b,然后就可以找到了。不知道是不是这个问题。
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
自己用 MmIsAddressValid扫描一下不就行了???
或者用A盾的MmIsAddressValidEx强力扫描一下,就明白是不是内存不存在的原因了~~~
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
这种代码绝对不能用于商品中
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
还在努力学习中,期待有天能解答类似问题
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
为什么要硬编码呢,内核加载地址不同语言的都不一样的
放着ZwQuerySystemInformation函数不用,非用硬编码
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
并不是这样的, 我的感觉是并非是特征码不存在的原因, 而是说内核模块映射的基地址 和 映射 的大小 这一段区间的 地址, 有的是不能访问的, 按理说这一段区间是应该可以访问的 ,因为访问的大小在内核文件的镜像大小的那个区间内。。
使用硬编码这些都不用在意,只是为了用于测试方便阿。重点的是这个问题 , 我很怀疑的是是不是跟某个选项是否开启有关系。
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
就算特征码不存在, 那也应该在for循环到头就会退出了 ,而并没有到头,就退出是 蓝屏了 。
那么就说明并不是特征码不存在的原因导致的。 而是这段区间中有的地址并不能访问。
而这样的一段区间 我在虚拟机里是都可以访问的,而实体机却不行,
所以我怀疑的是什么选项没有开启的问题。
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
这样好像挺神奇的样子,没试过. 按理说不应该这样阿, 因为虚拟机内我也没有任何这样的调用的,但还就是找到了,
我那段写的代码 应该是如果即使是特征码不存在, 那也不应该会蓝屏阿, 应该是在for循环到头就退出了才是。
问题就是出现在 这一段区间中有地址是不能访问的,而这一段区间是内核文件映射的基地址 + 大小的那一段区间, 这样的一段区间为什么会这样呢,想不通了
|
能力值:
( LV13,RANK:240 )
|
-
-
11 楼
那一段是不是属于同一个文件哦。如果不是同一个文件很可能中间会有断开的地方
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
这个回答挺好,我试试看.
|
能力值:
( LV4,RANK:40 )
|
-
-
13 楼
貌似不是每个物理地址都能读到,在KD里反汇编了下,虽然地址在范围内,但却是没显示
猜测内核之所以有重定位与这个也有关
|
能力值:
( LV3,RANK:20 )
|
-
-
14 楼
MmIsAddressValidEx
MmIsAddressValid
这两个函数都试了,貌似还是不行, 函数确实对???这类的内存会返回一个0值,但是返回1值内的一些内存貌似还是有些不能访问的问题,汗,真心蛋疼
for ( int i = 0x804d8000; i < 0x806E5000; i++ )
{
BOOL is = MmIsAddressValidEx((DWORD*)i);
if ( is == 1 )
{
if ( MmIsAddressValid((DWORD*)i) )
{
//能访问
DbgPrint("能访问 地址 %x",i);
if ( *(DWORD*)i == c1_PsCrPr )
{
DbgPrint("找到了 地址 %x",i);
}
}
}
else
{
DbgPrint("不能访问");
i += 4;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
15 楼
按理说那段内存应该是属于同一个文件的映射后的内存才对,因为基地址是内核文件映射的基地址 而大小也是映像大小。
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
访问的都是本机实体机的, 理应不应该会存在重定位问题阿,我只是想要取那地址的值做个判断而已的
|
能力值:
( LV4,RANK:40 )
|
-
-
17 楼
先尝试能不能读出字节吧
同样也测测VM是否有不可访问的内存吧
不好意思,这里多按了下发帖
|
能力值:
( LV4,RANK:40 )
|
-
-
18 楼
个人觉得要不就是没使用的内存,要不就是不能Read
暂时先使用枚举内存NT函数好些
蓝屏代码会给你帮助
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
扯弟。。。你这代码实在是太蛋疼了。。。。话说MmIsAddressValid和MmIsAddressValidEx在某些时候也不准确,本来可以访问的内存他居然返回false。。。还是用mj的物理内存对比法比较实用。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
|
能力值:
( LV5,RANK:70 )
|
-
-
21 楼
内存被换出了啊 ...不安全访问啊.,.各种叉叉..
|
能力值:
( LV3,RANK:20 )
|
-
-
22 楼
分页是很可能的,也有想过这问题,可就是不是很确定。
MmIsAddressValidEx 这个函数话说检测的真心不准确阿, A盾里A出来的代码..
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
硬编码的话,需要注意,debug模式下的内核和正常的不一样。
|
能力值:
( LV9,RANK:380 )
|
-
-
24 楼
[QUOTE=诶一;1165613]for ( int i = 0x804d8000; i < 0x806E5000; i++ )
{
BOOL is = MmIsAddressValidEx( (DWORD*)i);
if ( is == 1 )
{
if ( MmIsAddressValid( (DWORD*)i) )
{
//能访问
DbgPrint("能访问 地址 %x",i);
if ( *(DWORD*)i == c1_PsCrPr )
{
DbgPrint("找到了 地址 %x",i);
}
}
}
else
{
DbgPrint("不能访问");
i += 4;
} [/QUOTE] 红色部分是什么情况?看着很别扭,为啥不是 MmIsAddressValidEx( (PVOID)i)
自己编译吧:
#include <ntddk.h>
//卸载函数
VOID Unload (IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("卸载完成!\n");
}
//入口函数
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
PUCHAR i;
BOOLEAN retOK;
DriverObject->DriverUnload = Unload;
for ((ULONG_PTR)i = 0x804d8000; (ULONG_PTR)i < 0x806E5000; i++ )
{
__try{
retOK = MmIsAddressValid((PVOID)i);
if (retOK == TRUE)
{
if (MmIsAddressValid((PVOID)i))
{
//能访问
DbgPrint("能访问 地址 %x\r\n",i);
if (*i == 0xe9 )
{
DbgPrint("找到了 地址 %x\r\n",i);
}
}
}
else{
DbgPrint("不能访问\r\n");
(ULONG_PTR)i += 4;
}
}__except(EXCEPTION_EXECUTE_HANDLER){
DbgPrint("Exception:%08x\n",GetExceptionCode());
break;
}
}
return STATUS_SUCCESS;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
25 楼
红色我也不知道,咋回事, 貌似打上去后就成这样了。
已经有个朋友告诉了我解决方法,是锁定分页或者MmDbgCopyMemory用这个函数,不过还没弄过..ddk里的说明说的就是MmIsAddressValidEx即时返回true,也不一定这个内存是可以访问的。
|
|
|