OllyDbg笔记-寄存器以及各种关键指令解析(含简单程序破解)
目錄
?
?
基本概念
代碼與實例
?
基本概念
CPU中的9個寄存器:
EAX:擴展累加寄存器
EBX:擴展基址寄存器
ECX:擴展計數寄存器
EDX:擴展數據寄存器
ESI:擴展來源寄存器
EDI:擴展目標寄存器
EBP:擴展基址指針寄存器
ESP:擴展堆棧指針寄存器
EIP:擴展的指令指針寄存器
?
處理EBP、ESP、EIP,其他寄存器都能隨意使用。
EBP:主要用于棧和棧針;
ESP:指向當前進程的棧空間地址;
EIP:總是指向下一條要被執行的指明;
?
call有以下幾種方式:
call xxxxxxxxxh #直接跳到函數或過程的地址; call xxxx #等同于 push eip;jmp xxx; call eax #函數或過程地址直接存放在eax; call dword ptr [eax] #eax中存的是地址,[]這個是取地址中的值,dword大小 call dword ptr [<&API>] #執行一個系統API下面是關于Windows操作系統相關的知識:
從內到外:
Ring 0:優先級最高,用于操作系統內核;
Ring 1:不使用;
Ring 2:不使用;
Ring 3:最先級最低,用于應用程序;
?
下面是關于在條件判斷跳轉中關鍵:
?
代碼與實例
這里破解:
這里有2個破解方法,一個是暴力破解,把if判斷后的結果修改為正確。
還有一個是破解算法。
下面來演示下,首先是暴力破解:
這里有個關鍵,程序首先是在看有沒有存在Keyfile.dat文件,如果沒有,就直接跳轉了
JNE是當ZF=0的時候跳轉,此時把ZF改為0
往下走看到一個JNZ,現在程序給出的默認是不跳轉,也就是ZF此時為0,在往下看是JMP是無條件跳轉。跳到004010F7的位置,先看看這段004010F7是什么代碼:
發現是給出密鑰不對。此時我們讓其跳轉吧:
此處我們可以看到跳到一個算法里面:
這里我們分析下:這里首先是對比DS:[402173]的值是不是為10.這個目測是,通過JL可以看出小于或不大于時跳轉。所以密鑰估計是10位以上。然后就是讀取東西。讀取了后和ASCII 47也就是G做對比。如果不是G就跳轉,如果是就回去在循環,所以可以知道密鑰估計是>10個G(這個10是16進制的10進制為16)。這里先暴力破解下,
進行修改嘗試后:
最后就來到了這個地方:
填出:
這里創建:Keyfile.dat文件,里面輸入大于10個的G。看看結果:
打開程序:直接成功
總結
以上是生活随笔為你收集整理的OllyDbg笔记-寄存器以及各种关键指令解析(含简单程序破解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot中使用模板引擎引用
- 下一篇: Qt文档阅读笔记-FileDialog