目录
笔记
设置
Options - General,选择Line prefixes并设置Number of Opcode Bytes 为6.可以看到16进制代码
Options - General,选择Auto comments,IDA帮助注释
窗口
函数窗口:左拖拽,可以看到长度,以函数长度排序,过滤出规模大的函数
每个函数也关联了一些标志位(F,L,S)。L--库函数
名字窗口:函数名,命名代码,命名数据,字符串
字符串窗口:默认显示长度超过5个的字符ASCII字符串 通过setup来改动
导入表窗口
导出表窗口
结构窗口
链接
子链接:printf /sub_4010A0
本地链接:loc_40107E
偏移链接:内存偏移链接 字符串引用
导航栏
代码
浅蓝色:被FLIRT识别的库代码
红色:编译器生成的代码
深蓝色:用户编写的代码
数据
粉红色:导入数据
灰色:已定义数据
棕色:未定义数据
跳转
G键---跳转到虚拟地址或命名位置
Jump->Jump to File Offset---跳转到原始文件
搜索
Search--Next Code,移动光标到包含所指定的下一个位置
Search--Text,在整个反汇编窗口搜索一个指定的字符串
Search--Sequence of bites ,搜索指定数据和操作码组合
交叉
代码交叉:函数名 按X
数据交叉:跟踪二进制数据访问
p:是被调用的引用
r:是读取的引用
分析函数:
bp-based:基于EBP栈针的使用,局部变量和参数都通过EBP寄存器引用
var_4:局部变量,负位置
arg_0:参数,正位置
Alt+P 修正函数 勾选BP based frame 指定4bytes for Saved Registers
图形:
-----对当前的交叉引用,生成所有指向这一个函数
----本函数对其他函数的调用
使用命名常量:
可以任意选择
加载类型库:view - open subviews - type libraries查看当前加载的库
获取本地API的符号常量,ntapi
分析一个linux二进制时,gnuunx
重定义代码和数据:
U:取消定义
C :定义代码
D:定义数据
A:定义ASCII
IDAPython:
from idautils import *
from idc import *
heads = Heads(SegStart(ScreenEA()),SegEnd(ScreenEA()))
functionCalls = []
for i in heads:
if GetMnem(i) == "call":
functionCalls.append(i)
print "Number of calls found: %d" % (len(functionCalls))
for i in functionCalls:
SetColor(i,CIC_ITEM,0xc7fdff)
额外插件
zynamics bindiff使用:https://blog.csdn.net/lostspeed/article/details/71599430
Hex-Rays:
实验
Lab5
利用python 显示部分题的答案
print "1.------------------_DllMain@12处的地址-------------------"
print hex(LocByName("_DllMain@12"))
print "2.------------------gethostbyname处的地址-------------------"
print hex(LocByName("gethostbyname"))
print "3.------------------对gethostbyname的引用-------------------"
for addr in CodeRefsTo(LocByName("gethostbyname"), 0):
print (addr, GetDisasm(addr))
print "4.------------------0x10001757处的DNS-------------------"
for i in range(5):
ea = PrevHead(0x10001757-i)
print (hex(ea), GetDisasm(ea))
print "5.6.------------------0x10001656处的变量-------------------"
stack_frame = GetFrame(0x10001656)
frame_counter = 0
var_count = 0
frame_size = GetStrucSize(stack_frame)
while frame_counter < frame_size:
member = str(GetMemberName(stack_frame, frame_counter))
if member != ' r' and member != 'None':
var_count += 1
try:
frame_counter += GetMemberSize(stack_frame, frame_counter)
except:
frame_counter += 1
else:
frame_counter += 1
print var_count
print "7.-----------------\cmd.exe /c处的地址-------------------"
for item in Strings():
if "\cmd.exe /c" in str(item):
for addr in DataRefsTo(item.ea):
print hex(addr)