exec的實(shí)現(xiàn)流程

1. 這里看到纤垂,c語(yǔ)言用函數(shù)的簡(jiǎn)單封裝逸吵,實(shí)現(xiàn)面向?qū)ο蟮闹剌d效果(這樣說(shuō)似乎也不準(zhǔn)確?)厢破,

do_execve_file(file, argv, envp)

=>__do_execve_file

do_execve(filename, argv, envp) / do_execveat(fd, filename, argv, envp, flags)

=> do_execveat_common

==>__do_execve_file

2. 可執(zhí)行文件的加載

__do_execve_file(int fd, struct filename *filename,

? ? ? ? ? ? ? ? ? ? ? ? ? ? struct user_arg_ptr argv,

? ? ? ? ? ? ? ? ? ? ? ? ? ? struct user_arg_ptr envp,

? ? ? ? ? ? ? ? ? ? ? ? ? ? int flags, struct file *file)

==? //如果文件沒打開荣瑟, 打開,這里體現(xiàn)了兼容多種場(chǎng)景

? ? ? ? if (!file)

? ? ? ? ? ? ? ? file = do_open_execat(fd, filename, flags);


==? //這里有一次做負(fù)載均衡的調(diào)用機(jī)會(huì)

? ? sched_exec();


== 這部分就是建立環(huán)境摩泪,執(zhí)行

? ? ? ? retval = bprm_mm_init(bprm);

? ? ? ? if (retval)

? ? ? ? ? ? ? ? goto out_unmark;

? ? ? ? retval = prepare_arg_pages(bprm, argv, envp);

? ? ? ? if (retval < 0)

? ? ? ? ? ? ? ? goto out;

? ? ? ? /* Set the unchanging part of bprm->cred */

? ? ? ? retval = security_bprm_creds_for_exec(bprm);

? ? ? ? if (retval)

? ? ? ? ? ? ? ? goto out;

? ? ? ? //這里的copy操作最終會(huì)memcpy()

? ? ? ? retval = copy_string_kernel(bprm->filename, bprm);

? ? ? ? if (retval < 0)

? ? ? ? ? ? ? ? goto out;

? ? ? ? bprm->exec = bprm->p;

? ? ? ? retval = copy_strings(bprm->envc, envp, bprm);

? ? ? ? if (retval < 0)

? ? ? ? ? ? ? ? goto out;

? ? ? ? //這里的copy操作最終會(huì)copy_from_user()笆焰,將數(shù)據(jù)拷貝進(jìn)內(nèi)核

? ? ? ? retval = copy_strings(bprm->argc, argv, bprm);

? ? ? ? if (retval < 0)

? ? ? ? ? ? ? ? goto out;

? ? ? ? retval = exec_binprm(bprm);

? ? ? ? === //到支持列表匹配可執(zhí)行文件格式

? ? ? ? ? search_binary_handler(struct linux_binprm *bprm)

? ? ? ? ? ===//formats是一個(gè)在內(nèi)核中已經(jīng)注冊(cè)的可支持的可執(zhí)行文件的模塊的鏈表頭, 調(diào)用__register_binfmt()會(huì)注冊(cè)新的可執(zhí)行文件

? ? ? ? ? ? ? list_for_each_entry(fmt, &formats, lh)

? ? ? ? ? ? ? fmt->load_binary(bprm)


3. 5.8內(nèi)核支持的可執(zhí)行文件

aout:

static struct linux_binfmt aout_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_aout_binary,

? ? ? ? .load_shlib? ? = load_aout_library,

};

misc:

static struct linux_binfmt misc_format = {

? ? ? ? .module = THIS_MODULE,

? ? ? ? .load_binary = load_misc_binary,

};

em86:

static struct linux_binfmt em86_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_em86,

};

script:

static struct linux_binfmt script_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_script,

};

flat:

static struct linux_binfmt flat_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_flat_binary,

? ? ? ? .core_dump? ? ? = flat_core_dump,

? ? ? ? .min_coredump? = PAGE_SIZE

};

elf_fdpic:

static struct linux_binfmt elf_fdpic_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_elf_fdpic_binary,

#ifdef CONFIG_ELF_CORE

? ? ? ? .core_dump? ? ? = elf_fdpic_core_dump,

#endif

? ? ? ? .min_coredump? = ELF_EXEC_PAGESIZE,

};

elf:

static struct linux_binfmt elf_format = {

? ? ? ? .module? ? ? ? = THIS_MODULE,

? ? ? ? .load_binary? ? = load_elf_binary,

? ? ? ? .load_shlib? ? = load_elf_library,

? ? ? ? .core_dump? ? ? = elf_core_dump,

? ? ? ? .min_coredump? = ELF_EXEC_PAGESIZE,

};

4.執(zhí)行elf

load_binary()=>load_elf_binary()

==解析elf頭部

==加載文件

==價(jià)值解釋器

==執(zhí)行, start_thread(),就是把elf文件的入口地址(下一條要執(zhí)行指令的地址放入IP)见坑、堆嚷掠、棧放入寄存器

在load_elf_binary()函數(shù)中捏检,加載的可執(zhí)行文件將把當(dāng)前正在執(zhí)行的進(jìn)程的內(nèi)存空間完全覆蓋

a)如果可執(zhí)行文件是靜態(tài)鏈接的文件,進(jìn)程的IP寄存器值將被設(shè)置為main函數(shù)的入口地址不皆,從而開始新的進(jìn)程

b)如果可執(zhí)行文件是動(dòng)態(tài)鏈接的未檩,IP的值將被設(shè)置為加載器ld的入口地址,是程序的運(yùn)行由該加載器接管粟焊,ld會(huì)處理一些依賴的動(dòng)態(tài)鏈接庫(kù)相關(guān)的處理工作,使程序繼續(xù)往下執(zhí)行孙蒙,

當(dāng)前的進(jìn)程都會(huì)被新加載進(jìn)來(lái)的程序完全替換掉项棠,這也是我們最早的那個(gè)程序中第19行的信息沒有在終端上顯示的原因

總結(jié):

1)sys_execve()系統(tǒng)調(diào)用,進(jìn)入內(nèi)核空間

2) 加載新的可執(zhí)行文件挎峦,進(jìn)行可執(zhí)行性檢查

3)將新的可執(zhí)行文件映射(map)到當(dāng)前運(yùn)行進(jìn)程的進(jìn)程空間中香追,覆蓋原來(lái)的進(jìn)程數(shù)據(jù)

4)將EIP的值設(shè)置為新的可執(zhí)行程序的入口地址。

? 如果可執(zhí)行程序是靜態(tài)鏈接的程序坦胶,或不需要其他的動(dòng)態(tài)鏈接庫(kù)透典,則新的入口地址就是新的可執(zhí)行文件的main函數(shù)地址

? 如果可執(zhí)行程序還需要其他的動(dòng)態(tài)鏈接庫(kù),則入口地址是加載器ld的入口地址

5)返回用戶態(tài)顿苇,程序從新的EIP出開始繼續(xù)往下執(zhí)行峭咒。

老進(jìn)程的上下文已經(jīng)被新的進(jìn)程完全替代了,但是進(jìn)程的PID還是原來(lái)的纪岁。

從這個(gè)角度來(lái)看凑队,新的運(yùn)行進(jìn)程中已經(jīng)找不到原來(lái)的對(duì)execve調(diào)用的代碼了

所以execve函數(shù)的一個(gè)特別之處是他從來(lái)不會(huì)成功返回,而總是實(shí)現(xiàn)了一次完全的變身

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幔翰,一起剝皮案震驚了整個(gè)濱河市漩氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遗增,老刑警劉巖叫惊,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異做修,居然都是意外死亡霍狰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門缓待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚓耽,“玉大人,你說(shuō)我怎么就攤上這事旋炒〔接疲” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵瘫镇,是天一觀的道長(zhǎng)鼎兽。 經(jīng)常有香客問(wèn)我答姥,道長(zhǎng),這世上最難降的妖魔是什么谚咬? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任鹦付,我火速辦了婚禮,結(jié)果婚禮上择卦,老公的妹妹穿的比我還像新娘敲长。我一直安慰自己,他們只是感情好秉继,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布祈噪。 她就那樣靜靜地躺著,像睡著了一般尚辑。 火紅的嫁衣襯著肌膚如雪辑鲤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天杠茬,我揣著相機(jī)與錄音月褥,去河邊找鬼。 笑死瓢喉,一個(gè)胖子當(dāng)著我的面吹牛宁赤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灯荧,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼礁击,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了逗载?” 一聲冷哼從身側(cè)響起哆窿,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厉斟,沒想到半個(gè)月后挚躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擦秽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年码荔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片感挥。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缩搅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出触幼,到底是詐尸還是另有隱情硼瓣,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站堂鲤,受9級(jí)特大地震影響亿傅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘟栖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一葵擎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧半哟,春花似錦酬滤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至缅茉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間男摧,已是汗流浹背蔬墩。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耗拓,地道東北人拇颅。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乔询,于是被迫代替她去往敵國(guó)和親樟插。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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