IDA Pro 7.0中MakeStr/create_strlit生成字符串异常求助
排查IDA Pro中
MakeStr/idc.create_strlit生成字符串异常的问题 从你的描述来看,生成的字符串开头多了个65,,且原字符串首字母A消失,这大概率和字符串编码逻辑、IDA的识别规则,或是未授权版本的功能限制有关,下面分几种情况拆解分析:
1. 首字符被误解析为长度前缀
注意到65正好是大写字母A的ASCII码(0x41=65),这说明IDA可能把字符串的首字节当成了Pascal风格的长度前缀,而非字符串本身的一部分。这种情况常见于:
- 你指定的地址范围包含了被误判的长度字节,而目标字符串实际是C风格(以
\0结尾)的无前缀ASCII串 - IDA默认的字符串识别类型被设为Pascal式,而非C式
验证&解决办法:
- 先手动检查内存:跳转到
ScreenEA()对应的地址,查看原始字节。如果首字节确实是0x41(即ASCII的A),那说明IDA错误地将其识别为长度值 - 调用API前先指定字符串类型为C风格:
idc.SetStrType(ScreenEA(), idc.STRTYPE_C) MakeStr(ScreenEA(), endaddress) - 若上述方法无效,可尝试将起始地址偏移1字节调用
MakeStr,观察是否能生成"tiRspPlusSecnRssi",反向验证首字节是否被误判
2. 未授权版本的功能限制
你使用的是未续费升级的IDA Pro 7.0早期版本,老版本的非授权/试用版可能存在功能阉割,包括字符串处理模块的异常行为——比如某些版本会对API生成的字符串强制添加额外格式(如长度值)。
验证&解决办法:
- 用IDA内置的字符串识别快捷键
A手动标记目标地址,看生成的结果是否正常。如果手动标记正常但脚本调用异常,基本可以确定是版本限制导致的API行为异常 - 若条件允许,可测试同版本的授权版是否有同样问题,或尝试升级到授权版本
3. 地址范围或参数错误
检查endaddress的准确性:如果endaddress超出了字符串的实际范围,或是ScreenEA()并非字符串的真正起始地址,也会导致生成结果异常。
验证&解决办法:
- 用
idc.GetManyBytes(ScreenEA(), 20)获取原始字节,手动转换为ASCII,确认首字节确实是A,且后续字节符合预期的字符串内容 - 确保
endaddress是字符串结束符\0的下一个地址,或是字符串最后一个有效字符的地址
4. IDA 7.0早期版本的已知Bug
你使用的7.0.170914是IDA 7.0的早期版本,存在一些字符串处理API的兼容性Bug,尤其是在32位地址空间下,MakeStr和idc.create_strlit可能会错误插入长度前缀。
解决办法:
- 替换为更可靠的手动实现逻辑,绕开可能有Bug的API:
ea = ScreenEA() str_content = [] # 手动读取直到遇到结束符 while idc.Byte(ea) != 0: str_content.append(chr(idc.Byte(ea))) ea += 1 # 标记字符串 idc.MakeStr(ScreenEA(), ea) - 升级到IDA 7.0的后续补丁版本,或更高大版本,修复已知的API问题
内容的提问来源于stack exchange,提问作者rockymaster
相关产品推荐
相关产品推荐

