- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要帮助从反汇编中对虚拟方法进行逆向工程。代码最初是用 Microsoft 的 Visual C++ 编译的。问题方法如下:
sub_92D110 proc near
xor al, al
retn
sub_92d110 endp
这个方法在很多类之间被引用,甚至在一个类的虚表中被多次引用。我不确定它的作用;这是否意味着该方法已内联但调用仍然存在以便 vtable 保持其大小?
如果是这样,xor al, al
做了什么?我是不是误解了调用约定之类的东西?
最佳答案
这很可能是这样的:
bool someclass::somemethod() {
return false;
}
xor al,al
将 eax
的低字节设置为零。eax
作为寄存器大小整数值的“返回值”寄存器。 int
的函数(如 return 0;
),因为它只清除低字节(没有 x86 调用约定使用 >eax
作为输入参数,所以它不是一些接受整数参数、将其低字节归零并返回它的奇怪函数。char
/unsigned char
(0) 或一个bool
(false
);我更倾向于认为这是第二种选择,因为在实践中它出现得更频繁(尤其是在可能由派生类重新定义的方法的“空”基类实现中)。__thiscall
调用约定,除了将 this
指针放在 ecx
之外,与 相同__stdcall
用于“常规”方法,与 __cdecl
用于可变参数相同;现在,__stdcall
是被调用者清理,这里没有清理可言,这意味着没有参数;另一方面,即使在 __cdecl
函数中,被调用方法也没有清理,因此我们不能先验排除这种可能性。话虽如此,我认为最后一个选项不太可能。 This method is referenced between a lot of classes, even multiple times inside of a vtable of one class.
这是完全正常的; VC++的链接器有规律merges unrelated functions that compile to the same machine code (和 confusingly calls this "identical COMDAT folding" )。
鉴于此过程的级别非常低(它本质上是查看为各种函数生成的字节并查看是否可以对它们进行去重),理论上上述所有假设都可能成立—它可能是一种不带参数并在一个 vtable 槽中返回 bool
false
的方法,以及在另一个 vtable 槽中返回 char
零的可变参数方法.
关于c++ - 对返回前仅对 EAX 的低字节进行异或运算的虚方法进行逆向工程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143027/
这个问题在这里已经有了答案: Test whether a register is zero with CMP reg,0 vs OR reg,reg? (2 个回答) 3年前关闭。 or eax,e
test eax, eax 是否比 cmp eax, 0 更高效?是否存在需要 test eax, eax 而 cmp eax, 0 不满足要求的情况? 最佳答案 正如臧明杰在评论中已经说过的,tes
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: x86 Assembly - ‘testl’ eax against eax? 我对汇编语言编程非常陌生,我目前正在
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
GCC 给我做了一些汇编代码,里面有这个语句: lea eax, [ebx+eax] (英特尔语法) 只是好奇,这有什么区别,和: add eax, ebx 是? eax 和 ebx 包含函数的返回值
leal (%eax, %eax) 是什么意思做? %eax * 2 处的内容是否会相乘,因为它有括号? 最佳答案 它将使用 eax 的总和加载目标操作数和 eax , IOW, 2* eax . 关
我正在尝试理解一些汇编。 程序集如下,我对teSTL行感兴趣: 000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004
LEA EAX, [EAX] 我在使用 Microsoft C 编译器编译的二进制文件中遇到了这条指令。它显然不能改变 EAX 的值。那它为什么在那里? 最佳答案 这是一个NOP。 以下通常用作NOP
我正在二进制文件中搜索特定指令,对于 xor eax,eax 指令,我有一个函数,如: int foo(){ return 0; } 如果我用 GCC 4.7.2 和 -O2 或 -O3 优化标志
我正在二进制文件中搜索特定指令,对于 xor eax,eax 指令,我有一个函数,如: int foo(){ return 0; } 如果我用 GCC 4.7.2 和 -O2 或 -O3 优化标志
什么是 0x01b55ee2 mov 0x40(%eax),%eax 是什么意思?我应该如何解释 0x40(),因为我的代码在该位置崩溃时遇到问题。 %eax寄存器的内容为0。 最佳答案
我知道 dword ptr 是一个 size 指令,它指示移动内容的大小,我知道 mov eax, eax 是一种 nop 代码形式,但这有什么作用? 我认为它将 eax 的地址与内部的十六进制值交换
这个问题已经有答案了: What is the meaning of MOV (%r11,%r12,1), %edx? (2 个回答) 已关闭 5 年前。 一直在从事 assembly 作业,并且在很
我在 GAS 源代码中定义了一个 MACRO。但是不是gcc编译的。 下面是我定义的MACRO。 #define MSGSCHEDULE0(index) \ movl (index*4)(%r
我在组装方面完全是个菜鸟,只是四处看看发生了什么。无论如何,我写了一个非常简单的函数: void multA(double *x,long size) { long i; for(i=0; i
GCC 4.4.3 生成了以下 x86_64 程序集。让我困惑的部分是 mov %eax,%eax .将寄存器移至自身?为什么? 23b6c: 31 c9
两条线有什么区别 push eax mov [esp], eax 不将 eax 压入堆栈(esp 所指向的位置与 mov [esp]、eax 一样?) 最佳答案 “push”会自动改变“esp”(你的
以下说明有何意义? xor eax,eax mov eax,[eax] 当您对 eax 进行 XOR 时,大多数情况下您会得到零,那么您可以取消引用地址 [eax] 中的内容(在本例中 eax 包含
我是一个初学者,正在编写汇编程序以使用以下代码打印从 1 到 9 的数字: section .text global _start _start:
Apparently ,现代处理器可以判断您是否做了一些愚蠢的事情,例如将寄存器移动到自身 ( mov %eax, %eax ) 并将其优化。为了验证该声明,我运行了以下程序: #include #
我是一名优秀的程序员,十分优秀!