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

转载 2016年08月30日 23:10:30

前言

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

相关文章推荐

一个用于提取内存的IDA脚本

import struct start = AskAddr(0x2D590 , "start address:") print "start address:%08x"%(start) length ...

Android安卓破解之逆向分析SO常用的IDA分析技巧

1、结构体的创建及导入,结构体指针等。 以JniNativeInterface, DexHeader为例。 解析Dex的函数如下: F5后如下: File->load...
  • asmcvc
  • asmcvc
  • 2016-03-31 14:21
  • 5267

IDA Pro使用技巧及大杂烩

IDA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window)。 IDA图形视图会有执行流,Yes箭头默认为绿色...

IDA技巧篇实验程序三

  • 2014-11-07 14:02
  • 40KB
  • 下载

寄存器变量

在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C\C++语言还定义了一种变量,不是保...

C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量)

一、动态存储方式与静态存储方式 上一节已介绍了变量的一种属性——作用域,作用域是从空间的角度来分析的,分为全局变量和局部变量。 变量还有另一种属性——存储期(storage duration,也称...
  • tdmyl
  • tdmyl
  • 2013-09-12 19:08
  • 520

C++变量的存储类别(动态存储、静态存储、自动变量、寄存器变量、外部变量)

动态存储方式与静态存储方式 我们已经了解了变量的作用域。作用域是从空间的角度来分析的,分为全局变量和局部变量。   变量还有另一种属性——存储期(storage duration,也称生命期)。...

[zt] 全局变量、静态全局变量、静态局部变量和局部变量,寄存器变量的区别

http://hi.baidu.com/bluesealjw/blog/item/c17377233dc315a24623e892.html also: http://topic.csdn.net/t...

C/C++中的寄存器变量

在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C\C++语言还定义了一种变量,不是保...

寄存器变量

变量一般情况下都存在于内存中。如果程序需要使用某个变量,CPU的控制器将从内存中取得变量值后会将其暂存在寄存器中。寄存器就是CPU自己的"小内存",它的特点是"容量小、速度快"。正常情况下,编程语言本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)