ida arm64 base function

文章详细解析了C++中的三个内存操作函数:memcpy、memmove和mem_cmp的汇编代码实现,包括它们的参数处理、条件判断和循环结构,有助于理解底层内存操作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__int64 __fastcall memmove(__int64 a1, __int64 a2, unsigned __int64 a3)
{
  unsigned __int64 v5; // x3
  unsigned __int64 v6; // x5
  unsigned __int64 v7; // x1
  __int64 i; // x0

  if ( a1 - a2 >= a3 )
    return memcpy(a1, a2, a3);
  v5 = a1 + a3;
  v6 = a2 + a3;
  v7 = a1 + ~(a1 + a3);
  for ( i = 0i64; v7 != --i; *(_BYTE *)(v5 + i) = *(_BYTE *)(v6 + i) )
    ;
  return a1;
}

ROM:000000008001A14C ; =============== S U B R O U T I N E =======================================
ROM:000000008001A14C
ROM:000000008001A14C
ROM:000000008001A14C memmove                                 ; CODE XREF: sub_8001BD10+60↓p
ROM:000000008001A14C                 SUB             X6, X0, X1
ROM:000000008001A150                 MOV             X4, X0
ROM:000000008001A154                 CMP             X6, X2
ROM:000000008001A158                 B.CC            loc_8001A160
ROM:000000008001A15C                 B               memcpy
ROM:000000008001A160 ; ---------------------------------------------------------------------------
ROM:000000008001A160
ROM:000000008001A160 loc_8001A160                            ; CODE XREF: memmove+C↑j
ROM:000000008001A160                 ADD             X3, X0, X2
ROM:000000008001A164                 ADD             X5, X1, X2
ROM:000000008001A168                 MVN             X1, X3
ROM:000000008001A16C                 ADD             X1, X0, X1
ROM:000000008001A170                 MOV             X0, #0
ROM:000000008001A174
ROM:000000008001A174 loc_8001A174                            ; CODE XREF: memmove+44↓j
ROM:000000008001A174                 SUB             X0, X0, #1
ROM:000000008001A178                 CMP             X1, X0
ROM:000000008001A17C                 B.NE            loc_8001A188
ROM:000000008001A180                 MOV             X0, X4
ROM:000000008001A184                 RET
ROM:000000008001A188 ; ---------------------------------------------------------------------------
ROM:000000008001A188
ROM:000000008001A188 loc_8001A188                            ; CODE XREF: memmove+30↑j
ROM:000000008001A188                 LDRB            W2, [X5,X0]
ROM:000000008001A18C                 STRB            W2, [X3,X0]
ROM:000000008001A190                 B               loc_8001A174
ROM:000000008001A190 ; End of function memmove
ROM:000000008001A190
ROM:000000008001A194

ROM:000000008001A12C ; =============== S U B R O U T I N E =======================================
ROM:000000008001A12C
ROM:000000008001A12C
ROM:000000008001A12C memcpy                                  ; CODE XREF: read_otp_param+A0↑p
ROM:000000008001A12C                                         ; read_otp_param+118↑p ...
ROM:000000008001A12C                 MOV             X3, #0
ROM:000000008001A130
ROM:000000008001A130 loc_8001A130                            ; CODE XREF: memcpy+1C↓j
ROM:000000008001A130                 CMP             X2, X3
ROM:000000008001A134                 B.NE            loc_8001A13C
ROM:000000008001A138                 RET
ROM:000000008001A13C ; ---------------------------------------------------------------------------
ROM:000000008001A13C
ROM:000000008001A13C loc_8001A13C                            ; CODE XREF: memcpy+8↑j
ROM:000000008001A13C                 LDRB            W4, [X1,X3]
ROM:000000008001A140                 STRB            W4, [X0,X3]
ROM:000000008001A144                 ADD             X3, X3, #1
ROM:000000008001A148                 B               loc_8001A130
ROM:000000008001A148 ; End of function memcpy
ROM:000000008001A148

__int64 __fastcall memcpy(__int64 result, __int64 a2, __int64 a3)
{
  __int64 i; // x3

  for ( i = 0i64; a3 != i; ++i )
    *(_BYTE *)(result + i) = *(_BYTE *)(a2 + i);
  return result;
}

ROM:000000008001A0F8 ; =============== S U B R O U T I N E =======================================
ROM:000000008001A0F8
ROM:000000008001A0F8
ROM:000000008001A0F8 mem_cmp                                 ; CODE XREF: sub_80005584+98↑p
ROM:000000008001A0F8                                         ; sub_800056B4+88↑p ...
ROM:000000008001A0F8                 MOV             X4, #0
ROM:000000008001A0FC
ROM:000000008001A0FC loc_8001A0FC                            ; CODE XREF: mem_cmp+28↓j
ROM:000000008001A0FC                 CMP             X2, X4
ROM:000000008001A100                 B.NE            loc_8001A10C
ROM:000000008001A104                 MOV             W0, #0
ROM:000000008001A108                 RET
ROM:000000008001A10C ; ---------------------------------------------------------------------------
ROM:000000008001A10C
ROM:000000008001A10C loc_8001A10C                            ; CODE XREF: mem_cmp+8↑j
ROM:000000008001A10C                 LDRB            W3, [X0,X4]
ROM:000000008001A110                 ADD             X4, X4, #1
ROM:000000008001A114                 ADD             X5, X1, X4
ROM:000000008001A118                 LDURB           W5, [X5,#-1]
ROM:000000008001A11C                 CMP             W3, W5
ROM:000000008001A120                 B.EQ            loc_8001A0FC
ROM:000000008001A124                 SUB             W0, W3, W5
ROM:000000008001A128                 RET
ROM:000000008001A128 ; End of function mem_cmp
ROM:000000008001A128

__int64 __fastcall mem_cmp(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 v3; // x4
  int v5; // w3
  int v6; // w5

  v3 = 0i64;
  do
  {
    if ( a3 == v3 )
      return 0i64;
    v5 = *(unsigned __int8 *)(a1 + v3++);
    v6 = *(unsigned __int8 *)(a2 + v3 - 1);
  }
  while ( v5 == v6 );
  return (unsigned int)(v5 - v6);
}

ROM:000000008001A0DC
ROM:000000008001A0DC ; =============== S U B R O U T I N E =======================================
ROM:000000008001A0DC
ROM:000000008001A0DC
ROM:000000008001A0DC mem_set                                 ; CODE XREF: sub_800040BC+20↑p
ROM:000000008001A0DC                                         ; read_otp_param+100↑p ...
ROM:000000008001A0DC                 MOV             X3, #0
ROM:000000008001A0E0
ROM:000000008001A0E0 loc_8001A0E0                            ; CODE XREF: mem_set+18↓j
ROM:000000008001A0E0                 CMP             X2, X3
ROM:000000008001A0E4                 B.NE            loc_8001A0EC
ROM:000000008001A0E8                 RET
ROM:000000008001A0EC ; ---------------------------------------------------------------------------
ROM:000000008001A0EC
ROM:000000008001A0EC loc_8001A0EC                            ; CODE XREF: mem_set+8↑j
ROM:000000008001A0EC                 STRB            W1, [X0,X3]
ROM:000000008001A0F0                 ADD             X3, X3, #1
ROM:000000008001A0F4                 B               loc_8001A0E0
ROM:000000008001A0F4 ; End of function mem_set
ROM:000000008001A0F4
ROM:000000008001A0F8

__int64 __fastcall mem_set(__int64 result, char a2, __int64 a3)
{
  __int64 i; // x3

  for ( i = 0i64; a3 != i; ++i )
    *(_BYTE *)(result + i) = a2;
  return result;
}

### 使用 IDA Pro 分析 Hex 文件的方法 IDA Pro 是一款功能强大的反编译工具,可以用于分析多种类型的二进制文件,包括Hex文件。通过特定的操作流程,能够有效地解析并理解这些文件的内容。 #### 准备工作 为了开始分析过程,首先需要获取适用于目标平台的 IDA Pro 版本,并确保其已正确安装配置完毕[^3]。 #### 加载 Hex 文件到 IDA Pro 中 启动应用程序之后,在主界面选择 "File" -> "Load file" -> "Binary File..." 。此时会弹出对话框提示输入加载选项;由于Hex文件本质上属于十六进制编码的数据流形式存储,因此在该窗口内需指定正确的加载设置来匹配待处理的目标文件特性: - **Format**: 选择 `Raw binary` 或者其他适合的形式。 - **Processor type**: 根据具体应用场景选取合适的处理器架构类型,比如 ARM Cortex-M 系列对于 STM32 设备而言较为常见。 - **Address size**: 设置地址宽度参数以适应不同硬件环境下的需求差异。 - **Loading offset/base address**: 如果有特殊要求,则在此处设定相应的偏移量或基址信息。 完成上述配置后点击 OK 即可导入所选中的 Hex 文件进入下一步骤。 #### 初始化数据库与初步查看 一旦成功读取数据,IDA 将自动创建一个新的项目数据库,并尝试识别其中可能存在的结构化特征(如函数入口点、字符串常量区段等),这有助于后续更深入的研究工作开展。用户可以通过左侧导航栏浏览各个内存区域分布情况以及右侧显示的具体指令级细节描述。 #### 利用插件增强功能 考虑到某些复杂场景下原生支持或许不足以满足实际需求,这时便可以考虑借助第三方扩展模块进一步提升工作效率。例如,针对嵌入式系统的固件逆向工程任务来说,“Hex-Rays Decompiler” 插件就提供了非常实用的帮助,它可以在很大程度上简化从机器码恢复高级语言源代码的过程[^1]。 #### 应用 F5 功能转换为 C/C++ 当面对由汇编语言构成的部分难以直观解读时,不妨试试按下快捷键 F5 来触发内置的去混淆机制,试图将其重构回接近原始编写状态的样子 —— 这里指的是尽可能还原成易于人类阅读维护的 C / C++ 形式的伪代码表示法。不过需要注意的是,尽管这项技术已经相当成熟可靠,但由于种种原因并非总能百分之百完美重现最初的意图表达方式[^2]。 ```python def analyze_hex_file_with_ida_pro(hex_path, processor_type="ARM"): """ A function to demonstrate how one might programmatically interact with IDA Pro using its scripting capabilities. :param hex_path: Path to the HEX file that needs analysis. :param processor_type: The target architecture's processor type (default is 'ARM'). """ import idc # Load the specified HEX file into IDA as a raw binary image idc.load_binary_file(processor_type, hex_path) # Automatically determine entry points and other important features of the code idc.auto_wait() # Attempt decompilation where possible via pressing F5 key equivalent command idc.decompile_here(idc.here()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值