这是 IDA:http : //pastebin.com/AkU0MDWh
另外,这会用 C 编写来显示吗?与常规方法相比,例如:
ListRowCell - (id)initWithStyle:(int) reuseIdentifier:(id)
这是 IDA:http : //pastebin.com/AkU0MDWh
另外,这会用 C 编写来显示吗?与常规方法相比,例如:
ListRowCell - (id)initWithStyle:(int) reuseIdentifier:(id)
如果在内核中关闭了代码签名强制,您可以在 iOS 中挂钩此方法(以及大多数其他方法),例如在越狱的 iOS 设备上。这样做的方法是用一些跳转到你的钩子的指令覆盖函数的前几条指令。然后你的钩子回调到其他地方的一些指令,这些指令执行你之前覆盖的指令,然后跳回到被覆盖的部分之后。
具体来说,您可以使用 CydiaSubstrate 来执行此操作,前提是您可以以某种方式找到此方法的地址。确定目标地址的最简单方法可能是确定二进制的幻灯片并添加 0xA303C。但是,此方法不如为该函数查找实际符号(可能使用 nlist)好,因为如果您希望它在目标二进制文件的多个版本上工作,则该函数的确切地址将更改。
如果没有代码签名强制内核补丁,则无法挂钩该函数,因为您无法在不更改签名代码的情况下挂钩此特定函数。block_invoke 函数通常在二进制文件的 __const 部分中引用,或者由代码中的 PC 相关引用引用。
这个特定函数的签名是: UIAlertView* ___LT9867544270_block_invoke_3(UIAlertView* (^block)(void))
但是,块参数未使用。您可以通过查看函数立即覆盖 R0-R2 而不使用它们的值这一事实来推断出这一点。不使用 R3 是因为调用的函数在读取 R3 之前不使用它。
您可以通过查看 R0 有时在从函数返回之前设置为 R4 来推断返回值。R4 是整个函数中 [UIAlertView alloc] 的结果。
区块的签名一般是:[return value of the block] __[function name block was declared in]_block_invoke_[the number of the block in the function the block was declared in if it's not the first one](id block, [arguments of the block...])。例如,如果您的代码中有这个:
void myFunction() {
int (^myBlock)(int, int) = ^(int a, int b) {
return a * b;
};
}
你会得到以下块:
int __myFunction_block_invoke(int (^myBlock)(int, int), int a, int b) {
return a * b;
}