吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1987|回复: 24
上一主题 下一主题
收起左侧

[原创] ida逆向分析简单递归

  [复制链接]
跳转到指定楼层
楼主
rookie66 发表于 2024-7-26 11:56 回帖奖励
先看源代码

然后编译生成exe并导入IDA

从左侧的函数栏就可以直接找到main函数(程序的入口函数)

这里可以直接忽略这两个代码块。因为这两块代码代表的是main函数和函数出口,有兴趣的同学可以单独分析一下。

剩下的就可以分为两块代码
一个是递归循环一个是结果打印这个ida很人性化的解析出来了num(int)这个函数
下面首先进入递归函数中进行分析

这个就是递归函数主要逻辑(可以看到iad对于源代码的还原性还是非常高的)
更细致化的分析的化
public _Z3numi
这个声明将 _Z3numi 函数标记为公共符号,使其可以在其他模块中被引用。

_Z3numi proc near
这是 _Z3numi 函数的开始标记,proc near 表示这是一个“近”函数,即函数调用不跨越 64 KB 边界。

arg_0= dword ptr 10h
这是函数的一个局部变量声明,表示 arg_0 是一个 DWORD 类型(4 字节)的局部变量,偏移量是 16(0x10)。

push rbp
将当前基指针 rbp 的值压入栈中,以保存调用函数之前的栈帧基址。

push rbx
将 rbx 寄存器的值压入栈中,以保存调用函数之前的 rbx 的值。rbx 通常用作通用寄存器,在函数调用中需要保留其值。


sub rsp, 28h
将栈指针 rsp 向下移动 40 字节(0x28),为局部变量分配空间。此操作相当于在栈上预留了 40 字节的空间。

lea rbp, [rsp+80h]
将 rsp + 128 字节(0x80)的地址加载到 rbp。这设置了新的栈帧基址。注意 0x80 可能是用于设置栈帧基址的调整。

mov [rbp-50h+arg_0], ecx
将 ecx 寄存器中的值存储到 [rbp - 80h + 10h] 的内存位置。计算后的地址是 [rbp - 0x50 + arg_0]。这里的 arg_0 是偏移量 0x10,所以实际的地址是 [rbp - 0x50 + 0x10]。这意味着 ecx 的值被存储在栈上基于 rbp 的计算位置。

cmp [rbp-50h+arg_0], 2
比较 [rbp - 0x50 + arg_0](即 ecx 存储的地方)的值与 2。arg_0 的偏移量已经考虑在内,所以实际比较的是 [rbp - 0x50 + 0x10] 的值与 2。

jnz short loc_40154E
如果比较结果不等于零(即 [rbp - 0x50 + arg_0] 的值不等于 2),则跳转到 loc_40154E 标签处的代码

mov eax, [rbp-50h+arg_0]
从 [rbp - 0x50 + arg_0] 内存位置(局部变量或函数参数)加载值到 eax 寄存器中。arg_0 偏移量已经计算在内,所以实际地址是 rbp - 0x50 + 0x10。

sub eax, 2
将 eax 寄存器中的值减去 2。这个操作的结果会在后续的计算中使用。

mov ecx, eax
将刚刚计算后的 eax 值([rbp - 0x50 + arg_0] - 2)移动到 ecx 寄存器中。

call _Z3numi
调用 _Z3numi 函数(即 num(int))。在调用约定下,ecx 寄存器的值作为参数传递给函数,函数执行后返回值会存储在 eax 中。

mov ebx, eax
将 _Z3numi 函数返回的值(存储在 eax 中)移动到 ebx 寄存器中。这表示 ebx 保存了 num(int) 函数调用的结果。

mov eax, [rbp-50h+arg_0]
重新从 [rbp - 0x50 + arg_0] 内存位置加载原始值到 eax 寄存器中。这是为了进行另一组计算。

sub eax, 1
将 eax 中的值减去 1。

mov ecx, eax
将刚刚计算后的 eax 值([rbp - 0x50 + arg_0] - 1)移动到 ecx 寄存器中。

call _Z3numi
再次调用 _Z3numi 函数,这次是用 ecx 中的新值作为参数,函数返回的结果会存储在 eax 中。

add eax, ebx
将 eax(第二次 _Z3numi 函数调用的结果)与 ebx(第一次 _Z3numi 函数调用的结果)相加,并将结果存储回 eax 中。

这个就是对于递归的细致化分析其中为什么会调用两次call 呢因为源代码中return num(i-2)+num(i-1);调用了两次num函数。
这个就是分析的过程了

感谢各位观众老爷的提醒,由于首次使用这个平台还有一些不熟练恳请原谅,如果有什么错误的地方还请各位大佬指正。

程序代码.zip

41.3 KB, 下载次数: 10, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
Hmily 发表于 2024-7-29 19:45
贴图方法错了,我帮你编辑了,看这个学习下方法,你弄复杂了https://www.52pojie.cn/misc.php? ... 29&messageid=36
沙发
gaoyanchen 发表于 2024-7-26 15:44
3#
 楼主| rookie66 发表于 2024-7-26 18:24 |楼主
4#
zmzwr 发表于 2024-7-27 01:09
没有图片呀
5#
laotzudao0 发表于 2024-7-27 10:34
这只有文字啊
6#
khoroamu 发表于 2024-7-27 11:13
图片没贴
7#
pjyang 发表于 2024-7-27 14:02
只有文字,图片能重新发一下么
8#
justwz 发表于 2024-7-27 19:52
图片没传上
9#
q75962619 发表于 2024-7-28 08:28
看不到图片
10#
BonnieRan 发表于 2024-7-28 10:43
分析的好细致,适合ida汇编逆向入门
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 11:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表