init arry的作用,可以沒有init arry嘛?(面試題)

https://bbs.kanxue.com/thread-282657.htm
對init_array段調用的方法進行Hook
https://bbs.kanxue.com/thread-191092.htm
init_array原理簡單說明
https://bbs.kanxue.com/thread-280135.htm
frida hook init_array自吐新解

init_array 的作用,以及是否可以沒有 init_array


1. init_array 是什么?

init_array 是 ELF(Executable and Linkable Format)格式中的 初始化段(.init_array),用于存儲在動態庫(.so)或可執行文件(ELF)加載時自動執行的函數指針

當程序啟動時,動態鏈接器 (ld.so) 會按照順序執行 init_array 段中的所有函數,這通常用于全局變量初始化、動態 Hook、反調試等功能


2. init_array 的作用

init_array 段的作用主要有:

  1. 全局構造函數初始化

    • 在 C++ 代碼中,全局對象的構造函數global constructor)會自動加入 init_array,確保在 main() 之前執行:
      #include <iostream>
      class Test {
      public:Test() { std::cout << "Test Constructor\n"; }
      };
      Test t;  // 這個構造函數會被放入 `.init_array`
      int main() {std::cout << "Main Function\n";return 0;
      }
      
    • 執行順序:
      Test Constructor
      Main Function
      
  2. 手動注冊初始化函數

    • 可以在 init_array 中手動添加函數:
      #include <stdio.h>
      __attribute__((constructor)) void init_func() {printf("Init Function Executed\n");
      }
      
      等價于
      void init_func() { printf("Init Function Executed\n"); }
      __attribute__((section(".init_array"))) void (*init_func_ptr)() = init_func;
      
  3. 反調試/保護代碼執行

    • 某些 so 文件會在 init_array 中放入反調試代碼,例如:
      void anti_debug() {if (ptrace(PTRACE_TRACEME, 0, 0, 0) == -1) {exit(1);}
      }
      __attribute__((section(".init_array"))) void (*ptr)() = anti_debug;
      
      這樣,調試器很難在 main() 之前附加到進程。

3. init_array 是否可以沒有?

可以沒有,但會影響某些功能。

情況 1:C 語言程序(沒有全局構造函數)
  • 如果只用 C 語言,不使用 __attribute__((constructor)),也不依賴 init_array 進行初始化,那 init_array 可以為空,不會影響程序運行。
情況 2:C++ 程序(有全局對象構造函數)
  • 不能去掉 init_array
  • 因為 C++ 的全局對象 必須在 main() 之前構造,如果刪除 init_arrayglobal constructor 可能不會執行,導致程序異常。
情況 3:so 文件(共享庫)
  • 如果 so 里面不使用 init_array 進行初始化(比如不涉及 JNI_OnLoad、全局構造、反調試等),可以去掉,但如果有全局變量初始化,可能會引起運行時錯誤。

4. 如何手動去掉 init_array

如果要移除 init_array,可以:

  1. 重新編譯時禁用
    gcc/clang 編譯時加上:

    gcc -nostartfiles -o no_init main.c
    

    這樣不會自動生成 init_array

  2. 使用 objcopy 修改 ELF

    objcopy --remove-section .init_array target.elf
    

    這樣 init_array 就會被移除。

  3. 修改 ld 鏈接腳本

    • 可以修改 ld 鏈接腳本:
      SECTIONS {.init_array : { KEEP(*(.init_array)) }
      }
      
      刪除 KEEP(*(.init_array))init_array 就不會被包含。

5. 如何動態 Hook init_array

如果想攔截 init_array 中的函數執行,可以:

  • 使用 LD_PRELOAD 攔截
    LD_PRELOAD=hook.so ./target
    
  • 使用 Frida 動態 Hook
    var baseAddr = Module.findBaseAddress("target.so");
    var initArrayAddr = baseAddr.add(0x1234); // 具體偏移需要分析
    Memory.scan(initArrayAddr, 0x100, "?? ?? ?? ??", {onMatch: function (addr, size) {console.log("Found init_array entry:", addr);}
    });
    
  • 使用 gdb 斷點調試
    gdb -q target
    break *0x400600  # init_array 入口地址
    run
    

總結

是否可以沒有 init_array影響
純 C 語言,沒有全局變量構造可以沒有,不會影響
C++ 代碼,有全局對象不能去掉,否則 global constructor 不執行
共享庫(.so),有 JNI_OnLoad__attribute__((constructor))不能去掉,否則初始化邏輯可能失效
共享庫(.so),無全局初始化可以沒有,但需測試是否影響運行

結論

  • 普通 C 代碼可以去掉 init_array,但 C++ 代碼、共享庫一般不能去掉
  • 反調試、全局變量初始化、JNI 代碼等 依賴 init_array,去掉可能會導致程序異常。
  • 逆向時可以 Hook init_array 進行分析或修改初始化邏輯。

如果你是遇到 init_array 相關的問題,歡迎提供具體場景,我可以給出更詳細的建議!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72937.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯真題0團建dfs+哈希表/鄰接表

dfs鄰接表儲存或者哈希表的運用&#xff0c;考察我們對數據的存儲 本題核心就是在求從根節點開始的兩棵樹相同的最長序列&#xff0c;首先確定用dfs進行深搜&#xff0c;對于節點的形式可以用鄰接表&#xff0c;鄰接矩陣&#xff0c;哈希表來進行存儲數據。下面看代碼 鄰接表 …

使用 AIStor、MLflow 和 KServe 將模型部署到 Kubernetes

在之前幾篇關于 MLOps 工具的文章中&#xff0c;我展示了有多少流行的 MLOps 工具跟蹤與模型訓練實驗相關的指標。我還展示了他們如何使用 MinIO 來存儲作為模型訓練管道一部分的非結構化數據。但是&#xff0c;一個好的 MLOps 工具應該做的不僅僅是管理您的實驗、數據集和模型…

kali linux web掃描工具

Kali Linux是一款專為網絡安全領域而打造的操作系統&#xff0c;提供了眾多優秀的安全工具&#xff0c;其中就包括了強大的web掃描工具。Web掃描是網絡安全檢測的一個重要環節&#xff0c;它可以幫助安全專家檢測網站的漏洞&#xff0c;提升網站的安全性。 Kali Linux中集成了…

Linux losetup循環設備

好的&#xff0c;以下是命令的中文解釋和使用步驟&#xff1a; 命令解釋&#xff1a; losetup -r /dev/loop0 /system/app.bin&#xff1a; losetup 是一個用于將文件與循環設備&#xff08;loop device&#xff09;關聯的命令。-r 選項表示將循環設備設置為只讀模式。/dev/lo…

【js逆向】

地址&#xff1a;aHR0cHM6Ly93d3cud2VpYm90b3AuY24vMi4wLw f12進入 debugger&#xff0c;過debugger 查看預覽數據 全局搜索 請求網址中的 api.weibotop.cn 在下方疑似找到了加密和解密的函數 斷點調試 控制臺輸出 那個n就是 常見的 cryptoJs庫 const cryptoJs require(cry…

1.Intel BIOS 開發指南詳細介紹

1. 引言 目的: Intel BIOS 開發指南旨在為開發者提供詳細的指導,幫助他們理解和實現 Intel 平臺上的 BIOS 功能。 適用對象: 適用于希望開發、調試和優化 BIOS 的硬件工程師、軟件工程師和系統集成商。 版本信息: 確保你使用的是最新版本的指南,以獲取最新的信息和最佳實…

deepseek在pycharm中的配置和簡單應用

對于最常用的調試python腳本開發環境pycharm&#xff0c;如何接入deepseek是我們窺探ai代碼編寫的第一步&#xff0c;熟悉起來總沒壞處。 1、官網安裝pycharm社區版&#xff08;免費&#xff09;&#xff0c;如果需要安裝專業版&#xff0c;需要另外找破解碼。 2、安裝Ollama…

【論文閱讀】多模態——LSeg

文獻基本信息 標題&#xff1a;Language-Driven Semantic Segmentation作者&#xff1a;Boyi Li、Kilian Q. Weinberger、Serge Belongie、Vladlen Koltun、Ren Ranftl單位&#xff1a;Cornell University、University of Copenhagen、Apple、Intel Labs會議/期刊&#xff1a;…

【MySQL基礎-1】MySQL 用戶管理指南:創建用戶、修改密碼與權限分配

MySQL 作為廣泛使用的關系型數據庫管理系統&#xff0c;用戶管理和權限分配是其核心功能之一。合理創建用戶、修改密碼以及分配權限&#xff0c;不僅能保障數據庫的安全性&#xff0c;還能有效控制用戶的操作范圍。本文將詳細介紹如何在 MySQL 中創建用戶、修改用戶密碼以及分配…

影刀RPA編碼版與流程版解析

影刀RPA編碼版是影刀RPA的一個高級版本&#xff0c;它結合了流程版的可視化操作和編碼版的強大靈活性&#xff0c;以下是對影刀RPA編碼版的詳細介紹&#xff1a; 1. 功能對比 流程版&#xff1a; 可視化操作&#xff1a;通過拖拽式流程設計器&#xff0c;用戶可以像搭積木一樣…

20天 - TCP 和 UDP 有什么區別?說說 TCP 的三次握手?TCP 是用來解決什么問題?

TCP 和 UDP 有什么區別&#xff1f; TCP&#xff08;傳輸控制協議&#xff09;和 UDP&#xff08;用戶數據報協議&#xff09;都是傳輸層的網絡協議&#xff0c;它們的主要區別如下&#xff1a; 連接方式 TCP&#xff1a;面向連接的協議&#xff0c;類似于打電話&#xff0c…

【MySQL_05】語法簡述(是語法,不詳細介紹各種語句)

文章目錄 一、基本規則二、標識符規則三、數據類型四、運算符五、關鍵字六、SQL 語句的通用語法結構 歷史文章點擊&#x1f449;&#xff1a;SQL &#x1f408;??github&#xff1a;https://github.com/mysql &#x1f4bb;官網&#xff1a; https://www.mysql.com &#…

JavaScript中的生成器函數詳解

在 JavaScript 中&#xff0c;生成器函數 Generator Function 是一種特殊的函數&#xff0c;它允許你在函數執行過程中暫停和恢復。生成器函數通過 function* 語法定義&#xff0c;并使用 yield 關鍵字來控制函數的執行流程。生成器函數返回一個生成器對象&#xff0c;該對象遵…

計算機網絡——交換機

一、什么是交換機&#xff1f; 交換機&#xff08;Switch&#xff09;是局域網&#xff08;LAN&#xff09;中的核心設備&#xff0c;負責在 數據鏈路層&#xff08;OSI第二層&#xff09;高效轉發數據幀。它像一位“智能交通警察”&#xff0c;根據設備的 MAC地址 精準引導數…

Git合并工具在開發中的使用指南

在團隊協作開發中&#xff0c;Git 是最常用的版本控制工具&#xff0c;而代碼合并&#xff08;Merge&#xff09;是多人協作不可避免的環節。當多個開發者同時修改同一文件的相同區域時&#xff0c;Git 無法自動完成合并&#xff0c;此時需要借助合并工具&#xff08;Merge Too…

實現多語言適配

1.在res下創建多語言資源文件&#xff1a; 2.選擇需要的語言 然后得到多種語言適配string文件&#xff1a; 3.代碼設置多語言 object LanguageHelper {/*** 獲取適配的 Context*/fun getAttachBaseContext(context: Context): Context {return if (Build.VERSION.SDK_INT > …

【學習方法一】

學習方法一 一、通用高效學習法二、學科專項方法三、工具與技術輔助四、習慣與心理策略五、避免常見誤區總結六、進階學習策略七、解決學習痛點八、場景化學習法九、資源與工具推薦十、個性化學習調整十一、長期學習心態十二、常見問題QA十三、應對特殊挑戰的學習法十四、健康與…

Golang學習筆記_44——命令模式

Golang學習筆記_41——觀察者模式 Golang學習筆記_42——迭代器模式 Golang學習筆記_43——責任鏈模式 文章目錄 一、核心概念1. 定義2. 解決的問題3. 核心角色4. 類圖 二、特點分析三、適用場景1. 事務管理系統2. 多媒體遙控器3. 操作審計系統 四、Go語言實現示例五、高級應用…

應急響應--流量分析

&#xff08;一&#xff09;Cobalt Strike流量特征分析 1.HTTP特征 源碼特征&#xff1a; 在流量中&#xff0c;通過http協議的url路徑&#xff0c;在checksum8解密算法計算后&#xff0c;32位的后門得到的結果是92&#xff0c;64位的后門得到的結果是93&#xff0c;該特征符…

CI/CD—Jenkins配置一次完整的jar自動化發布流程

背景&#xff1a; 實現設想&#xff1a; 要創建自動化發布&#xff0c;需要準備一臺測試服務器提前安裝好java運行所需的環境&#xff0c;JDK版本最好和Windows開發機器上的版本一致&#xff0c;在Jenkins上配置將構建好的jar上傳到測試服務器上&#xff0c;測試服務器自動啟動…