日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
破解入門:如何編寫一個(gè)Linux64位軟件注冊(cè)機(jī)

本文僅供安全學(xué)習(xí)與教學(xué)用途,禁止任何非法利用

創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元圖們做網(wǎng)站,已為上家服務(wù),為圖們各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

相信大家對(duì)注冊(cè)機(jī)這詞一定不陌生,由于一些軟件涉及版權(quán)問題,要完全使用的話需要注冊(cè),或者有試用期限限制,或者只有注冊(cè)之后才可以享受全功能。目前大部分有關(guān)于破解的資料都是基于X86架構(gòu)的,而對(duì)于X64架構(gòu)的破解資料卻是比較少。

在本文中,我將向大家展示如何在Liunx機(jī)器上編寫一個(gè)Linux 64位應(yīng)用的注冊(cè)機(jī)。

準(zhǔn)備工作

我們將會(huì)使用到以下工具

1: Linux 機(jī)器 ( 64bit mint box) 2: EDB debugger 3: IDA 反匯編工具 4: 編譯器 5: 本文相關(guān)的文件(鏈接:http://pan.baidu.com/s/1hqti6LA 密碼:djnt)

運(yùn)行file命令檢測(cè)該文件類型

file r5

下面為返回?cái)?shù)據(jù)

r5: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24,  BuildID[sha1]=86bf854ce620288567d153883d4609163485d34d, not stripped

從返回?cái)?shù)據(jù)中我們得知了構(gòu)建版本,以及得知它是一個(gè)動(dòng)態(tài)鏈接文件

~/Desktop $ nm r5 0000000000601109 B __bss_start 00000000006010e0 D buf 000000000040069d T check_password 0000000000601109 b completed.6972 0000000000601060 D __data_start 0000000000601060 W data_start 00000000006010a0 D delta 00000000004005e0 t deregister_tm_clones 0000000000400650 t __do_global_dtors_aux 0000000000600e18 t __do_global_dtors_aux_fini_array_entry 0000000000601068 D __dso_handle 0000000000600e28 d _DYNAMIC 0000000000601109 D _edata 0000000000601110 B _end 0000000000400894 T _fini 0000000000400670 t frame_dummy 0000000000600e10 t __frame_dummy_init_array_entry 0000000000400a80 r __FRAME_END__ 0000000000601000 d _GLOBAL_OFFSET_TABLE_ w __gmon_start__ 0000000000400500 T _init 0000000000600e18 t __init_array_end 0000000000600e10 t __init_array_start 00000000004008a0 R _IO_stdin_used w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable 0000000000600e20 d __JCR_END__ 0000000000600e20 d __JCR_LIST__ w _Jv_RegisterClasses 0000000000400890 T __libc_csu_fini 0000000000400820 T __libc_csu_init U __libc_start_main@@GLIBC_2.2.5 00000000004007b6 T main 0000000000601080 D master U printf@@GLIBC_2.2.5 U puts@@GLIBC_2.2.5 U random@@GLIBC_2.2.5 0000000000400610 t register_tm_clones 00000000004005b0 T _start U strcmp@@GLIBC_2.2.5 U strcpy@@GLIBC_2.2.5 U strlen@@GLIBC_2.2.5 0000000000601110 D __TMC_END__

#p#

64位程序集基礎(chǔ)

相對(duì)于X86架構(gòu),X64架構(gòu)增加了擴(kuò)展寄存器設(shè)置和一些額外的指令。

以下為X64增加的寄存器列表

r8, r9 , r10, r11, r12, r13, r14, r15

可以通過r8d訪問r8寄存器中的低32位,通過r8w訪問r8寄存器中的低16位,通過rb8訪問r8寄存器中的低8位。

這樣更多的RIP(指令指針)就可以直接進(jìn)行訪問了。

X64架構(gòu)中所有的寄存器都是64位的,RIP同樣也是64位,但是目前的實(shí)現(xiàn)方法僅是支持48位線性地址(線性地址:邏輯地址到物理地址變換之間的中間層)

除了普通的寄存器它還增加了SSE寄存器,命名為xmm8~xmm15。

如果在EAX寄存器上進(jìn)行數(shù)據(jù)移動(dòng)操作,他將從0一直連續(xù)到RAX寄存器的高32位。

為了達(dá)到調(diào)試程序的目的,我們將使用EDB debugger,這個(gè)調(diào)試程序類似于Windows平臺(tái)下的ollydbg,上手十分容易,下面就是默認(rèn)的EDB窗口。

在X64架構(gòu)下參數(shù)傳遞與X86架構(gòu)完全不同。

RDI, RSI, RDX, RCX, r8以及r9等都是通過堆棧進(jìn)行參數(shù)傳遞。

菜單欄和ollydbg一樣簡(jiǎn)潔

#p#

破解開始

運(yùn)行我們的r5文件,返回輸出如下

~/Desktop $ ./r5
Usage: ./r5 password

明文信息畢竟不太好,但是他給了我們一個(gè)需要密碼的提示。我們必須弄清楚在反匯編程序中打開它會(huì)發(fā)生什么?顯然它在尋找并傳送一個(gè)參數(shù)到函數(shù)中。

你可以清楚看到argv[1]作為參數(shù)傳遞給check_password()函數(shù)。

首先是有關(guān)于輸入字符串的長(zhǎng)度,字符串長(zhǎng)度要與“this_is_not_even_interesting_its_garbage”這個(gè)字符串的長(zhǎng)度相等。

.data:00000000006010E0 ; char buf[] .data:00000000006010E0 buf             db 'this_is_not_even_interesting_its_garbage',0 .data:00000000006010E0                                         ; DATA XREF: check_password+1C#o .data:00000000006010E0                                         ; check_password+3C#o ... .data:00000000006010E0 _data           ends .data:00000000006010E0 .bss:0000000000601109 ; ===========================================================================

檢測(cè)這里

call _strlen ; Call Procedure mov rbx, rax mov edi, offset buf ; “this_is_not_even_interesting_its_garbag”… call _strlen ; Call Procedure cmp rbx, rax ; Compare Two Operands jz short Go ; Jump if Zero (ZF=1)

在這之后,字符串中的數(shù)據(jù)就會(huì)被我們輸入的字符串?dāng)?shù)據(jù)替換

mov     rax, [rbp+passcode] mov     rsi, rax        ; src mov     edi, offset buf ; "this_is_not_even_interesting_its_garbag"... call    _strcpy         ; Call Procedure mov     [rbp+VarCheck], 1 jmp     loc_400791      ; Jump

經(jīng)過這個(gè)操作之后,程序會(huì)進(jìn)入一個(gè)循環(huán)。如果指標(biāo)指數(shù)delta值為0那么就會(huì)跳過這個(gè)循環(huán)體。

movzx eax, delta[rax] ;

如果不是,將利用delta的值和其他參數(shù)在輸入字符串中執(zhí)行一些數(shù)學(xué)運(yùn)算。

用C語言來表示

 
 
 
 
  1. x = (random() % delta[index] ) + 1;  
  2. delta[index] = delta[index] - x;  
  3. var_check = var_check ^ (unsigned int )delta[index] ; 

random() 并沒有調(diào)用srand()進(jìn)行初始化,所以我們可以輕松的進(jìn)行猜測(cè)。

***,經(jīng)過40輪的循環(huán),變化的字符串如果與“this_aint_that_simple_but_good_luck_haha”相等,那么將顯示“password OK”

我們可以使用以下C語言代碼進(jìn)行計(jì)算字符串

 
 
 
 
  1. #include   
  2.    
  3.  unsigned char delta[] =  
  4. {  
  5.     3, 253,   3, 249,   0,   3,   6,   0, 241,   0,  
  6.   250,   7,  22, 235,   8, 252, 246,   2, 254, 243,  
  7.     4,  19,   1, 234, 237,  15, 253, 240, 242,  15,  
  8.    12, 243, 241,  12,   7,   0,   5,  14,  10,   4,  
  9. };  
  10.    
  11. unsigned char buff [48] ;  
  12. int main(int argc, char **argv)  
  13. {  
  14.     int index = 0;  
  15.     int var_check = 1;  
  16.     unsigned char x = '\x00';  
  17.    
  18.     strcpy(buff, "this_aint_that_simple_but_good_luck_haha");  
  19.    
  20.     while ( var_check )  
  21.     {  
  22.    
  23.         index = 0;  
  24.         var_check = 0;  
  25.         while ( index < 40)  
  26.         {  
  27.    
  28.             if (delta[index])  
  29.             {  
  30.                 x = (random() % delta[index] ) + 1;  
  31.                 delta[index] = delta[index] - x;  
  32.                 var_check = var_check ^ (unsigned int )delta[index] ;  
  33.    
  34.                 buff[index] = buff[index] + x;  
  35.    
  36.             }  
  37.    
  38.             // if zero  
  39.             index++;  
  40.         }  
  41.     }  
  42.    
  43.     printf("%s\n", buff);  

編譯并運(yùn)行這個(gè)程序,我們獲得以下輸出

 
 
 
 
  1. “well_done_now_go_on_irc_and_ask_for_more”  
  2. ~/Desktop $ ./r5 “well_done_now_go_on_irc_and_ask_for_more” 

密碼成功破解。


分享標(biāo)題:破解入門:如何編寫一個(gè)Linux64位軟件注冊(cè)機(jī)
分享地址:http://m.5511xx.com/article/dhsehos.html