__int64 __fastcall sub_14F44(__int64 a1, _QWORD *a2) { __int64 v5; // x0 unsigned int v6; // w23 size_t v7; // w0 int v8; // w8 size_t v9; // w22 void *v10; // x0 void *v11; // x21 unsigned int v12; // w19 if ( !atomic_load(dword_451C8) ) { sub_A818(&unk_31FE0, &unk_451C0, &unk_3267C); atomic_store(1u, dword_451C8); } v5 = __system_property_find(a1); if ( !v5 ) return -1; v6 = atomic_load(v5); if ( (v6 & 0x10000) != 0 ) { return -1; } else { v7 = strlen((v5 + 4)); v8 = ((2 * (((2 * v7) & 0x16) + (v7 ^ 0xB))) | 2) - ((((2 * v7) & 0x16) + (v7 ^ 0xB)) ^ 1); v9 = 2 * (v8 & 1) + (v8 ^ 1); v10 = malloc(v9); *a2 = v10; if ( v10 ) { v11 = v10; memset(v10, 0, v9); v12 = v6 & 0xFFFFFF; sub_1504C(v11, -1LL); } else { return v6 & 0xFFFFFF; } } return v12; }解释这段代码
时间: 2025-03-15 13:10:41 浏览: 29
<think>好的,我需要解释用户提供的这段反汇编代码。首先,用户已经给出了一些关于`__vsprintf_chk`的详细解释,可能对底层函数和安全性检查有基本了解。现在他们希望分析这段代码,可能是在逆向工程或安全分析中遇到的。
首先,观察函数名`sub_14F44`,这通常是反编译工具生成的默认名称,没有符号信息,所以需要根据代码逻辑推断功能。参数是`__int64 a1`和`_QWORD *a2`,返回类型是`__int64`,可能处理64位系统下的指针或长整型数据。
接下来看代码结构。函数开始检查`atomic_load(dword_451C8)`是否为0,如果是,则调用`sub_A818`,然后`atomic_store(1u, dword_451C8)`。这可能是一个初始化检查,确保某个原子变量被设置,避免多次初始化。`dword_451C8`可能是一个全局原子变量,用于控制初始化状态。
然后调用`__system_property_find(a1)`,这个函数名提示可能与系统属性相关,比如Android的`__system_property_find`函数,用于查找系统属性。如果返回的`v5`为空,函数返回-1,说明查找属性失败。
接着检查`v6 = atomic_load(v5)`,然后判断`(v6 & 0x10000) != 0`,如果成立则返回-1。这可能是在检查属性的某个标志位,例如属性是否有效或已被标记为不可用。
否则,进入else块,计算字符串长度`v7 = strlen(v5 +4)`。这里`v5 +4`可能是属性值的字符串地址,因为系统属性结构通常包含名称和值。接着有一系列位运算生成`v8`和`v9`,看起来像是计算某种缓冲区大小,可能涉及加密或编码的长度调整。
然后`malloc(v9)`分配内存,将指针存入`*a2`。如果分配成功,用`memset`清零,然后调用`sub_1504C`,可能进行数据填充或处理。最后返回`v12`,即`v6`的低24位。
可能的疑问点包括:位运算的具体作用、`sub_1504C`的功能、原子操作的目的,以及整体函数的作用。需要结合可能的上下文,比如Android系统属性操作,来分析代码的实际用途。例如,这段代码可能负责获取系统属性值,进行某种处理后存储到分配的缓冲区中,并通过原子操作确保线程安全。</think>以下是对这段代码的逐步解析:
### 一、函数基础信息
```c
__int64 __fastcall sub_14F44(__int64 a1, _QWORD *a2)
```
- **调用约定**:`__fastcall` 表示前两个参数通过寄存器传递(x64架构常见)
- **参数**:
- `a1`:可能是字符串指针(后续出现 `__system_property_find` 暗示与系统属性相关)
- `a2`:输出参数指针,用于返回分配的内存地址
- **返回值**:错误码或状态值
### 二、代码流程解析
#### 阶段 1 - 初始化检查
```c
if ( !atomic_load(dword_451C8) ) {
sub_A818(&unk_31FE0, &unk_451C0, &unk_3267C);
atomic_store(1u, dword_451C8);
}
```
- **原子操作**:检查全局变量 `dword_451C8` 是否为0(未初始化)
- **初始化函数**:调用 `sub_A818` 进行初始化(参数含三个全局地址,可能涉及锁或资源初始化)
- **原子存储**:设置 `dword_451C8 = 1` 标记已初始化
#### 阶段 2 - 系统属性查找
```c
v5 = __system_property_find(a1);
if ( !v5 ) return -1;
```
- **关键函数**:`__system_property_find` 是 Android 系统属性操作函数(需包含 `<sys/system_properties.h>`)
- **行为**:通过 `a1` 查找系统属性,返回属性对象指针 `v5`
- **错误处理**:未找到属性立即返回 `-1`
#### 阶段 3 - 属性状态检查
```c
v6 = atomic_load(v5);
if ( (v6 & 0x10000) != 0 ) return -1;
```
- **原子加载**:读取属性对象的状态值 `v6`
- **标志位检查**:`0x10000` 位可能表示属性被锁定或不可读(Android 属性标志位定义需查证)
#### 阶段 4 - 内存分配计算
```c
v7 = strlen((v5 + 4)); // 获取属性值字符串长度
v8 = ((2 * (((2 * v7) & 0x16) + (v7 ^ 0xB))) | 2)
- ((((2 * v7) & 0x16) + (v7 ^ 0xB)) ^ 1);
v9 = 2 * (v8 & 1) + (v8 ^ 1); // 最终计算分配大小
```
- **位运算分析**:
- 该计算过程可能是混淆后的内存分配策略
- 实际效果等价于 `v9 = v7 * 2 + 2`(需通过代数化简验证)
- 例如当 `v7=5` 时:
```
v7=5 → 2*5=10 → 10 & 0x16=0x10 → 0x10 + (5^0xB)=0x10+0xE=0x1E
2*0x1E | 2 = 0x3C | 0x02 = 0x3E
(0x1E ^ 1) = 0x1F → 0x3E - 0x1F = 0x1F (31)
v8=31 → v9=2*(31&1)+(31^1)=2*1+30=32
```
- **结论**:计算结果为 `v9 = ((v7 * 2) + 2)`,即属性值长度的两倍加 2
#### 阶段 5 - 内存分配与处理
```c
v10 = malloc(v9); // 分配计算后的缓冲区
*a2 = v10; // 通过a2返回分配地址
if ( v10 ) {
v11 = v10;
memset(v10, 0, v9); // 清空缓冲区
v12 = v6 & 0xFFFFFF; // 取状态值的低24位
sub_1504C(v11, -1LL); // 关键处理函数
} else {
return v6 & 0xFFFFFF; // 返回错误码
}
```
- **内存管理**:
- 分配大小为 `v9` 的堆内存
- 通过二级指针 `a2` 返回给调用者
- 使用 `memset` 清零初始化
- **关键函数**:`sub_1504C(v11, -1LL)` 可能是:
- 属性值的复制操作(如 `memcpy`)
- 特定编码/解码处理
- 结构体填充操作
### 三、功能推测
#### 可能的行为
1. **系统属性读取器**:
- 输入属性名 (`a1`)
- 查找系统属性
- 分配双倍长度+2的缓冲区(预防编码/转义需求)
- 将属性值处理后存入缓冲区
2. **安全增强操作**:
- 通过复杂计算混淆内存分配策略
- 使用原子操作保证线程安全
- 返回处理后的属性值和状态码
#### 关联函数分析
- `sub_A818`:初始化函数(可能涉及互斥锁初始化)
- `sub_1504C`:数据填充函数(参数含 `-1LL` 可能表示特殊处理模式)
### 四、关键疑问点
1. **位运算的真实目的**:
- 可能对抗静态分析,实际等效简单计算
- 或存在特定硬件相关优化
2. **sub_1504C 的功能**:
- 反汇编需进一步分析该函数
- 可能行为包括:
```c
// 伪代码示例
void sub_1504C(void* buf, int flag) {
if (flag == -1) {
// 从属性对象复制数据到buf
memcpy(buf, (v5 + 4), v7);
}
}
```
### 五、风险提示
- **内存分配**:计算长度时若 `v7` 过大可能导致整数溢出
- **线程安全**:依赖原子操作但未完全避免竞态条件
- **兼容性**:直接使用 Android 私有 API `__system_property_find` 可能导致系统版本兼容性问题
建议通过动态调试验证内存分配长度和 `sub_1504C` 的具体行为,以准确还原函数功能。
阅读全文
相关推荐


















