原創(chuàng)|其它|編輯:郝浩|2012-11-06 16:47:33.000|閱讀 6393 次
概述:為了保護(hù)自己的軟件不輕易被他人“借鑒”,有必要對(duì)軟件進(jìn)行一些加密保護(hù),而這方面目前己有成熟的專業(yè)加密軟件可選擇。但不要太依賴殼的保護(hù),大多數(shù)殼是可以被攻破的,還是在自身保護(hù)上下些功夫。加密軟件比較多,VMProtect v2.12就是其中的佼佼者。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
代碼保護(hù)利器VMProtect在線訂購(gòu)315特惠,個(gè)人授權(quán)專享折扣立即購(gòu)買>>
所謂的VMProtect的SDK使用就是在編程時(shí)在語(yǔ)句里面插入一個(gè)標(biāo)記(Marker),然后在加殼時(shí),加殼程序就會(huì)認(rèn)出這些標(biāo)記,并在有標(biāo)記的地方進(jìn)行保護(hù)。接下來(lái)就向大家介紹最基本的加殼程序SDK編程。
對(duì)于新版VMProtect,VMPsoft公司已經(jīng)發(fā)布了新的版本VMProtect v2.12下面是試用版的下載鏈接:VMProtect v2.12,
編譯環(huán)境 VS。
Delphi需要設(shè)置Map文件,那VS也需要設(shè)置一下,以便產(chǎn)生Map文件,使VMProtect能夠識(shí)別內(nèi)部函數(shù),如果沒Map文件,VMProtect只能識(shí)別導(dǎo)出函數(shù),到時(shí)就要自己加函數(shù)的地址了. VS中,打開 "項(xiàng)目 -> project1屬性(假設(shè)項(xiàng)目名為project1) -> 鏈接器 -> 調(diào)試 -> 生成映射文件", 改成 "是(/MAP)",這樣生成程序時(shí)會(huì)同時(shí)生成project1.map文件。 將project1.exe與project1.map 都拷貝到VMProtect程序夾,用VMProtect加密時(shí),添加新的函數(shù)時(shí)能夠列出很多內(nèi)部函數(shù),這時(shí)只需要選擇想加密的內(nèi)部函數(shù)就行了。 如果沒Map,只有個(gè)輸入函數(shù)地址的輸入筐,沒有內(nèi)部函數(shù)列表。
在Delphi 中的標(biāo)記模式代碼為:
asm db $EB,$10,'VMProtect begin',0 //標(biāo)記開始處. end; //想保護(hù)的程序代碼 asm db $EB,$0E,'VMProtect end',0 //標(biāo)記結(jié)束處. end;
在Delphi中可以直接用這種類似MASM的匯編語(yǔ)言,比較方便,但是在VC中不支持 db 語(yǔ)句,只支持插入單個(gè)字節(jié)的 _emit 語(yǔ)句。 我琢磨出了一個(gè)比較麻煩的方法,就是全部插入16進(jìn)制字節(jié)碼,不曉得還有更好的方法沒。此方法學(xué)自ASProtect的sdk例子里面的aspr.h。
在VC中的標(biāo)記模式為:
__asm //標(biāo)記開始處. { _emit 0xEB _emit 0x10 //jmp 0x10 _emit 0x56 //ascii "VMProtect begin",0 _emit 0x4D _emit 0x50 _emit 0x72 _emit 0x6F _emit 0x74 _emit 0x65 _emit 0x63 _emit 0x74 _emit 0x20 _emit 0x62 _emit 0x65 _emit 0x67 _emit 0x69 _emit 0x6E _emit 0x00 } //想保護(hù)的程序代碼 __asm //標(biāo)記結(jié)束處. { _emit 0xEB _emit 0x0E //jmp 0x0e _emit 0x56 //ascii "VMProtect end",0 _emit 0x4D _emit 0x50 _emit 0x72 _emit 0x6F _emit 0x74 _emit 0x65 _emit 0x63 _emit 0x74 _emit 0x20 _emit 0x65 _emit 0x6E _emit 0x64 _emit 0x00 }
將這一對(duì)標(biāo)記插入到任何想保護(hù)的程序代碼處就行了。 這種方法能夠深入函數(shù)內(nèi)部,精確的保護(hù)想要保護(hù)的某一段代碼。在插入成功后,你可以在VMProtect加殼時(shí)選擇內(nèi)部函數(shù)的地方找到這種函數(shù) "VMProtectMarker1", 這就是使用了標(biāo)記的地方,有多處保護(hù)的話這些函數(shù)數(shù)字會(huì)遞增,如 VMProtectMarker2, VMProtectMarker3 等. 記得選上這些函數(shù)再進(jìn)行保護(hù)。
VMProtect的SDK標(biāo)志如果用得多的話最好define一下,精簡(jiǎn)一點(diǎn)。 如下:
有了上面的define,在需要加密的地方只需要兩句話就行了,可以到處多插一點(diǎn):
代碼:
VMPBEGIN 待加密的代碼段 VMPEND
然后用向?qū)J酱蜷_加了標(biāo)簽的程序,這樣會(huì)顯示要加密的段,選中加密段加密就行了。具體方法如下:
(在工程編譯選項(xiàng)中:Project->Options->Linker 選項(xiàng)卡中的 Map File 選項(xiàng)中,將單選框選擇Detailed,然后在VMProtect添加保護(hù)代碼中會(huì)看到函數(shù)地址)配合PESpin的SDK實(shí)施保護(hù)。
方法過程如下:
00443A04 EB24 jmp 00443A2A //這個(gè)JMP命令的機(jī)器碼 EB24 便是 00443A06 FB sti //PESpin的 Crypt markers 的 SDK {$I clear_start.inc} 00443A07 FB sti //的開始標(biāo)志 00443A08 FB sti // 00443A09 FB sti // 00443A0A FB sti // 00443A0B FB sti // 00443A0C FB sti // 00443A0D FB sti // 00443A0E FB sti // 00443A0F FB sti // 00443A10 FB sti // 00443A11 FB sti // 00443A12 FB sti // 00443A13 FB sti // 00443A14 FB sti // 00443A15 FB sti // 00443A16 FB sti // 00443A17 FB sti // 00443A18 FB sti // 00443A19 FB sti // 00443A1A FB sti // 00443A1B FB sti // 00443A1C FB sti // 00443A1D FB sti // 00443A1E FB sti // 00443A1F FB sti // 00443A20 FB sti // 00443A21 FB sti // 00443A22 FB sti // 00443A23 FB sti // 00443A24 FB sti // 00443A25 FB sti //PESpin的 Crypt markers 的 SDK {$I clear_start.inc} 00443A26 66BD0000 mov bp, $0000 //的結(jié)束標(biāo)志 * Possible String Reference to: 'PESpin Markers Test' | 00443A2A BA743A4400 mov edx, $00443A74 //× 準(zhǔn)備在此處 ×開始× VMProtect的保護(hù) ×//詳見【4A】 * Reference to: controls.TControl.SetText(TControl;TCaption); | 00443A2F E89C02FEFF call 00423CD0 //× 準(zhǔn)備在此處 ×結(jié)束× VMProtect的保護(hù) ×//詳見【4B】 00443A34 EB33 jmp 00443A69 //這個(gè)JMP命令的機(jī)器碼 EB33 便是 00443A36 FA cli //PESpin的 Crypt markers 的 SDK {$I clear_end.inc} 00443A37 FA cli //的開始標(biāo)志 00443A38 FA cli // 00443A39 FA cli // 00443A3A FA cli // 00443A3B FA cli // 00443A3C FA cli // 00443A3D FA cli // 00443A3E FA cli // 00443A3F FA cli // 00443A40 FA cli // 00443A41 FA cli // 00443A42 FA cli // 00443A43 FA cli // 00443A44 FA cli // 00443A45 FA cli // 00443A46 FA cli // 00443A47 FA cli // 00443A48 FA cli // 00443A49 FA cli // 00443A4A FA cli // 00443A4B FA cli // 00443A4C FA cli // 00443A4D FA cli // 00443A4E FA cli // 00443A4F FA cli // 00443A50 FA cli // 00443A51 FA cli // 00443A52 FA cli // 00443A53 FA cli // 00443A54 FA cli // 00443A55 FA cli // 00443A56 FA cli // 00443A57 FA cli // 00443A58 FA cli // 00443A59 FA cli // 00443A5A FA cli // 00443A5B FA cli // 00443A5C FA cli // 00443A5D FA cli // 00443A5E FA cli // 00443A5F FA cli // 00443A60 FA cli // 00443A61 FA cli // 00443A62 FA cli // 00443A63 FA cli // 00443A64 FA cli //PESpin的 Crypt markers 的 SDK {$I clear_end.inc} 00443A65 66BD0000 mov bp, $0000 //的結(jié)束標(biāo)志 00443A69 C3 ret
00443A88 55 push ebp 00443A89 8BEC mov ebp, esp 00443A8B 6A00 push $00 00443A8D 6A00 push $00 00443A8F 6A00 push $00 00443A91 53 push ebx 00443A92 56 push esi 00443A93 57 push edi 00443A94 8BF8 mov edi, eax 00443A96 33C0 xor eax, eax 00443A98 55 push ebp * Possible String Reference to: '殪鼷腚_^[嬪]? | 00443A99 68873B4400 push $00443B87 ***** TRY | 00443A9E 64FF30 push dword ptr fs:[eax] 00443AA1 648920 mov fs:[eax], esp 00443AA4 8D55FC lea edx, [ebp-$04] 00443AA7 8B87D4020000 mov eax, [edi+$02D4] * Reference to: controls.TControl.GetText(TControl):TCaption; | 00443AAD E8EE01FEFF call 00423CA0 00443AB2 8B45FC mov eax, [ebp-$04] * Reference to: system.@LStrLen:Integer; | or: system.@DynArrayLength; | or: system.DynArraySize(Pointer):Integer; | 00443AB5 E8A600FCFF call 00403B60 00443ABA 85C0 test eax, eax 00443ABC 0F84AA000000 jz 00443B6C 00443AC2 EB08 jmp 00443ACC //這個(gè)JMP命令的機(jī)器碼 EB08 便是 00443AC4 FC cld //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 00443AC5 FC cld //的開始標(biāo)志 00443AC6 FC cld // 00443AC7 FC cld // 00443AC8 FC cld // 00443AC9 FC cld // 00443ACA 27 daa //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 00443ACB 54 push esp //的結(jié)束標(biāo)志 00443ACC 33DB xor ebx, ebx //× 準(zhǔn)備在此處 ×開始× VMProtect的保護(hù) ×//詳見【5A】 00443ACE 33F6 xor esi, esi 00443AD0 43 inc ebx 00443AD1 8D55F8 lea edx, [ebp-$08] 00443AD4 8B87D4020000 mov eax, [edi+$02D4] * Reference to: controls.TControl.GetText(TControl):TCaption; | 00443ADA E8C101FEFF call 00423CA0 00443ADF 8B45F8 mov eax, [ebp-$08] 00443AE2 0FB64418FF movzx eax, byte ptr [eax+ebx-$01] 00443AE7 03F0 add esi, eax 00443AE9 8D55F4 lea edx, [ebp-$0C] 00443AEC 8B87D4020000 mov eax, [edi+$02D4] * Reference to: controls.TControl.GetText(TControl):TCaption; | 00443AF2 E8A901FEFF call 00423CA0 00443AF7 8B45F4 mov eax, [ebp-$0C] * Reference to: system.@LStrLen:Integer; | or: system.@DynArrayLength; | or: system.DynArraySize(Pointer):Integer; | 00443AFA E86100FCFF call 00403B60 00443AFF 3BD8 cmp ebx, eax 00443B01 7CCD jl 00443AD0 00443B03 83EE43 sub esi, +$43 00443B06 83C610 add esi, +$10 00443B09 81F69A020000 xor esi, $0000029A 00443B0F 81F609030000 xor esi, $00000309 00443B15 C1E602 shl esi, $02 00443B18 33DB xor ebx, ebx 00443B1A 43 inc ebx 00443B1B 8BC3 mov eax, ebx 00443B1D 03C0 add eax, eax 00443B1F 33C3 xor eax, ebx 00443B21 F7EE imul esi 00443B23 8BF0 mov esi, eax 00443B25 83FB06 cmp ebx, +$06 00443B28 7CF0 jl 00443B1A //× 準(zhǔn)備在此處 ×結(jié)束× VMProtect的保護(hù) ×//詳見【5B】 00443B2A EB08 jmp 00443B34 //這個(gè)JMP命令的機(jī)器碼 EB08 便是 00443B2C FD std //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc} 00443B2D FD std //的開始標(biāo)志 00443B2E FD std // 00443B2F FD std // 00443B30 FD std // 00443B31 FD std // 00443B32 54 push esp //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc} 00443B33 37 aaa //的結(jié)束標(biāo)志 00443B34 81FEC0884904 cmp esi, $044988C0 00443B3A 7408 jz 00443B44 00443B3C 81FEC0884904 cmp esi, $044988C0 00443B42 7515 jnz 00443B59 00443B44 6A00 push $00 * Possible String Reference to: 'Example Markers' | 00443B46 68983B4400 push $00443B98 * Possible String Reference to: 'Good pass :D' | 00443B4B 68A83B4400 push $00443BA8 00443B50 6A00 push $00 * Reference to: user32.MessageBoxA() | 00443B52 E8192BFCFF call 00406670 00443B57 EB13 jmp 00443B6C 00443B59 6A00 push $00 * Possible String Reference to: 'Example Markers' | 00443B5B 68983B4400 push $00443B98 * Possible String Reference to: 'Bad password. Try: PESpin' | 00443B60 68B83B4400 push $00443BB8 00443B65 6A00 push $00 * Reference to: user32.MessageBoxA() | 00443B67 E8042BFCFF call 00406670 00443B6C 33C0 xor eax, eax 00443B6E 5A pop edx 00443B6F 59 pop ecx 00443B70 59 pop ecx 00443B71 648910 mov fs:[eax], edx ****** FINALLY | * Possible String Reference to: '_^[嬪]? | 00443B74 688E3B4400 push $00443B8E 00443B79 8D45F4 lea eax, [ebp-$0C] 00443B7C BA03000000 mov edx, $00000003 * Reference to: system.@LStrArrayClr; | 00443B81 E87EFDFBFF call 00403904 00443B86 C3 ret * Reference to: system.@HandleFinally; | 00443B87 E9ECF7FBFF jmp 00403378 00443B8C EBEB jmp 00443B79 ****** END | 00443B8E 5F pop edi 00443B8F 5E pop esi 00443B90 5B pop ebx 00443B91 8BE5 mov esp, ebp 00443B93 5D pop ebp 00443B94 C3 ret
00443BD4 53 push ebx 00443BD5 8BD8 mov ebx, eax 00443BD7 EB08 jmp 00443BE1 //這個(gè)JMP命令的機(jī)器碼 EB08 便是 00443BD9 FC cld //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 00443BDA FC cld //的開始標(biāo)志 00443BDB FC cld // 00443BDC FC cld // 00443BDD FC cld // 00443BDE FC cld // 00443BDF 27 daa //PESpin的 Crypt markers 的 SDK {$I crypt_start.inc} 00443BE0 54 push esp //的結(jié)束標(biāo)志 00443BE1 6A00 push $00 //× 準(zhǔn)備在此處 ×開始× VMProtect的保護(hù) ×//詳見【6A】 * Possible String Reference to: 'Example Markers...' | 00443BE3 68083C4400 push $00443C08 * Possible String Reference to: 'Example in Delphi by reywen^htb' | 00443BE8 681C3C4400 push $00443C1C 00443BED 8BC3 mov eax, ebx * Reference to: controls.TWinControl.GetHandle(TWinControl):HWND; | 00443BEF E87C61FEFF call 00429D70 00443BF4 50 push eax * Reference to: user32.MessageBoxA() | 00443BF5 E8762AFCFF call 00406670 //× 準(zhǔn)備在此處 ×結(jié)束× VMProtect的保護(hù) ×//詳見【6B】 00443BFA EB08 jmp 00443C04 //這個(gè)JMP命令的機(jī)器碼 EB08 便是 00443BFC FD std //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc} 00443BFD FD std //的開始標(biāo)志 00443BFE FD std // 00443BFF FD std // 00443C00 FD std // 00443C01 FD std // 00443C02 54 push esp //PESpin的 Crypt markers 的 SDK {$I crypt_end.inc} 00443C03 37 aaa //的結(jié)束標(biāo)志 00443C04 5B pop ebx 00443C05 C3 ret
代碼保護(hù)利器VMProtect在線訂購(gòu)315特惠,個(gè)人授權(quán)專享折扣立即購(gòu)買>>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn