分析ELF程式的核心堆積 core dump 過程

2021-05-22 04:35:38 字數 3244 閱讀 9523

概述

----

1) 當程序接收到某些異常訊號導致退出時

, 會在程序的當前目錄下生成乙個名為

"core"

的檔案,

將程序退出時的執行狀態堆積在該檔案中.

2) elf

的堆積檔案與應用程式和共享庫的結構相同

, 包括

elf檔案頭

, 程式段描述符表和各段資料.

堆積 檔案的第乙個段為注釋段

, 它順次堆積了處理機狀態

, 程序狀態

, 任務結構映象,

浮點暫存器映象

. 其餘

的各個段為可載入段

, 依次描述了程序虛存空間中各個虛存塊的映象.

**----

; arch/i386/kernel/signal.c:

int do_signal(struct pt_regs *regs, sigset_t *oldset)

; fs/exec.c

int do_coredump(long signr, struct pt_regs * regs)

; fs/binfmt_elf.c

struct elf_prstatus

處理機狀態堆積 ;

struct elf_prpsinfo

程序資訊堆積 ;

#define dump_write(addr, nr)

if ((size += (nr)) > limit || !dump_write(file, (addr), (nr)))

goto end_coredump;

#define dump_seek(off)

if (!dump_seek(file, (off)))

goto end_coredump;

struct memelfnote ;

elf堆積檔案的生成

-----------------

static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file)

else

*(struct pt_regs *)&prstatus.pr_reg = *regs;

#endif

#ifdef debug

dump_regs("passed in regs", (elf_greg_t *)regs);

dump_regs("prstatus regs", (elf_greg_t *)&prstatus.pr_reg);

#endif

notes[1].name = "core";

notes[1].type = nt_prpsinfo;

建立程序資訊段

notes[1].datasz = sizeof(psinfo);

notes[1].data = &psinfo;

i = current->state ? ffz(~current->state) + 1 : 0;

psinfo.pr_state = i;

程序狀態號

psinfo.pr_sname = (i < 0 || i > 5) ? '.' : "rsdztd"[ i ];

程序狀態名

psinfo.pr_zomb = psinfo.pr_sname == 'z';

程序是否已僵化

psinfo.pr_nice = current->nice;

程序優先數

psinfo.pr_flag = current->flags;

程序標誌

psinfo.pr_uid = new_to_old_uid(current->uid);

使用者號

psinfo.pr_gid = new_to_old_gid(current->gid);

使用者組號

strncpy(psinfo.pr_fname, current->comm, sizeof(psinfo.pr_fname));

程序名

notes[2].name = "core";

notes[2].type = nt_taskstruct;

堆積任務結構映象

notes[2].datasz = sizeof(*current);

notes[2].data = current;

/* try to dump the fpu. */

prstatus.pr_fpvalid = dump_fpu (regs, &fpu);

if (!prstatus.pr_fpvalid)

else

如果程序使用了浮點處理器

,則堆積

fpu暫存器映象

/* write notes phdr entry */

/* page-align dumped data */

dataoff = offset = roundup(offset, elf_exec_pagesize);

/* write program headers for segments dump */ ;

掃瞄虛存鏈

,寫入段描述符

for(vma = current->mm->mmap; vma != null; vma = vma->vm_next)

for(i = 0; i < numnote; i++)

if (!writenote(¬es[ i ], file))

寫入注釋段的各個片段

goto end_coredump;

set_fs(fs);

dump_seek(dataoff);

頁對齊

for(vma = current->mm->mmap; vma != null; vma = vma->vm_next) else }

} if ((off_t) file->f_pos != offset)

end_coredump:

set_fs(fs);

return has_dumped; }

static int writenote(struct memelfnote *men, struct file *file)

測試某個記憶體塊是否可以堆積

--------------------------

static inline int maydump(struct vm_area_struct *vma)

Linux核心分析 程式破解

1 掌握nop jne je jmp cmp彙編指令的機器碼 nop nop指令即 空指令 執行到nop指令時,cpu什麼也不做,僅僅當做乙個指令執行過去並繼續執行nop後面的一條指令。機器碼 90 jne 條件轉移指令,如果不相等則跳轉。機器碼 75 je 條件轉移指令,如果相等則跳轉。機器碼 7...

分析elf檔案的利器(常用命令)

1 readelf 針對elf檔案的解析器 readelf a a.out 2 objdump h objdump h a.out 將elf檔案的各個段的基本資訊列印出來 objdump x a.out可以列印更多的資訊,但是比較雜亂 3 size size命令檢視elf檔案的 段 資料段和bss段...

zTree 核心的分析

ztree的核心 結構 function 判斷是否傳遞了第乙個引數 if ztreesetting 獲取樹的容器id setting.treeobjid this.attr id 樹的容器 setting.treeobj this 繫結自定義事件 bindtreenodes setting,this...