了解装配的最佳方法是什么?

时间:2014-01-25 16:37:57

标签: assembly arm

为了挑战我的自我,我正在努力学习组装。使用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将始终设置为静态数字。

1 个答案:

答案 0 :(得分:2)

让我们看看为什么查看编译的高级代码不是一个很好的学习方法。从ARM集合的角度来看,这是怎么回事:

  • 将常量移动到寄存器R1
  • 将当前的程序计数器添加到该程序计数器以创建从此代码到程序映像的其他部分的相对偏移的地址
  • 将存储在该地址的任何值加载到R1
  • 将R2中保存的值存储到R0 + R1
  • 的地址中
  • 通过分支到链接注册
  • 中保存的地址返回呼叫者

这对于任何程序来说意味着什么? 我不知道。我不知道它是用什么语言编译的,所以我不知道参数如何传递*。我不知道事物的结构和布局(这取决于语言和个别程序)所以我不知道那些偏移和指针指向的是什么。说这个汇编代码做什么无法说出实现的内容。如果这个函数实际上做了一些与答案索引无关的东西并且只是一个真正具有误导性的名字会怎么样?

简而言之,如果您想要learn assemblylearn assembly

如果您想学习逆向工程,learn assembly然后,掌握了这些知识,开始学习逆向工程的艰巨任务。

这是一个提示:此功能的唯一副作用是将R2存储在某处。你不能在不破坏所有内容的情况下修补前面的任何指令,因此在编写之前在R2中获取不同的值是相当困难的。也许在通话网站有空间?使用相对分支将返回修补到附近可以修补更多代码的地方,重新使用R0和R1写入新值然后返回到原始LR将是我的想法。

*是的,我在这里玩傻了。我猜它是Objective-C,它可能是使用ARM EABI 但是我不想让它确认。此外,任何与XCode有关的地方的想法再次让我感到不寒而栗。