关闭

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

645人阅读 评论(0) 收藏 举报
分类:

前言

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    资料链接1