【发布时间】:2018-08-27 06:58:15
【问题描述】:
我正在尝试对这个神秘功能进行逆向工程。 该函数返回一个整数,并以一个结构节点作为参数
#include "mystery.h"
int mystery(struct e4_struct *s){}
头文件是一个简单的结构体声明
struct my_struct {
int a;
int b;
};
我要逆向工程的程序集是
400596: 8b 07 mov (%rdi),%eax
400598: 8d 04 40 lea (%rax,%rax,2),%eax
40059b: 89 07 mov %eax,(%rdi)
40059d: 83 47 04 07 addl $0x7,0x4(%rdi)
4005a1: c3 retq
到目前为止,我认为该功能是这样的:
int mystery(struct m_struct *s){
int i = s->a;
i = 3*i;
int j = s->b;
j += 7;
return i;
}
但这是不正确的。我不明白 mov %eax,(%rdi) 到底做了什么以及函数最终返回了什么,因为它应该返回整数。
【问题讨论】:
-
显然
j += 7没有效果,所以它不可能是正确的。addl直接对内存内容进行操作,所以这就是s->b += 7,而你根本没有j。另外,您忘记了mov %eax, (%rdi)。 -
s->a = s->a * 3
标签: c gcc assembly x86-64 reverse-engineering