破譯c語言
① 二進制數字密碼的破譯
可以運用ReverseMe來二進制數字密碼的破譯,需要了解以下的內容:
1、寄存器:
寄存器就好比是CPU身上的口袋,方便CPU隨時從里邊拿出需要的東西來使用。常見涉及到的九個寄存器:
EAX:擴展累加寄存器;EBX:擴展基址寄存器;ECX:擴展計數寄存器;
EDX:擴展數據寄存器;ESI:擴展來源寄存器;EDI:擴展目標寄存器;
EBP:擴展基址指針寄存器;ESP:擴展堆棧指針寄存器;EIP:擴展的指令指針寄存器;
這些寄存器的大小是32位(4個位元組),他們可以容納數據從0-FFFFFFFF(無符號數),除了以下三個寄存器,其他我們都可以隨意使用:
EBP:主要是用於棧和棧幀。ESP:指向當前進程的棧空間地址。EIP:總是指向下一條要被執行的指令。
2、棧:棧是在內存中的一部分,它有兩個特殊的性質:
FILO(FisrtInLastOut,先進後出);地址反向增長(棧底為大地址,棧頂為小地址)。
3、CALL指令,call有以下幾種方式:
call404000h;直接跳到函數或過程的地址;calleax;函數或過程地址存放在eax,calldwordptr[eax]。
4、系統API:Windows應用程序運行在Ring3級別,API函數,我們也稱之為系統提供給我們的介面。因為系統只信任自己提供的函數,所以我們要通過API才能實現對內核的操作。
5、mov指令mov指令格式:movdest,src。
這是一個很容易理解的指令,mov指令將src的內容拷貝到dest,mov指令總共有以下幾種擴展:movs/movsb/movsw/movsdedi,
esi:這些變體按串/位元組/字/雙字為單位將esi寄存器指向的數據復制到edi寄存器指向的空間。movsx符號位擴展,byte->word,word->dword(擴展後高位全用符號位填充)。
然後實現mov。movzx零擴展,byte->word,word->dword(擴展後高位全用0填充),然後實現mov。
6、cmp指令,cmp指令格式:cmpdest,src
cmp指令比較dest和src兩個操作數,並通過比較結果設置C/O/Z標志位。
cmp指令大概有以下幾種格式:
cmpeax,ebx;如果相等,Z標志位置1,否則0。cmpeax,[404000];將eax和404000地址處的dword型數據相比較並同上置位cmp[404000],eax;同上。
7、標志位:在破解中起到的作用是至關重要的。
在逆向中,你真正需要關心的標志位只有三個,也就是cmp指令能修改的那三個:Z/O/C。
Z標志位(0標志),這個標志位是最常用的,運算結果為0時候,Z標志位置1,否則置0。
O標志位(溢出標志),在運行過程中,如操作數超出了機器能表示的范圍則稱為溢出,此時OF位置1,否則置0。
C標志位(進位標志),記錄運算時從最高有效位產生的進位值。例如執行加法指令時,最高有效位有進位時置1,否則置0。
掌握這些指令後就可以運用ReverseMe來二進制數字密碼的破譯。
(1)破譯c語言擴展閱讀:
在數學和數字電路中,二進制(binary)數是指用二進制記數系統,即以2為基數的記數系統表示的數字。這一系統中,數通常用兩個不同的符號0(代表零)和1(代表一)來表示。
以2為基數代表系統是二進位制的。數字電子電路中,邏輯門的實現直接應用了二進制,因此現代的計算機和依賴計算機的設備里都用到二進制。每個數字稱為一個比特(二進制位)。
把二進制化為八進制也很容易,因為八進制以8為基數,8是2的冪(8=2),因此八進制的一位恰好需要三個二進制位來表示。八進制與二進制數之間的對應就是上面表格中十六進制的前八個數。二進制數000就是八進制數0,二進制數111就是八進制數7,以此類推。
② C語言編程題目:破譯密碼
編好了,下載地址:
http://www.163disk.com/fileview_148907.html
顯示界面如下:
③ ACM中的C語言題目:密碼替換
「這道題目。。。首先我看不懂他要我干什麼希望明白人給我講講。然後希望能給出程序甚至只是思路」
回答:他要你破譯密碼啊,這個是典型的移位加密
加密方法是:密文字母=(明文字母+密鑰)%26
當然,密文字母和明文字母都是數字表示的。
我們可以假設:a對應數字1,b對應數字2,依次類推
相應我們有解密方法:明文字母=(密文字母-密鑰)%26
這樣的話,根據題意只要我們需要嘗試每一個密鑰,才能破解密文
顯然密鑰只有0到25這26種可能。
根據題意,用蠻力法嘗試這26種可能,並且正確的密鑰會得到一句「the quick brown fox jumps over the lazy dog?」的明文。
所以思路可以是:
對密文嘗試用密鑰去破解,得到相應的明文,如果明文中有句子「the quick brown fox jumps over the lazy dog?」則相應的密鑰就是真實的密鑰,否則嘗試下一個密鑰。
「這個題目限定的內存只有1MB,時間1s,所以注意演算法的高效性,謝謝各位高手」
關於效率,你不需要擔心,題目的密鑰只要26種可能,用蠻力法破解也不用擔心超時的問題。