梦幻的彼岸 发表于 2024-4-15 13:38:09

[IDA使用技巧]#020: “游历四方”

翻译:梦幻的彼岸原文地址: https://hex-rays.com/blog/igors-tip-of-the-week-20-going-places/

即使你更喜欢通过点击在 IDA 中移动,也应该记住 G 快捷键。该快捷键背后的操作名为 "Jump to address",但它的功能远不止这个名字。跳转到地址首先是实际跳转到地址:输入要跳转到的地址值。可以用0x作为前缀,表示十六进制符号,但这是可选项:如果没有前缀,输入的字符串将被解析为十六进制数。https://www.hex-rays.com/wp-content/uploads/2020/12/jumpaddr.png
在采用分段架构(如16位x86)的系统中,可以使用段:偏移量的语法。其中,段可以是符号名称(如seg001、dseg),也可以是十六进制数值(如F000);偏移量则应为十六进制形式。若当前数据库同时包含分段寻址和线性(flat)寻址的段(例如,一个包含32位保护模式操作系统映像的高内存区的遗留16位引导程序),可使用“segmentp[节]”0来强制使用线性地址(如0:1000000)。跳转到当前位置 如果输入值的前缀是 + 或 - ,则将其视为光标位置的相对偏移量。同样,0x前缀是可选的: +100向前跳转 256 字节,-10000向后跳转 64KiB(65536 字节)。跳转到名称输入程序中的名称(函数名、全局变量名或标签)可直接跳转到该名称。需要注意的是,原始名称应按照程序中的用法输入,并尽可能使用特殊符号,例如_main表示main(),??2@YAPEAX_K@Z表示操作符 new()。https://www.hex-rays.com/wp-content/uploads/2020/12/jumpname.png跳转到表达式可以使用 C 语法表达式来代替bare[空]地址或名称。与 C 语言一样,十六进制数字必须使用0x前缀,否则将假定为十进制。这里可以使用名称或特殊关键字(并解析为其地址)。举几个例子
[*]此处 + 32*4:跳转 32 个字符。相当于+80
[*]_main - 0x10:跳转到函数 main() 之前 0x10 字节的位置
[*]f2 + (f4-f3):复杂情况下可使用多个符号
使用寄存器在调试过程中,可以使用寄存器名称作为变量,与前面示例中的名称类似。例如,可以跳转到EAX、RSP、ds:si(16 位 x86)、X0+0x20(ARM64)等。这在反汇编和十六进制视图中均有效。https://www.hex-rays.com/wp-content/uploads/2020/12/jumpreg.png
页: [1]
查看完整版本: [IDA使用技巧]#020: “游历四方”