2016-04-12 12 views
1

Bir programı komut dosyaları ile yamalamaya çalışıyorum. Bu yüzden bir sembolünnm ile bir sembolün dosya ofsetini bulun

ofsetine ihtiyacım var. Ama nm sadece adresi bellekteki olarak yazdırıyor, dosya ofsetini nasıl bulabilirim?

int var1 = 1; 
int var2 = 2; 

int main(){} 

oluşturduktan sonra, nm verir:

%> nm a | grep checkUpdate 
000000010010f8ff t -[UIManager checkUpdate] 

Ben Mac nm çalıştırıyorum

+0

nasıl olduğunu bellekte adresi? Dosya yüklenmedi. – trojanfoe

+0

@trojanfoe dosya boyutundan büyük olduğu için dosya boyutu – daisy

+0

Dosya belleğe nasıl eşleştirildiğini bilmeniz gerekir. Metin alanının başlangıcı '100000000' gibi bir şeydir, bu nedenle metin alanının dosyada nerede başladığını anlarsanız, sembol muhtemelen oradan '10f8ff' değerini gösterir. Yaptığın şey çok gelişmiş, bu yüzden bunu zaten bilmeni isterim ki ... – trojanfoe

cevap

0

bize var2 ofset bulmak istediğinizi varsayalım

nm -a a.out | grep var 
0000000100001000 D _var1 
0000000100001004 D _var2 

gobjdump (port install binutils) ile progra okuyabiliriz m başlığı:

gobjdump -x a.out 

a.out:  file format mach-o-x86-64 
a.out 
architecture: i386:x86-64, flags 0x00000012: 
EXEC_P, HAS_SYMS 
start address 0x0000000100000f90 

Sections: 
Idx Name   Size  VMA    LMA    File off Algn 
    0 .text   0000000b 0000000100000f90 0000000100000f90 00000f90 2**4 
        CONTENTS, ALLOC, LOAD, CODE 
    1 __TEXT.__unwind_info 00000048 0000000100000f9c 0000000100000f9c 00000f9c 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    2 .eh_frame  00000018 0000000100000fe8 0000000100000fe8 00000fe8 2**3 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    3 .data   00000008 0000000100001000 0000000100001000 00001000 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
SYMBOL TABLE: 
0000000100000000 g  0f SECT 01 0010 [.text] __mh_execute_header 
0000000100000f90 g  0f SECT 01 0000 [.text] _main 
0000000100001000 g  0f SECT 04 0000 [.data] _var1 
0000000100001004 g  0f SECT 04 0000 [.data] _var2 
0000000000000000 g  01 UND 00 0100 dyld_stub_binder 

Böylece nm tarafından döndürülen var2 adres sanal bellek adresi 100001000 yüklü ve dosya 1000 ofset sahiptir bölüm .data yer almaktadır. var2'un ofsetini 100001004 - 100001000 + 1000 = 1004 olarak alabilirsiniz.

Bu

bir onaltılık editörü ile doğrulanabilir:

256 0000ff0: 017a 5200 0178 1001 100c 0708 9001 0000 .zR..x.......... 
257 0001000: 0100 0000 0200 0000 0000 0000 0000 0000 ................ 
258 0001010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 
İlgili konular