Assembly 了解组装过程的最佳方法是什么?

Assembly 了解组装过程的最佳方法是什么?,assembly,arm,Assembly,Arm,为了挑战自我,我正在努力学习组装。我使用IDA找到了这个函数: Question - (void)setCorrectAnswerIndex:(int) ; void __cdecl -[Question setCorrectAnswerIndex:](struct Question *self, SEL, int) __Question_setCorrectAnswerIndex__ MOV R1, #(_OBJC_IVAR_$_Question.correctAns

为了挑战自我,我正在努力学习组装。我使用IDA找到了这个函数:

Question - (void)setCorrectAnswerIndex:(int)

; void __cdecl -[Question setCorrectAnswerIndex:](struct Question *self, SEL, int)
__Question_setCorrectAnswerIndex__
MOV             R1, #(_OBJC_IVAR_$_Question.correctAnswerIndex - 0x5C750) ; int correctAnswerIndex;
ADD             R1, PC  ; int correctAnswerIndex;
LDR             R1, [R1] ; int correctAnswerIndex;
STR             R2, [R0,R1]
BX              LR
; End of function -[Question setCorrectAnswerIndex:]

我只是很难弄清楚它是如何工作的,以及如何修改它。因此setCorrectAnswerIndex将始终设置为静态数字或其他内容。

让我们看看为什么查看编译的高级代码不是一个很好的学习方法。从手臂装配的角度来看,发生的情况如下:

  • 将常数移到寄存器R1中
  • 将当前程序计数器添加到该计数器,以创建从该代码到程序映像的其他部分的相对偏移量的地址
  • 将存储在该地址的任何值加载到R1中
  • 将R2中保存的值存储到R0+R1生成的地址
  • 通过分支到链接寄存器中保存的地址返回调用方
这对任何一个项目来说意味着什么?我不知道。我不知道它是用什么语言编译的,所以我不知道参数是如何传递的*。我不知道事物的结构和布局(这取决于语言和单个程序),所以我不知道这些偏移量和指针指向什么。说出此汇编代码的功能与说出它实现的功能相差甚远。如果这个函数实际上做了一些与答案索引无关的事情,只是有一个真正误导性的名称,该怎么办

简而言之,如果你想

如果你想学习逆向工程。然后,有了这些知识,开始学习逆向工程这项非常困难的任务

这里有一个提示:这个函数唯一的副作用就是将R2存储在某个地方。您无法在不破坏所有内容的情况下修补前面的任何指令,因此在编写R2之前将不同的值写入R2是相当困难的。也许呼叫现场还有空位?我的想法是,用一个相对的分支修补返回到附近有空间修补更多代码的地方,重用R0和R1编写一个新值,然后返回到原始的LR

*是的,我有点装傻。我猜它是Objective-C,可能是使用了ARM EABI,但我不想查它来确认。此外,想到要接近任何与XCode有关的东西,我又一次感到不寒而栗