Linux Hook技術(shù)(二)

轉(zhuǎn)載自https://blog.csdn.net/yyttiao/article/details/7350279
今天這一節(jié),主要是講程序頭(Program Headers),程序頭主要是從加載執(zhí)行的角度來看的,很多人想那里面到底是什么東西呢,其實程序頭就是一個結(jié)構(gòu)數(shù)組,每一個頭保存著對應(yīng)的不同的數(shù)據(jù),有的數(shù)據(jù)是告訴系統(tǒng)把我放入內(nèi)存,有的數(shù)據(jù)時告訴系統(tǒng)我是變量.等等...在系統(tǒng)加載程序的時候就要通過該程序頭來加載不同的段.

下面就來看一下程序頭的結(jié)構(gòu)體:

typedef struct
 
{
 
   Elf32_Word p_type; /* Segment type */
 
   Elf32_Off p_offset; /* Segment file offset */
 
   Elf32_Addr p_vaddr; /* Segment virtual address */
 
   Elf32_Addr p_paddr; /* Segment physical address */
 
   Elf32_Word p_filesz; /* Segment size in file */
 
   Elf32_Word p_memsz; /* Segment size in memory */
 
   Elf32_Word p_flags; /* Segment flags */
 
   Elf32_Word p_align; /* Segment alignment */
 
} Elf32_Phdr;

p_type: 段的類型

在elf.h頭文件中,有很詳細(xì)的說明段的類型,比如PT_LOAD 表示加載的程序段

p_offset: 文件偏移

該段在文件中的偏移世吨。這個偏移是相對于整個文件的乙埃。

p_vaddr: 加載后的虛擬地址

該段加載后在進程空間中占用的內(nèi)存起始地址觅玻。

p_paddr: 該段的物理地址

這個字段被忽略虏束,因為在多數(shù)現(xiàn)代操作系統(tǒng)下物理地址是進程無法觸及的。

p_filesz: 該段在文件中占用的字節(jié)大小

有些段可能在文件中不存在但卻占用一定的內(nèi)存空間,此時這個字段為0。

p_memsz: 該段在內(nèi)存中占用的字節(jié)大小

有些段可能僅存在于文件中而不被加載到內(nèi)存,此時這個字段為0别智。

p_flags: 段的屬性

表示該段的讀寫執(zhí)行等屬性.elf.h文件中的定義是

#define PF_X (1 << 0) /* Segment is executable */
#define PF_W (1 << 1) /* Segment is writable */
#define PF_R (1 << 2) /* Segment is readable */
#define PF_MASKOS 0x0ff00000 /* OS-specific */
#define PF_MASKPROC 0xf0000000 /* Processor-specific */

p_align: 對齊

現(xiàn)代操作系統(tǒng)都使用虛擬內(nèi)存為進程序提供更大的空間,分頁技術(shù)功不可沒稼稿,頁就成了最小的內(nèi)存分配單位薄榛,不足一頁的按一頁算讳窟。所以加載程序數(shù)據(jù)一般也從一頁的起始地址開始,這就屬于對齊敞恋。

示例代碼:

#include <stdio.h>
#include <math.h>
#include <elf.h>
int main()
{
    typedef struct
    {
        int num;
    } student;
    student stu1;
    stu1.num = 133;
    printf("%d\n", stu1.num);
    return 0;
}
typedef struct _SegmentType_

{

    unsigned int type;

    char *typeName;

} SegmentType;

SegmentType segTyoe[] = {

    {0, "NULL"},
    {1, "LOAD"},

    {2, "DYNAMIC"},
    {3, "INTERP"},

    {4, "NOTE"},
    {5, "SHLIB"},

    {6, "PHDR"},
    {7, "TLS"},

    {8, "NUM"},
    {0x60000000, "LOOS"},
    {0x6474e550, "GNU_EH_FRAME"},
    {0x6474e551, "PT_GNU_STACK"},
    {0x6474e552, "PT_GNU_RELRO"},
    {0x6ffffffa, "PT_SUNWBSS"},
    {0x6ffffffb, "PT_SUNWSTACK"},
    {0x6fffffff, "PT_HISUNW"},

    {0x70000000, "PT_HIOS"},
    {0x7fffffff, "PT_HIPROC"},

};

char *findSegTypeName(unsigned int type)

{

    int i = 0;

    for (i = 0; i < sizeof(segTyoe) / sizeof(SegmentType); i++)
    {

        if (segTyoe[i].type == type)
        {

            return segTyoe[i].typeName;

            break;
        }
    }

    return segTyoe[0].typeName;
}

void displayPhdr(Elf32_Ehdr *ehdr, Elf32_Phdr *phdr)

{

    printf("Program Headers:\n");

    printf("%-20s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",

           "Type", "Offset", "VirtAddr", "PhysAddr", "FileSiz",

           "MemSiz", "Flg", "Align");

    int i = 0;

    for (i = 0; i < ehdr->e_phnum; i++)
    {

        printf("%-20s%-10x%-10x%-10x%-10x%-10x%-10x%-10x\n",

               findSegTypeName(phdr->p_type),

               phdr->p_offset,

               phdr->p_vaddr,

               phdr->p_paddr,

               phdr->p_filesz,

               phdr->p_memsz,

               phdr->p_flags,

               phdr->p_align

        );

        if (phdr->p_type == PT_INTERP)
        {

            printf("\t[Requesting program interpreter: %s]\n",

                   (char *)((char *)ehdr + phdr->p_offset));
        }

        phdr++;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丽啡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硬猫,更是在濱河造成了極大的恐慌补箍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啸蜜,死亡現(xiàn)場離奇詭異坑雅,居然都是意外死亡,警方通過查閱死者的電腦和手機衬横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門裹粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜂林,你說我怎么就攤上這事蛹尝。” “怎么了悉尾?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挫酿。 經(jīng)常有香客問我构眯,道長,這世上最難降的妖魔是什么早龟? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任惫霸,我火速辦了婚禮,結(jié)果婚禮上葱弟,老公的妹妹穿的比我還像新娘壹店。我一直安慰自己,他們只是感情好芝加,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布硅卢。 她就那樣靜靜地躺著,像睡著了一般藏杖。 火紅的嫁衣襯著肌膚如雪将塑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天蝌麸,我揣著相機與錄音点寥,去河邊找鬼。 笑死来吩,一個胖子當(dāng)著我的面吹牛敢辩,可吹牛的內(nèi)容都是我干的蔽莱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼戚长,長吁一口氣:“原來是場噩夢啊……” “哼盗冷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起历葛,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤正塌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恤溶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乓诽,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年咒程,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸠天。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡帐姻,死狀恐怖稠集,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饥瓷,我是刑警寧澤剥纷,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站呢铆,受9級特大地震影響晦鞋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棺克,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一悠垛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娜谊,春花似錦确买、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至派草,卻和暖如春撑帖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背澳眷。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工胡嘿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钳踊。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓衷敌,卻偏偏與公主長得像勿侯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缴罗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • [toc] 網(wǎng)址 深入理解程序構(gòu)造 LMA與VMA總結(jié) ELF文件解析和加載(附代碼) Linux及安全實踐四——...
    余帶鹽閱讀 528評論 0 0
  • 1. 背景 在我們的日常工作中經(jīng)常會遇到一些BUG助琐,而且這些BUG發(fā)生在native層,也就是在我們的so共...
    2baf611355d8閱讀 17,192評論 3 41
  • 王爽匯編全書知識點大綱 第一章 基礎(chǔ)知識 機器語言 匯編語言的產(chǎn)生 匯編語言的組成 存儲器 cpu對存儲器的讀寫 ...
    2c3ba901516f閱讀 2,421評論 0 1
  • 上一篇介紹了編譯連接的過程面氓,提到了目標(biāo)文件是通過匯編過程生成的兵钮,最終鏈接生成可執(zhí)行文件,這篇介紹一下目標(biāo)文件里面到...
    紙簡書生閱讀 1,181評論 0 4
  • 如果不計劃舌界,很多事情離自己就很遠(yuǎn)
    深思即可見閱讀 112評論 0 0