我正在尝试读取内核映像并计算此映像的校验和值。首先,我使用smc指令来触发异常,在异常处理程序中,我尝试读取图像的第一个字节。我真的不知道地址是什么,但是从一些文档来看,我知道内核映像在地址中解压缩,如0x20008000,0x30008000或0xC0008000(他们称之为ZRELADDR,我真的不知道这是否是正确的地址。 ..)。所以我试着读这样的记忆:
from pyx509.models import PKCS7
pkcs7 = PKCS7.from_der(here_goes_your_pks7_signature_data_der_encoded)
signer_info = pkcs7.content.signerInfos[0]
auth_attrs = signer_info.auth_attributes
for attr in auth_attrs.attributes:
if attr.type == '1.2.840.113549.1.9.4': # Message Digest OID
message_digest = attr.value
print "Digest: %s#%s" % (signer_info.oid2name(signer_info.digest_algorithm), messageDigest)
但系统因数据中止异常而崩溃,
uint32_t test;
test = * (uint32_t *)0x30008000;
DMSG("test : %x\n",test);
我想我走错了路。有谁知道如何在运行时环境中读取内核映像?
感谢您的帮助!
编辑:感谢您的回复。我说的是安全内核。我试图在TrustZone下检查内核的完整性,并确保内核不会受到损害。所以我猜哈希值之类的校验和可能对我有帮助。另外,我是一个试图熟悉arm内存系统的新手,所以我试着从简单读取一些特定的内存地址开始。我试图读取0xc0000000,因为Artless Noise说,但同样的错误再次出现。我再次尝试在System.map中找到“_test”和“stext”地址,即0x80008000,并再次发生错误。
答案 0 :(得分:0)
RAM的开头通常映射在0xC0000000。这取决于CONFIG_PAGE_OFFSET:
- VMSPLIT_3G: 0xC0000000
- VMSPLIT_2G: 0x80000000
- VMSPLIT_1G: 0x40000000
请注意,如果您有MMU(通常情况),这是一个虚拟地址,物理地址将取决于您的实际架构(它可能是也可能不是0x00000000)。之后,内核会加载几页,偏移量为0x8000。
所以,你可以在0xC0008000找到(未压缩的)内核,但它也可能位于其他地方。
您也可以尝试ioremap()偏移RAM的0x8000。
您能否就我们正在进行的特定SoC提供更多信息?
答案 1 :(得分:0)
如果您处于安全模式并且您认为在安全模式下它访问物理地址,那么从这些宏下方可以推断出物理地址。
内核加载的物理地址为PHYS_OFFSET + TEXT_OFFSET(文本偏移量为0x8000),
PHYS_OFFSET定义将取决于CONFIG_ARM_PATCH_PHYS_VIRT补丁。
如果定义了CONFIG_ARM_PATCH_PHYS_VIRT,则PHYS_OFFSET将等于__pv_phys_offset,否则PHYS_OFFSET将在内核配置文件中定义为CONFIG_PHYS_OFFSET。