日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OLLYDBG知识

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OLLYDBG知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.MUL DWORD PTR DS:[405000]解釋

  • MUL:MUL(無符號數的乘法)
    有兩種乘法,第一個種是MUL,這種是無符號數乘法,只有一個操作數,另一個操作數是EAX,結果存放到EDX:EAX中。
    ---- EDX:EAX是指結果存放在EDX:EAX中,如果需要得到結果,則由EDX連接到EAX而得。比如:計算后:結果是:1FFFFFFFA,由于EAX只能存放FFFFFFFA,那個1則存放在EDX中(00000001)。

  • dword 雙字 就是四個字節
    ptr pointer縮寫 即指針

  • []里的數據是一個偏移地址值,這個偏移地址與DS組合指向一個雙字型數據
    如果不加[]就會報錯

  • DS:CS:代碼段寄存bai器;DS:數據段寄存器;SS:堆棧段du寄存器。段寄存器DS指向數據段,ES指向附加段,在存取操作數時,二者之一和一個偏移量合并就可得到存儲單元的物理地址。該偏移量可以是具體數值、符號地址和指針寄存器的值等之一,具體情況將由指令的尋址方式來決定。

  • ds:[]ds是段前綴 例如:ds:[bx]
    偏移地址在bx中,段地址在ds中。

  • 轉換時,先將16位的段地址左移4位,相當于乘以16或者16進制的10H,再和偏移地址相加。–from - https://blog.csdn.net/thisispan/article/details/7685040
    轉換公式為:
    物理地址 = 段地址*10H + 偏移地址(H(hexadecimal):16進制)

  • 2.循環

    —from 看雪學院翻譯的ollydbg

  • LOOP指令可以幫我們完成前面例子中的事情- 將計數器ECX的值減1,判斷ECX的值是否為0,如果為0就跳轉到指定的地址-將像前面的例子一樣。(可惜的是,大多數現代的處理器中該指令的效率不如前面模擬的例子。)
  • LOOPZ, LOOPE 重復循環,直到零標志位Z置1
    LOOPNZ, LOOPNE 重復循環,直到零標志位Z清0
    這幾條指令同樣是循環指令,即重復循環體,直到計數器為0,每次循環將計數器的值遞減1。此外,LOOPZ,LOOPNZ指令還將檢查零標志位Z是否為0。只有計數器的值和零標志Z同時滿足條件時才循環。
  • 使用REPE前綴指令,當ECX為0 或者(注意是或者)零標志位Z清0時將停止比較。
  • 3 . 尋址方式

    看雪學院翻譯的ollydbg

  • 直接尋址
    這是最簡單的一種尋址方式-該指令的操作數中包含一個具體的地址。
    例如:
    MOV DWORD PTR [00513450], ECX
    MOV AX, WORD PTR [00510A25]
    MOV AL, BYTE PTR [00402811]
    CALL 452200
    JMP 421000
    不需要進行任何有關地址解析的計算,地址的值是純數字。

  • 間接尋址
    MOV DWORD PTR[EAX], ECX
    CALL EAX
    JMP [EBX + 4]
    要想在指令執行之前看到真實地址,需要在該指令上下斷點,斷下來以后查看寄存器的值或者查看解釋窗口中的提示信息。
    許多程序使用間接尋址來完成一些復雜的操作,因此剛開始分析調試的時候真實地址并不會顯示出來。直到我們執行到這條指令的時候,查看相應寄存器的值才能夠直到真實的地址。
    現在我們再次用OD加載Cruehead’a的CrackMe。
    這里我們來看一看間接尋址的例子:PUSH [EBP + 8]
    因為當前我們處于入口點,在執行PUSH [EBP + 8]指令之前我們并不能預先直到EBP寄存器的值,我們在該指令處(4010E9)按下F2鍵,設置一個斷點。
    然后按F9鍵(運行)-CrackMe運行一會兒就會斷在我們設置的斷點處。
    解釋窗口中提示EBP+8=12FFF8。在我的機器上面此時EBP為12FFF0,所以EBP+8=12FFF8。
    現在讓我們在數據窗口中看看EBP+8指向內存單元的值,在數據窗口中單擊鼠標右鍵選擇-Go to-Expression,輸入EBP+8
    使用間接尋址的指令,只能在執行這條指令的時候獲取地址當前的值。

  • 4 . 快捷鍵

  • f2設置斷點(或者雙擊指令16進制那一欄對應的位置)
  • . f9運行到斷點處
  • 在匯編代碼處按空格鍵或者雙擊可以進行編輯。
  • 5 .XOR EAX,ECX會把結果存到第一個操作數中,CMP不會。

    6 .反調試

  • IsDebuggerPresent表示在被調試器調試情況下,調用該函數會返回正在被調試。并且該函數是被Kernel32.dll導出的,該函數沒有參數,如果當前程序正在被調試的話,返回值為1,沒有被調試的話,返回值為0。
  • 調試狀態中BeingDebugged字段會被置為1,也就是大小為雙字起始地址為TEB(TEB或者TIB(線程環境塊))起始地址+30處的值作為地址再加2就是BeingDebugged字段,而IsDebuggerPresent正是返回此處的信息。
  • 總結

    以上是生活随笔為你收集整理的OLLYDBG知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。