前言
release版中, 尽最大可能使用寄存器变量.
如果一个寄存器变量在一段程序中, 在前10行是一个含义, 在后10行是另外一个含义, 看起来很头痛.
今天看了IDA中改名的UI上有参数可以指定改名的地址范围, 正好解决了这个问题.
逆向过程中的反汇编代码的可读性提高很多
改名后的例子
.text:00401000 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main proc near ; CODE XREF: start+AFp
.text:00401000
.text:00401000 iIn = dword ptr -4
.text:00401000
.text:00401000 divisor = esi ; 除数
.text:00401000 push ecx
.text:00401001 push divisor
.text:00401002 push edi ; 保存环境
.text:00401002 ; ;
.text:00401003 iUserInputBk = edi ; 用户输入
.text:00401003 INPUT_HALF = ecx ; 用户输入数值的一半
.text:00401003 push offset msg1 ; "请输入:"
.text:00401008 call _printf
.text:0040100D lea eax, [esp+10h+iIn]
.text:00401011 push eax
.text:00401012 push offset Format ; "%d"
.text:00401017 call _scanf
.text:0040101C mov iUserInputBk, [esp+18h+iIn]
.text:00401020 mov divisor, 2
.text:00401025 mov eax, iUserInputBk
.text:00401027 add esp, 0Ch ; 平栈 printf和scanf
.text:0040102A cdq
.text:0040102B sub eax, edx
.text:0040102D mov INPUT_HALF, eax
.text:0040102F sar INPUT_HALF, 1
.text:00401031 cmp INPUT_HALF, divisor
.text:00401033 jl short L_WAS_PRIME
.text:00401035
.text:00401035 PARSE_INPUT: ; CODE XREF: _main+41j
.text:00401035 mov eax, iUserInputBk
.text:00401037 cdq
.text:00401038 idiv divisor
.text:0040103A test edx, edx ; edx中余数
.text:0040103C jz short L_NOT_PRIME
.text:0040103E inc divisor
.text:0040103F cmp divisor, INPUT_HALF
.text:00401041 jle short PARSE_INPUT
.text:00401043
.text:00401043 L_WAS_PRIME: ; CODE XREF: _main+33j
.text:00401043 push offset msg2 ; "是素
.text:00401048 call _printf
.text:0040104D add esp, 4
.text:00401050 xor eax, eax ; ;
.text:00401050 ; ;
.text:00401052 pop edi ; 恢复环境
.text:00401053 pop divisor
.text:00401054 pop ecx
.text:00401055 retn
.text:00401056 ; ---------------------------------------------------------------------------
改名时的地址范围图例
Start address 和 End address默认是函数范围内有效, 改成在函数内需要的生效范围(只指定包含特定用途的地址范围).