Is het mogelijk om de demontage van Objective-C-methoden die in Mach-O-bestanden zijn gedeclareerd, op te halen met Radare2?
Is het mogelijk om de demontage van Objective-C-methoden die in Mach-O-bestanden zijn gedeclareerd, op te halen met Radare2?
In wezen is het de volgende workflow:
r2 -A / pad / naar / binair // laad het binaire bestand en voer de eerste analyse uit afl // printfunctie symbolspdf @ sym.of.interest / / disassemblepdc @ sym.of.interest // "decompileren" of pseudocode genereren
Hier is een voorbeeld van hoe je een functie van MachoViewer kunt demonteren:
@ 0x4B6169: / $ r2 -A /Applications/MachOView.app/Contents/MacOS/MachOView 2> / dev / null - Voer .dmm * uit om de vlaggen van de symbolen van alle geladen modules te laden in de debugger [0x100001da0] > afl | grep sym .__ MachOLayout_get0x10000b252 4 49 sym .__ MachOLayout_getSectionByIndex: _0x10000b283 4 49 sym .__ MachOLayout_getSection64ByIndex: _0x10000b2b4 4 49 sym .__ MachOLayout_getSymbolByIndex: _0x10000b2e5 4 49 sym .__ MachOLayout_getSymbol64ByIndex: _0x10000b316 4 49 sym .__ MachOLayout_getDylibByIndex: _ [0x100001da0] > pdf @sym .__ MachOLayout_getSymbolByIndex: _ . mov rdx, qword [rip + 0xf761f]; [0x1001028e0: 8] = 176 LEA sym._OBJC_IVAR ___ MachOLayout.symbols; sym._OBJC_IVAR ___ MachOLayout.symbols│ 0x10000b2c1 488b0c17 mov rcx, qword [rdi + rdx] │ 0x10000b2c5 488b541708 mov rdx, qword [rdi + rdx + 8]; [0x8: 8] = 0x280000003│ 0x10000b2ca 4829ca sub rdx, rcx│ 0x10000b2cd 48c1fa03 sar rdx, 3│ 0x10000b2d1 4839d0 cmp rax, rdx│ ┌─< 0x10000b2 rax 0x10000b2 rax, rdx│ ┌─< 0x10000b2 rax 0x10000b2 rax 0x10000b2 rax 8x1006 ] │ ┌──< 0x10000b2da eb07 jmp 0x10000b2e3│ ││; JMP XREF van 0x10000b2d4 (sym .__ MachOLayout_getSymbolByIndex: _) │ │└─> 0x10000b2dc 488d05e5fd0a. lea rax, [rip + 0xafde5]; 0x1000bb0c8; sym .__ MachOLayoutgetSymbolByIndex: _ :: niet gevonden; sym .__ MachOLayoutgetSymbolByIndex: _ :: notfound│ │; JMP XREF van 0x10000b2da (sym .__ MachOLayout_getSymbolByIndex: _) │ └──> 0x10000b2e3 5d pop rbp╘ 0x10000b2e4 c3 ret [0x100001da0] Ailikwhtk quit
) werkt op dezelfde manier via de ingenieus logische opdrachtinvoer:
[0x100001da0] > pdc @sym .__ MachOLayout_getSymbolByIndex: _function sub .__ MachOLayoutgetSymbolByIndex: _. notfound_2b4 () {rbsp2bx10000 = rbsp2bx10000 edx rdx = qword sym._OBJC_IVAR ___ MachOLayout.symbols // [0x1001028e0: 8] = 176; "__text" rcx = qword [rdi + rdx] rdx = qword [rdi + rdx + 8] // [0x8: 8] = 0x280000003 rdx - = rcx rdx >> = 3 var = rax - rdx jae loc 0x0dc100x100 {onwaarschijnlijk : // JMP XREF van 0x10000b2d4 (sub .__ MachOLayoutgetSymbolByIndex: _. Notfound_2b4) rax = [sym .__ MachOLayoutgetSymbolByIndex: _ :: niet gevonden] //method.__MachOLayoutgetSymbolByIndex:_.notfound:_.notfound: 0x1000bb0c8; methode .__ MachOLayoutgetSymbolByIndex: _. notfound do {loc_0x10000b2e3: // JMP XREF van 0x10000b2da (sub .__ MachOLayoutgetSymbolByIndex: _. notfound_2b4) pop rbp} while (?); } while (?); } return;}
Binnen hopper v4 kun je hetzelfde als volgt doen:
hopperv4 -e / Applications / MachOView .app / Inhoud / MacOS / MachOView
Hierdoor wordt de hopper geopend en kunt u op "Proc." klikken. tabblad en zoek naar de functie. Zodra je erop klikt, zie je de volgende demontage (radare2 1.5.0 0 @ darwin-x86-64 git.1.5.0, commit: HEAD build: 2017-05-31__14: 31: 32):
000000010000b2b4 push rbp; Doelstelling C-implementatie gedefinieerd op 0x1000f5de8 (instantiemethode), DATA XREF = 0x1000f5de8000000010000b2b5 mov rbp, rsp000000010000b2b8 mov eax, edx000000010000b2ba mov rdx, qword mov [_OBJC_IVAR _ $ b2b5 mov rbp, rsp000000010000b2b8 mov eax, edx000000010000b2ba mov rdx, qword [_OBJC_IVAR] qword movols [_OBJC_IVAR] OOI + rdx + 8] 000000010000b2ca sub rdx, rcx000000010000b2cd sar rdx, 0x3000000010000b2d1 cmp rax, rdx000000010000b2d4 jae loc_10000b2dc000000010000b2d6 mov rax, QWORD [rcx + rax * 8] 000000010000b2da jmp loc_10000b2e3 loc_10000b2dc: 000000010000b2dc lea rax, QWORD [__ZZ32- [MachOLayout getSymbolByIndex:] E8niet gevonden]; CODE XREF = - [MachOLayout getSymbolByIndex:] + 32 loc_10000b2e3: 000000010000b2e3 pop rbp; CODE XREF = - [MachOLayout getSymbolByIndex:] + 38000000010000b2e4 ret
Het is duidelijk dat de pseudo-code in de hopper op dit moment nog steeds behoorlijk beter is dan wat ik in radare2 kon krijgen. De bovenstaande demontage in pseudo-code in hopper (v4.2.1) luidt:
struct nlist * - [MachOLayout getSymbolByIndex:] (void * self, void * _cmd, unsigned int arg2) {rax = arg2; rcx = zelf->symbols; if (rax < SAR (* (self + * _OBJC_IVAR _ $ _ MachOLayout.symbols + 0x8) - rcx, 0x3)) {rax = * (rcx + rax * 0x8); } else {rax = - [MachOLayout getSymbolByIndex:] :: notfound; } return rax;}
Gebruik gewoon rabin2 -c
... nu moet ik gekke tekst invullen om 30 tekens te vullen