一歩一歩Linux HOOK APIに入ります(六)
一歩一歩Linux HOOK APIに入ります(六)
前節では、GDBを手動で介してprintfのパラメータをブロックする方法について説明しましたが、ELFは私たちが紹介したものだけではありません.実戦を経て、ELFファイルフォーマットの探索の旅に戻らなければなりません.今日は何を話しますか?
ダイナミックセクションのタイプはSHT_ですDYNAMIC,
ダイナミックセクションの定義を見てみましょう.
一見、この構造は簡単そうですね.2人だけで、1歳が連合体です.これは気がふさいで、いつd_を使いますval.いつd_を使うの?prtは?
ダイナミックセクションには多くの異なるタイプがある.メンバーd_tagは構造のタイプ値を与え、d_unメンバーはd_val.それともd_prtはこの構造体のタイプを見なければなりません.幸いなことに、私たちは主にDT_を知っています.NEEDED,DT_NEEDEDは定数1として定義され、DT_に対してNEEDEDタイプのダイナミック構造彼のd_valメンバーは、このELFファイルに依存する外部動的ライブラリの名前を示す文字列テーブルのインデックスです.あなたのELFファイルはどれだけのダイナミックライブラリに依存すればどれだけのDTがありますか?NEEDEDタイプのダイナミック構造がダイナミックテーブルに現れる.
次に、シンボルテーブルの印刷とほぼ同じコードの例を示します.
前節では、GDBを手動で介してprintfのパラメータをブロックする方法について説明しましたが、ELFは私たちが紹介したものだけではありません.実戦を経て、ELFファイルフォーマットの探索の旅に戻らなければなりません.今日は何を話しますか?
ダイナミックセクションのタイプはSHT_ですDYNAMIC,
ダイナミックセクションの定義を見てみましょう.
typedef struct
{
Elf32_Sword d_tag; /* Dynamic entry type */
union
{
Elf32_Word d_val; /* Integer value */
Elf32_Addr d_ptr; /* Address value */
} d_un;
} Elf32_Dyn;
一見、この構造は簡単そうですね.2人だけで、1歳が連合体です.これは気がふさいで、いつd_を使いますval.いつd_を使うの?prtは?
ダイナミックセクションには多くの異なるタイプがある.メンバーd_tagは構造のタイプ値を与え、d_unメンバーはd_val.それともd_prtはこの構造体のタイプを見なければなりません.幸いなことに、私たちは主にDT_を知っています.NEEDED,DT_NEEDEDは定数1として定義され、DT_に対してNEEDEDタイプのダイナミック構造彼のd_valメンバーは、このELFファイルに依存する外部動的ライブラリの名前を示す文字列テーブルのインデックスです.あなたのELFファイルはどれだけのダイナミックライブラリに依存すればどれだけのDTがありますか?NEEDEDタイプのダイナミック構造がダイナミックテーブルに現れる.
次に、シンボルテーブルの印刷とほぼ同じコードの例を示します.
#include "readDyn.h"
DynType dynName[] = {
"DT_NULL",0,"DT_NEEDED", 1,"DT_PLTRELSZ","DT_PLTGOT",
3,"DT_HASH",4,"DT_STRTAB", 5"DT_SYMTAB", 6,"DT_RELA", 7,
"DT_RELASZ", 8,"DT_RELAENT",9,"DT_STRSZ",10,"DT_SYMENT",
11,"DT_INIT",12,"DT_FINI",13,"DT_SONAME",14,"DT_RPATH",15,
"DT_SYMBOLIC",16,"DT_REL",17,"DT_RELSZ",18,"DT_RELENT",19,
"DT_PLTREL", 20,"DT_DEBUG",21,"DT_TEXTREL", 22,"DT_JMPREL",
23,"DT_BIND_NOW",24,"DT_INIT_ARRAY",25,"DT_FINI_ARRAY",26,
"DT_INIT_ARRAYSZ",27,"DT_FINI_ARRAYSZ",28,"DT_RUNPATH",29,
"DT_FLAGS",30,"DT_ENCODING",32,"DT_PREINIT_ARRAY",32,
"DT_PREINIT_ARRAYSZ", 33,"DT_NUM",34,"DT_LOOS",0x6000000d,
"DT_HIOS",0x6ffff000,"DT_LOPROC",0x70000000,"DT_HIPROC",
0x7fffffff,
};
char* findDynTypeName(unsigned int type)
{
int i = 0;
for(i = 0;i < sizeof(dynName) / sizeof(DynType);i++){
if(dynName[i].type == type){
return dynName[i].typeName;
break;
}
}
return dynName[0].typeName;
}
void display_dyn(Elf32_Ehdr *ehdr,Elf32_Shdr *shdr)
{
Elf32_Dyn *dyn = (Elf32_Dyn *)((char*)ehdr + shdr->sh_offset);
char *symName = (char*)(((Elf32_Shdr *)((char*)ehdr + ehdr->e_shoff + shdr->sh_link * sizeof(Elf32_Shdr)))->sh_offset
+ (char*)ehdr);
printf("symb = 0x%x
",(char*)dyn);
printf("symName = 0x%x
",(char*)symName);
printf("Dynamic section at offset 0x%x contains entries:
",dyn);
int i = 0;
printf("%-10s%-10s%s
","Tag","Type","Name/Value");
do{
printf("%-10x",dyn->d_tag);
printf("%-10s",findDynTypeName(dyn->d_tag));
if(dyn->d_tag == DT_NEEDED){
printf("%s",symName + dyn->d_un.d_ptr);
}else{
printf("%x",dyn->d_un.d_val);
}
printf("
");
}while(dyn->d_tag != DT_NULL && dyn++);
}
void displayDyn(Elf32_Ehdr *ehdr,Elf32_Shdr *shdr)
{
int py = ehdr->e_shstrndx * sizeof(Elf32_Shdr);
Elf32_Shdr *symtab = (Elf32_Shdr *)((char*)shdr + py);
char *szShdrName = (char*)(symtab->sh_offset + (char*)ehdr);
int i = 0;
for(i = 0; i < ehdr->e_shnum; i++){
if(shdr->sh_type == SHT_DYNAMIC){
display_dyn(ehdr,shdr);
}
shdr++;
}
}