機器碼call和jmp地址的計算

来源:http://www.cnblogs.com/leo0000/archive/2016/07/01/5632247.html
-Advertisement-
Play Games

call和jmp都是跳轉指令,但是call的同時會把pc地址壓入堆棧,並且這兩種方式都有遠和近跳轉。下麵的分析不全,因為沒有在網上找到足夠的資料,個人創造這個情景還是有些困難。 1.例子中的call的機器碼為0xe8。 0x400204ba <+30>: e8 41 b6 05 00 call 0x ...


call和jmp都是跳轉指令,但是call的同時會把pc地址壓入堆棧,並且這兩種方式都有遠和近跳轉。下麵的分析不全,因為沒有在網上找到足夠的資料,個人創造這個情景還是有些困難。

1.例子中的call的機器碼為0xe8。

  0x400204ba <+30>:     e8 41 b6 05 00 call   0x4007bb00 <__printf>

  0x400204bf <+35>:     c9     leave  

問題:0x4007bb00是如何計算得來的?

pc = 0x400204bf(取完當前指令之後,pc指向下一條語句)

另一個因為是是在x86機器上,所以是小端,那麼下一個32位操作數就是0005b641,

pc + 操作數 =0x400204bf + 0x0005b641 = 0x4007bb00 

2.jmp有多種跳轉:

2.1.如果是遠跳轉,操作數是一個32位數,機器碼e9

0x40011728 <+392>: e9 46 ff ff ff jmp 0x40011673 <_dl_open+211>
0x4001172d <+397>: 8b bb ec 04 00 00 mov 0x4ec(%ebx),%edi

計算方式和call(e8)一樣,0x4001172d + 0x ffffff46 = 0x40011673 

2.2.如果是短跳轉,操作數8位數,機器碼eb

0x0804850d <+9>: c7 04 24 0a 00 00 00 movl $0xa,(%esp)
0x08048514 <+16>: e8 1f ff ff ff call 0x8048438 <sleep@plt>
0x08048519 <+21>: e8 0a ff ff ff call 0x8048428 <myprint@plt>
0x0804851e <+26>: eb ed jmp 0x804850d <main+9>

解:pc = 0x8048520

  操作數 = 0xed  

  0x8048520 + 0xed - 0x100 = 0x804850d

情況2:0x4013b30d <+93>:     eb ee  jmp    0x4013b2fd <*__GI___libc_dlsym+77>

  pc = 0x4013b30f

  操作數 = 0xee

  0x4013b30f + 0xee = 0x4013b3fd

  0x4013b3fd - 0x100 = 0x4013b2fd 

  操作數-0x100就是操作數的補碼,最高位是符號位,若為1,則代表負數,若為0 代表正數。需要擴展符號位

  0x4013b30f +0xffffffee = 0x4013b2fd 

情況3: 0x4013b2d6 <+38>:     75 2b  jne    0x4013b303 <*__GI___libc_dlsym+83>

  0x4013b2d8 + 2b  = 0x4013b303 

2.3.如果是近跳轉,操作數是16位數

  由於沒有找到合適的例子,個人覺得和短跳轉的計算方式是一樣的

2.4.以上都是相對跳轉,還有一種絕對跳轉,機器碼ff25

0x08048428 <+0>: ff 25 08 a0 04 08 jmp *0x804a008
0x0804842e <+6>: 68 10 00 00 00 push $0x10
0x08048433 <+11>: e9 c0 ff ff ff jmp 0x80483f

跳轉到0x0804a08中保存的地址。還是屬於間接跳轉。

其他的跳轉方式,等遇到了再補。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文為作者原創,轉載請註明原作者及轉載地址。 上一篇講瞭如何用thinkPHP框架實現數據的添加,那這一篇就講一下如何用thinkPHP實現數據的刪除和批量刪除吧。 預期效果圖: 原諒博主對照片的處理是如此的草率吧。。。 仍然是 通過MVC模式進行拆分: 首先是視圖部分: 仍然是採用表單傳值的方法, ...
  • http://www.postgresonline.com/journal/archives/131-Using-Recursive-Common-table-expressions-to-represent-Tree-structures.html Tree Problem and was bas ...
  • 幾個重要概念 Slab memcached通過slab機制進行記憶體的分配和回收,slab是一個記憶體塊,它是memcached一次申請記憶體的最小單位,。在啟動memcached的時候一般會使用參數-m指定其可用記憶體,但是並不是在啟動的那一刻所有的記憶體就全部分配出去了,只有在需要的時候才會去申請,而且每 ...
  • 本文轉自http://www.cnblogs.com/yunf/archive/2011/04/12/2013448.html,在此感謝作者yfProgramer。 對於我這種剛學mysql的,還是十分有用的。 雖然現在mysql已經可以利用workbench直接創建資料庫了,但是開頭的對庫和表的增 ...
  • 好久不寫文,最近得空寫一點。Oracle資料庫國內用戶量主要在企業上,其中有一種byte的存儲稱為Blob,並不能直接看。 有時候為了調試需要,可以通過: 這種sql去轉為字元串查看,但是不方便,一次最多轉出2000個位元組。需要通過index拼成完整的文本。 另外一種情況下,如果存儲的是圖片、wor ...
  • 安裝好MySQL以後,系統給了個預設的的密碼,然後說如果忘記了預設的密碼。。。。。。我複製了預設密碼就走過了只一步,這一步就是我漫長旅程的開始。他給的密碼太複雜了,當然我得換一個,而且我還要假裝我不記得密碼了,就這樣我走上了不歸路。。。。。。 這個過程是心酸的,網上的資料多如狗,關鍵是各有各的錯法, ...
  • 當我談論索引時,大家經常會問我在複合非聚集索引里,列的順序是否重要?簡單來說:“看情況”。我們來具體看下為啥“看情況”…… 單例查找(Singleton Lookups) 當在你的表上有進行單例查找的查詢時,在複合非聚集索引里列的順序真的不重要。假設下列查詢: 現在你可以在StateProvince ...
  • 聲明:以下的代碼成果,是參考了網上的injso技術,文章最後會給出地址。 另外一個,injso文章中的代碼實際上不能夠運行起來的,後面出現的代碼都是經過我個人修改和檢測的。 最近因為在學習一些調試的技術,但是很少有提到如何在函數運行時實現函數替換的。 為什麼會想到這一點?因為在學習調試時,難免會看到 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...