给IDA中的寄存器变量命名的技巧

前言

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默认是函数范围内有效, 改成在函数内需要的生效范围(只指定包含特定用途的地址范围).
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值