如何在ndisasm反汇编代码中查找字符串常量的引用?
如何在ndisasm反汇编结果中定位字符串常量的引用?
用ndisasm反汇编程序时,它无法区分字符串常量、元数据和指令,常会把字符串字节解析成无效指令(比如你给出的例子)。虽然能通过转ASCII找到空终止字符串,但直接搜索字符串起始地址(如0x20CA4)往往找不到引用,可按以下方法处理:
实用定位方法
- 搜索地址的字节序列:32位程序中小端模式下,地址
0x20CA4对应的字节是A4 0C 02 00,直接在反汇编的机器码部分搜索这个字节序列——程序引用字符串时,通常会把地址作为立即数(比如push 0x20CA4)或加载到寄存器(比如mov eax, 0x20CA4),这些指令的机器码会包含该字节序列。 - 从函数调用上下文入手:版权类字符串通常会被
printf、puts等输出函数引用,找反汇编中这些函数的调用点,查看调用前的指令——比如调用puts前通常会push字符串地址,或把地址加载到寄存器中。 - 修正ndisasm的解析混乱:先手动标记字符串所在的地址范围为数据(比如用
ndisasm -b 32 -o 0x20000 your.exe指定正确的起始偏移和位数,或跳过字符串区域重新解析剩余代码),减少无效指令干扰后,更容易找到指向该区域的内存访问指令。 - 结合调试器跟踪:如果有调试器,直接在字符串地址
0x20CA4下内存访问断点,程序运行触发断点时,当前指令或调用栈就能直接显示引用它的代码位置。
示例说明
比如你遇到的ndisasm错误解析:
00020CA3 00426F add [edx+0x6f],al 00020CA6 726C jc 0xd14 00020CA8 61 db 0x61 00020CA9 6E outsb 00020CAA 6420432B and [fs:ebx+0x2b],al 00020CAE 2B db 0x2b 00020CAF 202D20436F70 and [0x706f4320],ch 00020CB5 7972 jns 0xd29 00020CB7 69 db 0x69 00020CB8 67 a32 00020CB9 68 db 0x68 00020CBA 7420 jz 0xcdc 00020CBC 31 db 0x31 00020CBD 39 db 0x39 00020CBE 39 db 0x39 00020CBF 31 db 0x31 00020CC0 20426F and [edx+0x6f],al 00020CC3 726C jc 0xd31 00020CC5 61 db 0x61 00020CC6 6E outsb 00020CC7 6420496E and [fs:ecx+0x6e],cl 00020CCB 746C jz 0xd39 00020CCD 2E00446976 add [cs:ecx+ebp*2+0x76],al
实际对应的是字符串常量:
00020CA4 Borland C++ - Copyright 1991 Borland Intl.\x00
内容的提问来源于stack exchange,提问作者user19827315
相关产品推荐
相关产品推荐

