A. 軟體如何脫殼
步驟1檢測殼
殼的概念:
所謂「殼」就是專門壓縮的工具。
這里的壓縮並不是我們平時使用的RAR、ZIP這些工具的壓縮,殼的壓縮指的是針對exe、com、和dll等程序文件進行壓縮,在程序中加入一段如同保護層的代碼,使原程序文件代碼失去本來面目,從而保護程序不被非法修改和反編譯,這段如同保護層的代碼,與自然界動植物的殼在功能上有很多相似的地方,所以我們就形象地稱之為程序的殼。
殼的作用:
1.保護程序不被非法修改和反編譯。
2.對程序專門進行壓縮,以減小文件大小,方便傳播和儲存。
殼和壓縮軟體的壓縮的區別是
壓縮軟體只能夠壓縮程序
而經過殼壓縮後的exe、com和dll等程序文件可以跟正常的程序一樣運行
下面來介紹一個檢測殼的軟體
PEIDv0.92
這個軟體可以檢測出450種殼
新版中增加病毒掃描功能,是目前各類查殼工具中,性能最強的。
另外還可識別出EXE文件是用什麼語言編寫的VC、Delphi、VB或Delphi等。
支持文件夾批量掃描
我們用PEID對easymail.exe進行掃描
找到殼的類型了
UPX0.89.6-1.02/1.05-1.24->Markus&Laszlo
說明是UPX的殼
下面進行
步驟2脫殼
對一個加了殼的程序,去除其中無關的干擾信息和保護限制,把他的殼脫去,解除偽裝,還原軟體本來的面目。這個過程就叫做脫殼。
脫殼成功的標志
脫殼後的文件正常運行,功能沒有損耗。
還有一般脫殼後的文件長度都會大於原文件的長度。
即使同一個文件,採用不同的脫殼軟體進行脫殼,由於脫殼軟體的機理不通,脫出來的文件大小也不盡相同。
關於脫殼有手動脫殼和自動脫殼
自動脫殼就是用專門的脫殼機脫很簡單按幾下就OK了
手動脫殼相對自動脫殼需要的技術含量微高這里不多說了
UPX是一種很老而且強大的殼不過它的脫殼機隨處就能找到
UPX本身程序就可以通過
UPX文件名-d
來解壓縮不過這些需要的命令符中輸入
優點方便快捷缺點DOS界面
為了讓大家省去麻煩的操作就產生了一種叫UPXSHELL的外殼軟體
UPXSHELLv3.09
UPX外殼程序!
目的讓UPX的脫殼加殼傻瓜化
註:如果程序沒有加殼那麼我們就可以省去第二步的脫殼了,直接對軟體進行分析了。
脫完後我們進行
步驟3
運行程序
嘗試注冊
獲取注冊相關信息
通過嘗試注冊我們發現一個關鍵的字元串
「序列號輸入錯誤」
步驟4
反匯編
反匯編一般用到的軟體都是W32Dasm
W32dasm對於新手易於上手操作簡單
W32Dasm有很多版本這里我推薦使用W32Dasm無極版
我們現在反匯編WebEasyMail的程序文件easymail.exe
然後看看能不能找到剛才的字元串
步驟5
通過eXeScope這個軟體來查看未能在w32dasm中正確顯示的字元串信息
eXeScopev6.50
更改字體,更改菜單,更改對話框的排列,重寫可執行文件的資源,包括(EXE,DLL,OCX)等。是方便強大的漢化工具,可以直接修改用VC及DELPHI編制的程序的資源,包括菜單、對話框、字元串表等
新版可以直接查看加殼文件的資源
我們打開eXeScope
找到如下字串符
122,"序列號輸入錯誤"
123,"恭喜您成為WebEasyMail正式用戶中的一員!"
124,注冊成功
125,失敗
重點是122
步驟6
再次返回w32dasm
*=00122:"?_e?"
但是雙擊後
提示說找不到這個字串符
不是沒有是因為"?_e?"是亂碼w32dasm對於中文顯示不是太好
畢竟不是國產軟體
先把今天會用到的匯編基本指令跟大家解釋一下
mova,b;把b的值賦給a,使a=b
call:調用子程序,子程序以ret結為
ret:返回主程序
je或jz:若相等則跳轉
jne或jnz:若不相等則跳轉
pushxx:xx壓棧
popxx:xx出棧
棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
我們搜索
=00122
因為對E文支持很好
我們來到了
*Referencedbya(U)or(C)onditionalJumpatAddress:
|:00406F17(C)//跳轉來自406F17
|
*=00125:"1%"
|
004070DD6A7Dpush0000007D
004070DF8D4C2410leaecx,dwordptr[esp10]
*=00122:"?_e?"
|
004070E86A7Apush0000007A
004070EA8D4C2408leaecx,dwordptr[esp08]
我們來到
00406F01moveax,dwordptr[edi0000086C]這里是對
00406F078B4C2408movecx,dwordptr[esp08]
00406F0B50pusheax//這兩個eax和ecx入棧就比較讓我們懷疑了
00406F0C51pushecx//產生注冊碼
//這CALL里對注冊位應該會有設置
00406F1283C40Caddesp,0000000C
00406F1585C0testeax,eax//檢測注冊位
00406F17jne004070DD//不存在注冊位就會跳到4070DD就會出現那個錯誤的字串符了
我們記住406F01這個地址
接著進行下一步
步驟7
這一步我們進行的是調試
用到的軟體是ollydbg
好了我們找到了注冊碼0012AF0400FD4A10ASCII""
但是這個並不是我們的主要目的
我們還要做出屬於自己的注冊機
相信這個是很多人夢寐以求的事情
步驟8
製作注冊機
注冊機我們需要的是一個KEYMAKE的軟體
因為2.0是演示版而且停止更新了
所以我們用1.73版
做一個內存注冊機需要下面幾個資料
中斷地址:406F0C
中斷次數:1
第一位元組:51
指令長度:1
好了一個完美的注冊機就產生了
還不趕快發給你的朋友炫耀一下
保證讓他迷糊死佩服得你要死
其實最後還有幾個步驟
就是撰寫破文
不過大家都是新手這個步驟就去了吧
不知不覺說了這么多廢話希望能對大家有些作用
B. 匯編語言怎麼產生隨機數
NASM匯編:
section .text
global_start;gcc必須的聲明
rand:;生成隨機數,返回值在eax
pushedx
rdtsc;內核納秒級時間作為種子
imuleax,edx
addeax,0xF1E2D3C4
imuleax,0xB5A69788
popedx
ret
_start:;程序入口
nop
callrand;生成隨機數
movesi,msg
movecx,len
callbinasc;轉換成ascii
mov edx,ecx;顯示
mov ecx,esi
mov ebx,1
mov eax,4
int 0x80
moveax,1;退出
xorebx,ebx
int80h
;將數字轉換成ascii
binasc:
push edx
push ebx
push edi
push eax
mov edi,esi
ba1:
mov byte[esi],''
inc esi
loop ba1
mov ebx,10
or eax,eax
jns ba2
neg eax
ba2:
xor edx,edx
div ebx
add dl,'0'
dec esi
mov [esi],dl
inc ecx
cmp esi,edi
jz ba4
or eax,eax
jnz ba2
pop eax
or eax,eax
jns ba3
dec esi
mov byte[esi],'-'
inc ecx
ba3:
pop edi
pop ebx
pop edx
ret
ba4:
pop eax
jmp ba3
section .data
msg db '',0xa
len equ $-msg
多次運行結果: