帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:SHA  Shared  PROC  分享  tool  入侵  对象  
Tool for injecting a shared object into a Linux process

  • 源代碼名稱:linux-inject
  • 源代碼網址:http://www.github.com/gaffe23/linux-inject
  • linux-inject源代碼文檔
  • linux-inject源代碼下載
  • Git URL:
    git://www.github.com/gaffe23/linux-inject.git
  • Git Clone代碼到本地:
    git clone http://www.github.com/gaffe23/linux-inject
  • Subversion代碼到本地:
    $ svn co --depth empty http://www.github.com/gaffe23/linux-inject
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • linux注入

    將共享對象注入到Linux進程的工具

    • 提供在 Windows 上使用 CreateRemoteThread() 將DLL插入正在運行的進程的等價的Linux

    • 在注入過程中,由於目標進程已經在運行,所以使用 ptrace() 而不是 LD_PRELOAD 執行注入

    • 支持 x86,x86_64和 ARM

    • 不需要使用 -ldl 標誌構建目標進程,因為它使用來自libc的__libc_dlopen_mode() 載入共享對象,而不使用來自libdl的dlopen() 載入共享對象。

    關於 ptrace()的警告

    • 對於許多Linux發行版,默認配置內核以防止任何進程在未創建( 比如 )的另一個進程上調用 ptrace() 。 通過 fork() ) 。

    • 這是一個安全特性,旨在防止這裡工具導致的錯誤類型。

    • 在下次使用以下命令重新引導之前,你可以暫時禁用它:

       echo 0 | sudo tee/proc/sys/kernel/yama/ptrace_scope

    編譯

    • 簡單地運行 make 應該自動選擇和構建正確的架構,但如果( 或者你希望手動選擇目標) 失敗,請運行下列命令之一:

      • 手臂:

         make arm
      • x86:

         make x86
      • x86_64:

         make x86_64

    用法

    ./inject [-n process-name] [-p pid] [library-to-inject]

    示例

    • 在一個終端中,啟動樣例目標應用程序,該應用程序每秒只輸出"睡眠。":

      . /sample-target
    • 在另一個終端中,將 sample-library.so 插入目標應用程序:

      . /inject -n sample-target sample-library.so
    • 輸出應該類似於以下內容:

    • 第一個終端:

       $./sample-target
       sleeping...
       sleeping...
       I just got loaded
       sleeping...
       sleeping...
    • 第二個終端:

       $./inject -n sample-target sample-library.so
       targeting process"sample-target" with pid 31490
       library"sample-library.so" successfully injected
       $
    • 如果注入失敗,請確保電腦配置為允許進程對未創建的其他進程進行處理。 請參見上面的"關於 ptrace()的警告"部分。

    • 通過檢查 /proc/[pid]/maps,你可以驗證注入是否成功:

       $ cat/proc/$(pgrep sample-target)/maps
       [...]
       7f37d5cc6000-7f37d5cc7000 r-xp 00000000 ca:01 267321/home/ubuntu/linux-inject/sample-library.so
       7f37d5cc7000-7f37d5ec6000 ---p 00001000 ca:01 267321/home/ubuntu/linux-inject/sample-library.so
       7f37d5ec6000-7f37d5ec7000 r--p 00000000 ca:01 267321/home/ubuntu/linux-inject/sample-library.so
       7f37d5ec7000-7f37d5ec8000 rw-p 00001000 ca:01 267321/home/ubuntu/linux-inject/sample-library.so
       [...]
    • 還可以將 gdb 附加到目標應用程序並運行 info sharedlibrary 以查看進程當前已經載入的共享庫:

       $ gdb -p $(pgrep sample-target)
       [...]
       (gdb) info sharedlibrary
       From To Syms Read Shared Object Library
       0x00007f37d628ded0 0x00007f37d628e9ce Yes/lib/x86_64-linux-gnu/libdl.so.2
       0x00007f37d5ee74a0 0x00007f37d602c583 Yes/lib/x86_64-linux-gnu/libc.so.6
       0x00007f37d6491ae0 0x00007f37d64ac4e0 Yes/lib64/ld-linux-x86-64.so.2
       0x00007f37d5cc6670 0x00007f37d5cc67b9 Yes/home/ubuntu/linux-inject/sample-library.so
       (gdb)

    兼容性

    • x86和x86_64版本在 Ubuntu 14.04.02 x86_64上工作。

    • x86和x86_64版本在 Arch x86_64上工作。

    • ARM版本在armv6和手寫輸入上都起作用。

    • 沒有一個版本能在Debian上工作。 debian的ccr中的__libc_dlopen_mode() 不會以與ubuntu版本相同的方式載入共享庫。 我在x86_64和armv6上測試了。

    todos/已知問題

    • 更好地支持針對多線程/多進程應用的目標

    • 我試圖注入更大的應用程序時,似乎會崩潰

    • 需要進一步調查

    • 支持ARM和Thumb模式

    • 目前只支持ARM模式

    • 應該只是檢查PC的LSB和相應的行為

    • 檢查是否已經將指定的共享對象實際插入到目標進程中

    • 檢查 /proc/[pid]/maps 而不只是查看 __libc_dlopen_mode()的返回值

    • 支持更多發行版

    • 目前僅針對某些架構使用Ubuntu和 Arch

    • 請參見上面的"兼容性"部分

    • 可能支持更多架構?

    • 64位 ARM

    • MIPS



    文章标签:tool  对象  PROC  SHA  分享  入侵  Shared  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语