首页
社区
课程
招聘
[原创]<从0开始学ida逆向>笔记(P1~P104)
2021-11-1 15:17 9678

[原创]<从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


函数调用时参数的入栈情况

  1. 参数从右往左入栈(除个别是从左往右入栈;ecx存储的this指针先入栈)

  2. 函数返回地址

  3. 旧ebp地址入栈

  4. 局部变量


argc、argv、envp由于是main函数的参数,没有被使用,ida会删掉他们



[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2021-11-1 15:19 被大河向东流哇编辑 ,原因: 未选择话题
收藏
点赞5
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回