【新手教程一】小Z以UPX爲例,講解什麼是殼,什麼是壓縮殼?php
UPX (the Ultimate Packer for eXecutables) 殼你們都不陌生,基本上是咱們學習破解時候學習的第一個殼。
咱們來到吾愛破解,咱們是來學習破解的,爲何讓咱們非要學習脫殼呢?
雖然暫時不懂爲何要脫殼,咱們能夠先看看爲何要加殼?畢竟先有加殼纔有脫殼的嘛(是先有雞呢?仍是先有蛋呢?)
一. 我寫的這個程序太多,想把它壓縮變小。那我就加壓縮殼。
<ignore_js_op>
二. 我這是是一個商業的程序,是用來賺錢的,怎麼能夠被別人破解呢,那我就是加密保護殼
<ignore_js_op>
三. 其餘(病毒加殼,Anti-AntiVirus)
<ignore_js_op>
html
今天就以壓縮殼爲例,講講UPX壓縮殼的工做原理,等我學到了加密保護殼再去寫這方面的帖子好了。
UPX (the Ultimate Packer for eXecutables)是一款先進的可執行程序文件壓縮器,壓縮過的可執行文件體積縮小50%-70% ,這樣減小了磁盤佔用空間、網絡上傳下載的時間和其它分佈以及存儲費用。 經過 UPX 壓縮過的程序和程序庫徹底沒有功能損失和壓縮以前同樣可正常地運行,對於支持的大多數格式沒有運行時間或內存的不利後果。 UPX 支持許多不一樣的可執行文件格式 包含 Windows 95/98/ME/NT/2000/XP/CE 程序和動態連接庫、DOS 程序、 Linux 可執行文件和核心。-百度百科
加殼:實際上是利用特殊的算法,對 EXE、DLL文件裏的資源進行壓縮。相似WINZIP 的效果,只不過這個壓縮以後的文件,能夠獨立運行,解壓過程徹底隱蔽,都在內存中完成。解壓原理,是加殼工具在文件頭裏加了一段指令,告訴CPU,怎麼才能解壓本身。當加殼時,其實就是給可執行的文件加上個外衣。用戶執行的只是這個外殼程序。當執行這個程序的時候這個殼就會把原來的程序在內存中解開,解開後,之後的就交給真正的程序。-百度百科
----看完這2個關於百度百科的介紹,你彷佛明白了點什麼,可是仍是很模糊。
壓縮殼究竟是什麼?
----UPX加殼程序的做用就是壓縮程序代碼,實現把可執行文件的體積縮小50%~70%,
那壓縮的原理是什麼呢?
壓縮就好像把 可執行文件中的 123456 用字母%A代替,789ABC用字母%C代替,這樣程序代碼的體積不久變小了不少。(要是能夠這樣壓縮,這不都只有三分之一了,好機智)。看過《硅谷》這部美劇的同窗,如今應該懂了吧,壓縮算法很賺錢。
UPX殼既然壓縮了,那爲何還能夠正常的運行呢?
upx的工做原理實際上是這樣的:首先將程序壓縮。
所謂的壓縮包括兩方面:
一方面在程序的開頭或者其餘合適的地方 插入一段代碼。
另外一方面是將程序的其餘地方作壓縮(也就是上面講到的壓縮)。壓縮也能夠叫作加密,由於壓縮後的程序比較難看懂,原來的代碼有很大的不一樣。
當程序執行時:實時的對程序解壓縮。解壓縮功能是在第一步時插入的代碼完成的功能。
聯起來就是:upx能夠完成代碼的壓縮和實時解壓執行。且不會影響程序的執行效率。
實時解壓的原理可使用一下圖形表示:
<ignore_js_op>
程序從1開始執行,而1的功能是將2,3,4解壓縮爲7,8,9。7,8,9就是2,3,4在壓縮以前的形式。
<ignore_js_op>
最初代碼的形式就應該是:
<ignore_js_op>
用upx壓縮以後形式爲:
<ignore_js_op>
執行時的形式變爲:
<ignore_js_op>
看完這些,你如今懂了爲何咱們用F8單步法的時候,一直要向下,遇到向上的調整要F4執行到下一條? 其實就是想運行完1.UPX插入的代碼,同時讓UPX插入的代碼去解壓獲得正在的7,8,9未壓縮的代碼。 本次的講解到這裏就完了,像小生大大說的那樣,你能在吾愛寫上一篇學習心得可能就能挽救一個準備放棄的人,技術是共進的,就是說在之後的技術生涯想依靠一己之力,是頗有限的。 我是一名破解新手,可是底層方面和編程能力方面還不錯,但願今天寫的帖子能夠幫助到你們,特別是初學者。第一次分享技術貼,但願你們多多支持。@Hmily @小生我怕怕
算法
附件資源: 脫殼先後的代碼比較(小生我怕怕教程第二課補充):連接:http://pan.baidu.com/s/1i3rjak9 密碼:dz9p
【新手教程二】小Z帶你瞭解一個程序是怎麼運行起來的?編程
此次教程,講解一個程序是怎麼運行起來的?
看完本篇,你能夠明白你打開OD到底看的的是什麼?
一.我仍是上次的那個UPX程序
二.我被打開的必經之路
三.開始我被放在了硬盤裏面(不知道大家刪除了我沒有,自從做爲了第一次做業)
四.被你點擊以後,我被加載到了內存之中。(就要被各類處理了,好怕怕)
五.當我被加載到了內存中,(什麼都被大家看到了 T_T)
我其實通常能夠給你看個人三個位置,好害羞
這是個人第一個部分
這是個人第二個部分
這是個人第三個部分
六.CPU要開始動手了,啊
寄存器的簡單說明:http://www.52pojie.cn/thread-388794-1-1.html
第二篇的課程到這裏就結束了,對課程內容有什麼好的建議,必定要回帖告訴我呀。
下一次課的內容,可能會將代碼是怎麼一步一步的運行的,以及OD上一系列的問題,堆棧平衡等等。
個人目標:是經過對問題的本質的理解,學習咱們操做的原理。
若是你有什麼瞭解的問題,也能夠回帖告訴我,我會優先構思,加入到課程中。
也不知道此次的課程你們會不會喜歡。 @小生我怕怕 大大 @Hmily 大大 大家怎麼看?網絡
[彙編] 彙編寄存器筆記 框架
EAX : 是"累加器"(accumulator), 它是不少加法乘法指令的缺省寄存器。
ECX : 是計數器(counter), 是重複(REP)前綴指令和LOOP指令的內定計數器。
EDX : 則老是被用來放整數除法產生的餘數。
EBX : 是"基地址"(base)寄存器, 在內存尋址時存放基地址。
ESP : 專門用做堆棧指針,被形象地稱爲棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就愈來愈小。在32位平臺上,ESP每次減小4字節。
EBP : 是"基址指針"(BASE POINTER), 它最常常被用做高級語言函數調用的"框架指針"(frame pointer). 在破解的時候,常常能夠看見一個標準的函數起始代碼
函數
1
2
3
|
push
ebp
;保存當前ebp
mov
ebp
,
esp
;EBP設爲當前堆棧指針
sub
esp
, xxx
;預留xxx字節給函數臨時變量.
|
ESI/EDI:分別叫作"源/目標索引寄存器"(source/destination index),由於在不少字符串操做指令中, DS:ESI指向源串,而ES:EDI指向目標串.
EIP: 寄存器存放下一個CPU指令存放的內存地址,當CPU執行完當前的指令後,從EIP寄存器中讀取下一條指令的內存地址,而後繼續執行。
工具
ES:附加段寄存器
CS:代碼段寄存器
SS:堆棧段寄存器
DS:數據段寄存器
FS:標誌段寄存器
GS:全局寄存器學習
EFLAGS
C:進位標誌 最高有效位產生的進位值,例如 執行加法指令時,MSB有進,置CF=1;不然CF=0
P:奇偶標誌 當操做數中有偶數個1時,置PF=1,不然PF=0
A:輔助進位標誌 運算過程當中第三位有進位,置AF=1,不然AF=0
Z: 零標誌 結果=0,ZF=1,結果≠0,ZF=0
S:符號標誌 設置成運算操做結果的符號狀態。當結果爲負時,SF=1,不然SF=0
T:跟蹤標誌 TF=1,機器進入單步工做方式,每條機器指令執行後,顯示結果及寄存器狀態,若TF=0,則機器處在連續工做方式。此標誌爲調試機器或調試程序發現故障而設置
D:放向標誌 用於字符串操做指令程序設計 置0,則串操做控制處理方向,從帶有最低地址的第一個元素逐個處理,不然,從高向低
I:中斷容許標誌 IF=1,CPU容許中斷,IF=0,則CPU關閉中斷ui
【新手教程三】小Z帶你學習什麼是ESP定律和什麼是堆棧平衡 ?
此次教程,講解ESP,我在作課件的時間,驚奇的發現! 我好像發掘出了一直變形的ESP定律的用法。
一.什麼是ESP
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
二. 例說ESP與OD的對比
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
三. 正式開講ESP定律
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
四. ESP定律的運行栗子
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
五. 堆棧平衡講解
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
六.ESP定律的變形用法
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
ESP定律變形用法的視頻講解:連接: http://pan.baidu.com/s/1bnobajH 密碼:6xtp
感謝你們對前2篇教學貼的支持,大家的支持是我最大的動力。
文中有什麼不對的地方,喜歡你們能夠指出來。
這篇寫完,後面的更新會慢一些了,必定要保證質量。
我有想出視頻教學的想法,不知道有沒有人支持~
【新手教程四】小Z帶你學習什麼是兩次內存鏡像法和什麼是內存斷點 ?
前幾天看到,有朋友在問兩次內存鏡像法的原理,爲何有時候是三次內存訪問斷點。
搜索了各個破解論壇,經過本身的理解寫了這篇新手教程。
<ignore_js_op>
一.內存斷點是什麼?
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
二.兩次內存鏡像法是什麼一個原理?
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
若是圖文很差,回帖提出。若是要求的人多,會補上部分的視頻講解。
感謝你們對前3篇教學貼的支持,大家的支持是我最大的動力。
文中有什麼不對的地方,喜歡你們能夠指出來。有什麼建議,請回帖提出。後面的更新會比較慢,由於後面的知識須要充電好久,本身才能理解。大大們,幫我看看有哪些不對的地方: