2016-04-26 16 views
0

Ich lerne immer noch ARM und ich konnte nicht verstehen, was diese Funktion tun soll.Brauchen Sie Hilfe ARM-Funktion zu verstehen

Können Sie mir helfen zu erklären, wie es funktioniert?

.text:0006379C   EXPORT _nativeD2AB 
.text:0006379C   _nativeD2AB 
.text:0006379C   var_28   = -0x28 
.text:0006379C 
.text:0006379C   STMFD   SP!, {R4-R11,LR} 
.text:000637A0   SUB    SP, SP, #0x3A4 
.text:000637A4   STMFA   SP, {R0-R3} 
.text:000637A8   LDR    R0, =(_GLOBAL_OFFSET_ - 0x637B8) 
.text:000637AC   LDR    R1, =(__stack_chk - 0x134EAC) 
.text:000637B0   ADD    R0, PC, R0 ; _GLOBAL_OFFSET_ 
.text:000637B4   LDR    R0, [R1,R0] ; __stack_chk 
.text:000637B8   LDR    R0, [R0] 
.text:000637BC   STR    R0, [SP,#0x3C8+var_28] 
.text:000637C0   MOV    R0, #1 
.text:000637C4   ADR    R1, sub_637D0 
.text:000637C8   MUL    R0, R1, R0 
.text:000637CC   MOV    PC, R0 
.text:000637CC   ; End of function _nativeD2AB 

.

.got:00134EAC _GLOBAL_OFFSET_TABLE_ DCD 0 

.

.got:00134B0C     AREA .got, DATA 
.got:00134B0C __stack_chk DCD __stack_chkA 

.

Den Rest der Funktion gefunden. Wenn ich einen Teil davon richtig verstanden hat, so scheint es, wird die Daten Scrambling, obwohl das nur eine wilde Vermutung sein kann:

.text:000637D0 sub_637D0 
.text:000637D0     MOV    R0, #1 
.text:000637D4     ADR    R1, sub_637E0 
.text:000637D8     MUL    R0, R1, R0 
.text:000637DC     MOV    PC, R0 
.text:000637DC ; End of function sub_637D0 

.text:000637E0 sub_637E0 
.text:000637E0 
.text:000637E0 arg_14   = 0x14 
.text:000637E0 
.text:000637E0     STR    R2, [SP,#arg_14] 
.text:000637E4     MOV    R0, #1 
.text:000637E8     ADR    R1, loc_637F4 
.text:000637EC     MUL    R0, R1, R0 
.text:000637F0     MOV    PC, R0 
.text:000637F0 ; End of function sub_637E0 

.text:000637F4 loc_637F4 
.text:000637F4     STR    R2, [SP,#0x28] 
.text:000637F8     STR    R0, [SP,#0x18] 
.text:000637FC     MOV    R1, #2 
.text:00063800     STR    R2, [SP,#0x1C] 
.text:00063804     STR    R0, [SP,#0x20] 
.text:00063808     STR    R0, [SP,#0x24] 

Antwort

0

Die Funktion mehrere Teile hat:

  1. Shop Register zum stacj und reserve space (Seltsam, nicht wiederhergestellt)
  2. Laden Sie auf R0 die Adresse GLOBAL_OFFSET (Einmal mit PC hinzugefügt), um tatsächlich Zugriff auf __stack_chk (Wenn zu GLOBAL_OFFSET hinzugefügt). Dies geschieht auf sehr seltsame Weise.
  3. Laden Sie die Daten auf __stack_chk und speichern sie in dem Stapel
  4. Load R0 den Wert von sub_637D0, durch eine Multiplikation mit 1. Dadurch wird der Wert von der Funktion zurückgegeben wird.

Also meiner Meinung nach, das scheint nicht, etwas Sinnvolles zu tun ...

+1

„Dies ist der Wert von der Funktion zurückgegeben wird“ - es ist nicht alles zurückkehrt, ist es eine bizarr berechnete Sprung tun _to_ 'sub_637D0 ', was mit ziemlicher Sicherheit ein von Disassemblern erzeugtes Symbol ist, das den nächsten Befehl anzeigt, der dem' mov pc, r0' bei 0x637cc folgt. Ich frage mich, ob die 'mov r0, # 1 'hotpatched sein soll, oder es ist nur die am wenigsten optimierte Single-Entry Jump-Tabelle der Welt. Wie auch immer, wir können uns nur fragen, wie der Rest der Funktion aussieht ... – Notlikethat

+0

Ich denke, ich habe den Rest der Funktion gefunden. Kein Grund mehr, sich zu wundern ^^. Übrigens, danke für deine Antwort. –

Verwandte Themen