日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android的got表HOOK實現代碼

瀏覽:26日期:2023-12-08 17:05:10
概述

對于android的so文件的hook根據ELF文件特性分為:Got表hook、Sym表hook和inline hook等。全局符號表(GOT表)hook,它是通過解析SO文件,將待hook函數在got表的地址替換為自己函數的入口地址,這樣目標進程每次調用待hook函數時,實際上是執行了我們自己的函數。

Androd so注入和函數Hook(基于got表)的步驟:

1.ptrace附加目標pid進程;2.在目標pid進程中,查找內存空間(用于存放被注入的so文件的路徑和so中被調用的函數的名稱或者shellcode);3.調用目標pid進程中的dlopen、dlsym等函數,用于加載so文件實現Android so的注入和函數的Hook;4.釋放附加的目標pid進程和卸載注入的so文件。

具體代碼實現

以下以fopen函數進行got hook為例。

//獲取模塊地址功能實現void* getModuleBase(pid_t pid, const char* module_name){ FILE* fp; long address = 0; char* pch; char filename[32]; char line[1024]; // 格式化字符串得到 '/proc/pid/maps' if(pid < 0){snprintf(filename, sizeof(filename), '/proc/self/maps'); }else{snprintf(filename, sizeof(filename), '/proc/%d/maps', pid); } // 打開文件/proc/pid/maps,獲取指定pid進程加載的內存模塊信息 fp = fopen(filename, 'r'); if(fp != NULL){// 每次一行,讀取文件 /proc/pid/maps中內容while(fgets(line, sizeof(line), fp)){ // 查找指定的so模塊 if(strstr(line, module_name)){// 分割字符串pch = strtok(line, '-');// 字符串轉長整形address = strtoul(pch, NULL, 16); }break; }} } fclose(fp); return (void*)address;}

//hook fopen進行實現//(libxxxx.so文件是ELF32文件)#define LIBPATH '/data/app-lib/com.xxxx/libxxxx.so'int hookFopen(){ // 獲取目標pid中'/data/app-lib/com.xxxx/libxxxx.so'模塊的加載地址 void* base_addr = getModuleBase(getpid(), LIBPATH ); // 保存Hook目標函數的原始調用地址 old_fopen = fopen; int fd; // 用open打開內存模塊文件'/data/app-lib/com.xxxx/libxxxx.so' fd = open(LIB_PATH, O_RDONLY); if(-1 == fd){return -1; } // elf32文件的文件頭結構體Elf32_Ehdr Elf32_Ehdr ehdr; // 讀取elf32格式的文件'/data/app-lib/com.xxxx/libxxxx.so'的文件頭信息 read(fd, &ehdr, sizeof(Elf32_Ehdr)); // elf32文件中節區表信息結構的文件偏移 unsigned long shdr_addr = ehdr.e_shoff; // elf32文件中節區表信息結構的數量 int shnum = ehdr.e_shnum; // elf32文件中每個節區表信息結構中的單個信息結構的大小(描述每個節區的信息的結構體的大小) int shent_size = ehdr.e_shentsize; // elf32文件節區表中每個節區的名稱存放的節區名稱字符串表,在節區表中的序號index unsigned long stridx = ehdr.e_shstrndx; Elf32_Shdr shdr; lseek(fd, shdr_addr + stridx * shent_size, SEEK_SET); // 讀取elf32文件中的描述每個節區的信息的結構體(這里是保存elf32文件的每個節區的名稱字符串的) read(fd, &shdr, shent_size); // 為保存elf32文件的所有的節區的名稱字符串申請內存空間 char * string_table = (char *)malloc(shdr.sh_size); // 定位到具體存放elf32文件的所有的節區的名稱字符串的文件偏移處 lseek(fd, shdr.sh_offset, SEEK_SET); read(fd, string_table, shdr.sh_size); lseek(fd, shdr_addr, SEEK_SET); int i; uint32_t out_addr = 0; uint32_t out_size = 0; uint32_t got_item = 0; int32_t got_found = 0; // 循環遍歷elf32文件的節區表(描述每個節區的信息的結構體) for(i = 0; i<shnum; i++){// 依次讀取節區表中每個描述節區的信息的結構體read(fd, &shdr, shent_size);// 判斷當前節區描述結構體描述的節區是否是SHT_PROGBITS類型//類型為SHT_PROGBITS的.got節區包含全局偏移表if(shdr.sh_type == SHT_PROGBITS){ // 獲取節區的名稱字符串在保存所有節區的名稱字符串段.shstrtab中的序號 int name_idx = shdr.sh_name; // 判斷節區的名稱是否為'.got.plt'或者'.got' if(strcmp(&(string_table[name_idx]), '.got.plt') == 0|| strcmp(&(string_table[name_idx]), '.got') == 0){// 獲取節區'.got'或者'.got.plt'在內存中實際數據存放地址out_addr = base_addr + shdr.sh_addr;// 獲取節區'.got'或者'.got.plt'的大小out_size = shdr.sh_size;int j = 0;// 遍歷節區'.got'或者'.got.plt'獲取保存的全局的函數調用地址for(j = 0; j<out_size; j += 4){ // 獲取節區'.got'或者'.got.plt'中的單個函數的調用地址 got_item = *(uint32_t*)(out_addr + j); // 判斷節區'.got'或者'.got.plt'中函數調用地址是否是將要被Hook的目標函數地址 if(got_item == old_fopen){got_found = 1;// 獲取當前內存分頁的大小uint32_t page_size = getpagesize();// 獲取內存分頁的起始地址(需要內存對齊)uint32_t entry_page_start = (out_addr + j) & (~(page_size - 1)); // 修改內存屬性為可讀可寫可執行if(mprotect((uint32_t*)entry_page_start, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == -1){ return -1;} // Hook的函數,是我們自己定義的函數got_item = new_fopen; // 進行恢復內存屬性為可讀可執行if(mprotect((uint32_t*)entry_page_start, page_size, PROT_READ | PROT_EXEC) == -1){ return -1;}break; // 目標函數的調用地址已經被Hook了 }else if(got_item == new_fopen){break; }}// 對目標函數HOOk成功,跳出循環if(got_found) break; }} } free(string_table); close(fd);}

到此這篇關于android的got表HOOK實現代碼的文章就介紹到這了,更多相關android HOOK實現got表內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂va欧美ⅴa亚洲va一国产| 99免费精品| 日韩天堂av| 91精品一区国产高清在线gif | 国产传媒在线| 精品无人区麻豆乱码久久久 | 久久久久.com| 99久久久久国产精品| 久久久五月天| 久久视频国产| 米奇777超碰欧美日韩亚洲| 国产高清一区二区| 国产麻豆综合| 中文字幕一区二区三区四区久久| 日韩精品一二区| 亚洲精品激情| 视频一区二区三区中文字幕| 亚洲香蕉久久| 欧美私人啪啪vps| 国产精品一线天粉嫩av| 国产精品极品| 国产69精品久久| 亚洲成人va| 欧美亚洲国产精品久久| 亚洲免费影视| 欧美日本二区| 成人在线视频中文字幕| 欧美日中文字幕| 久久都是精品| 久久精品xxxxx| 国产成人精选| 国产资源在线观看入口av| 久久久久久久久久久妇女| 亚洲激情二区| 日韩avvvv在线播放| 精品久久影院| 不卡视频在线| 日韩精品亚洲专区在线观看| 久久的色偷偷| 久久久精品网| 日韩一区二区三区精品视频第3页| 国产美女视频一区二区| 国产综合色区在线观看| 免费的成人av| 久久尤物视频| 亚洲欧美日韩高清在线| 视频一区中文字幕精品| 麻豆91在线播放| 欧美高清不卡| 午夜久久av| 岛国av免费在线观看| 免费国产自线拍一欧美视频| 国产精品综合| 欧美成人高清| 国产精品视频3p| 精品捆绑调教一区二区三区| 最近国产精品视频| 高清精品久久| 日韩一区中文| 久久精品影视| 国产精品九九| 亚洲二区三区不卡| 国产探花一区| 黄色不卡一区| 久久精品国产99国产| 每日更新成人在线视频| 精品一级视频| 亚洲精品免费观看| se01亚洲视频| 日韩成人一级| 五月天久久777| 精品日韩一区| 日本不卡一区二区三区| 欧美日韩一区二区综合| 国产精品久久久网站| 伊人精品视频| 国产一区调教| 亚洲日本久久| 亚洲高清毛片| 电影91久久久| 日韩一区二区三免费高清在线观看 | 欧美日韩精品免费观看视频完整| 日本少妇精品亚洲第一区| 久久精品青草| 国产精品亚洲产品| 国产视频一区三区| 91视频久久| 国产精品最新| 少妇精品久久久一区二区三区| 欧美成人国产| 日韩深夜视频| 国产精品观看| 亚洲欧美久久精品| 韩日一区二区三区| 国产超碰精品| 欧美国产小视频| 欧美亚洲tv| 亚洲欧洲免费| 久久亚洲色图| 欧洲av不卡| 欧美激情视频一区二区三区免费 | 亚洲免费激情| 91精品一区国产高清在线gif| 精品午夜av| 欧美精品成人| 国产欧美一区二区三区米奇| 美国三级日本三级久久99| 91成人精品视频| 久久国产中文字幕| 日韩免费久久| 日本蜜桃在线观看视频| 久久精品女人| 国产精品sm| 亚洲v天堂v手机在线| 亚洲一区久久| 国产亚洲午夜| 香蕉成人久久| 国产精品婷婷| 六月婷婷一区| 蜜桃久久久久久| 亚洲人成网77777色在线播放| 亚洲中字黄色| 国产精品试看| 免费人成精品欧美精品 | 婷婷视频一区二区三区| 影音先锋久久精品| 国产精品嫩草99av在线| 亚洲一区二区三区四区五区午夜| 激情婷婷欧美| 激情欧美亚洲| 欧美日韩日本国产亚洲在线| 国产精品普通话对白| 久久亚洲风情| 亚洲精品日韩久久| 91在线成人| 欧美视频久久| 国产精品久久久久久久久久白浆 | 先锋影音国产一区| 水野朝阳av一区二区三区| 亚洲专区一区| 亚洲精品视频一二三区| 日韩在线观看中文字幕| 日本成人在线视频网站| 国产欧美日韩综合一区在线播放| 欧美日韩一区二区三区四区在线观看| 国产丝袜一区| 国产成人免费| 国产综合婷婷| 免费看日韩精品| 日本欧美久久久久免费播放网| 国产精品白丝一区二区三区| 国产精品久久久久蜜臀| 国产麻豆久久| 国产精品美女久久久| 亚洲精品进入| 久久99性xxx老妇胖精品| 四虎4545www国产精品 | 日韩有码av| 麻豆视频久久| 久久久久中文| 一区免费在线| 日本国产欧美| 日韩在线欧美| 亚洲视频国产精品| 久久只有精品| 欧美日韩水蜜桃| 综合色一区二区| 精品一区二区三区中文字幕视频| 日韩欧美一区二区三区在线观看| 久久av一区| 久久亚洲人体| 日韩视频不卡| 国产精品一区二区精品 | 国产精品88久久久久久| 亚洲永久精品唐人导航网址| 国产精品白丝一区二区三区| 久久精品国产大片免费观看| 婷婷视频一区二区三区| 国内精品伊人| 香蕉久久夜色精品国产| 国产精品xvideos88| 激情久久久久久久| 91欧美精品| 在线一区视频观看| 日韩激情网站| 久久国产毛片| 久久国产欧美日韩精品| 精品视频在线你懂得| 欧美精品一区二区三区精品| 91大神在线观看线路一区| xxxxx性欧美特大| 婷婷综合电影| 久久久久美女| 国产毛片精品| 欧美不卡高清| 麻豆精品新av中文字幕| 国产精品丝袜xxxxxxx| 国产精品99在线观看| 三级欧美在线一区| 丁香六月综合|