-
-
[原创]<从0开始学ida逆向>笔记(P1~P104)
-
2021-11-1 15:17 9678
-
OFFSET、LEA与MOV的区别
“OFFSET”说明传递的是内存地址,而不是内存的值
mov eax,offset dword_460000
按Q键,这条指令会转换为 mov eax,460000.
右键可以从mov eax,460000恢复成mov eax,offset dword_460000
mov eax,offset dword_460000 //将0x460000这个地址传给eax
mov eax,dword_460000 //将0x460000这个地址的值传递给eax
LEA EAX,[4+5]指令将运算结果 9 传给 EAX,而不会 像 MOV EAX,[4+5]指令那样将地址 0x9 上存储的内容传给 EAX。
(lea传递的是结果 mov传递的是存储的值(OFFSET 除外))(offset传地址)
导入函数不易读的解决办法
选择options-demangle names中勾选names:
nop==no operation
指令和数据间的转换
如果code区块无法解析为指令的话,则会视作数据
如果函数中间有不识别的指令,ida将无法创建函数,当改为可识别指令之后可以右键:创建函数(patch菜单上的patched bytes功能能显示所有修改的字节,也能将修改取消)
取消修改:
LPCTSTR ==char[]
DS:程序将把字符串的起始地址存储在数据区块上(data stack)
LEA指令通常用于传递后一个操作数的地址或者运算结果,而非取内容(区别于mov);普遍运用于获取变量参数的地址
var与arg
var_变量(比如:int a=20 -> mov [ebp+var_变量,eax])
arg_参数
汇编中的加减乘除
IDIV x:除法
eax 除以 x :商存入eax,余数存入edx
IMUL:乘法
有两种方式:
Imul eax,[ecx]//eax*[ecx]存入eax
Imul esi,edi,25//edi*25 存入esi
NOT A :对A按位取反
NEG A:将A变为-A(按位取反后+1)
EIP:下一条要执行的指令
跳转指令
jmp short
无条件段跳转 第一个字节是跳转操作吗,第二个字节表示跳转方向
如:EB 05 jmp short loc_xxxxxx
即,EB是jmp的操作码,会跳转到指令结束后的后五个字节处,xxxxxx+2+5
05:要跳的字节数
+2:加上指令本身的长度(short:2字节)
Shift+F7打开Program Segmentation 查看pe区段结构
ida快照的保存与查看
FILE-TAKE DATABASE SNAPSHOT 保存ida快照
查看保存的ida快照:
字符串恢复显示
字符串如果是以字节方式显示,如下图:
此时按下A键,可恢复成完整的字符串
如果sub_xxx+xx中xxx的值一样,xx的值不一样说明是调用的同一个地址,但是下图的xxx值不一样,所以调用的地址不同:
如何将数组转化为缓冲区/字符数组?
源代码中的局部变量:
对应的反汇编代码:
buf中存的是120个字节的缓冲区
点击buf后可见:
buf-右键-array
结果:
DUP 表示重复(duplicate)120
函数调用时参数的入栈情况
参数从右往左入栈(除个别是从左往右入栈;ecx存储的this指针先入栈)
函数返回地址
旧ebp地址入栈
局部变量
argc、argv、envp由于是main函数的参数,没有被使用,ida会删掉他们
[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法