|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-12, 03:21 AM | #1 |
榮譽會員
|
★號求學篇,問得不在行不要怪我!
Subject:★號求學篇
Crack by : NewHand[BCG](QQ: 13565988) Crackme name: G_encryp.exe(作者Call算法名稱為"Gargamel") Size: 157KB Crackme Author: Bengi DownLoad: www.Crackmes.de或聯繫作者。 Tool: Ollydbg Difficult: easy Reason: 近來對某大陸開發軟體的反跟蹤保護產生興趣,誰知作者做得很有心思(無Nag勝有Nag),功力有限,只能跟到作者加了密 的一串反跟蹤列舉所有偵錯器的程式碼,暗樁不少,CRC更不要說找,於是暫時放棄了,★有興趣和 有能力的朋友歡迎connect me一同助我研究(為維護大陸開發作者權益,軟體是反向工程的,名稱私下聯繫) ★ 於是到網上找了個Crackme玩玩,調戲心情。。。。 Crackme沒有加殼,用C++編譯的,作者說它的Crackme可以encryp 20k Text Files,內有一份長度902 字元叫"Encrypte.txt"的加密文件,要求你對它進行解密,並有些問題a. b. c.想你思考的,若我有分析錯誤,歡迎指正^_^ ^_^ 你若用這個Crackme寫加密文件可用下面的程式碼位址攔截來到: 004011B0 /> 55 PUSH EBP 004011B1 |. 8BEC MOV EBP,ESP 004011B3 |. 81EC A0000000 SUB ESP,0A0 004011B9 |. 53 PUSH EBX 004011BA |. 56 PUSH ESI 004011BB |. 57 PUSH EDI 004011BC |. 8DBD 60FFFFFF LEA EDI,DWORD PTR SS:[EBP-A0] 004011C2 |. B9 28000000 MOV ECX,28 004011C7 |. B8 CCCCCCCC MOV EAX,CCCCCCCC 004011CC |. F3:AB REP STOS DWORD PTR ES:[EDI] 004011CE |. C745 F8 000000>MOV DWORD PTR SS:[EBP-8],0 004011D5 |. B9 10000000 MOV ECX,10 ; 下面一串的ASCII碼可能是Key,俗稱的「鑰匙」,這裡我叫它作「參算碼」 004011DA |. BE 1C004200 MOV ESI,G_ENCRYP.0042001C ; ASCII "8C41D6383B11686556BDC14DC4D42712E94820FDC0E591822CBE3890D0A3BDE9" 004011DF |. 8D7D B4 LEA EDI,DWORD PTR SS:[EBP-4C] 004011E2 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS> 004011E4 |. A4 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 省略部分程式碼。。。 00401290 |. 85C0 TEST EAX,EAX ; 明文長度 00401292 |. 0F84 83000000 JE G_ENCRYP.0040131B 00401298 |. C745 AC 000000>MOV DWORD PTR SS:[EBP-54],0 0040129F |. EB 09 JMP SHORT G_ENCRYP.004012AA 004012A1 |> 8B4D AC /MOV ECX,DWORD PTR SS:[EBP-54] 004012A4 |. 83C1 01 |ADD ECX,1 004012A7 |. 894D AC |MOV DWORD PTR SS:[EBP-54],ECX 004012AA |> 8B55 AC MOV EDX,DWORD PTR SS:[EBP-54] 004012AD |. 3B55 B0 |CMP EDX,DWORD PTR SS:[EBP-50] ; 比較是否少於明文長度,真繼續轉換明文 004012B0 |. 7D 3D |JGE SHORT G_ENCRYP.004012EF ; 跳向寫文件 004012B2 |. 8B4D B0 |MOV ECX,DWORD PTR SS:[EBP-50] ; 明文長度裝入ecx 004012B5 |. 2B4D AC |SUB ECX,DWORD PTR SS:[EBP-54] ; ecx = 明文長度 - 正在轉換的(自然數)順序號碼 004012B8 |. 8B45 B0 |MOV EAX,DWORD PTR SS:[EBP-50] ; 明文長度裝入eax 004012BB |. 2B45 AC |SUB EAX,DWORD PTR SS:[EBP-54] ; eax = 明文長度 - 正在轉換的(自然數)順序號碼 004012BE |. 99 |CDQ ; edx清零 004012BF |. 81E2 FF010000 |AND EDX,1FF 004012C5 |. 03C2 |ADD EAX,EDX 004012C7 |. C1F8 09 |SAR EAX,9 ; 明文長度在1023字元以上,eax算術右移就不為零 004012CA |. 0FBE5445 B4 |MOVSX EDX,BYTE PTR SS:[EBP+EAX*2-4C] ; 置1位參算碼到edx 004012CF |. 33CA |XOR ECX,EDX ; 未轉換個數與1位參算碼異或 004012D1 |. 8BC1 |MOV EAX,ECX ; 結果作被除數 004012D3 |. 99 |CDQ 004012D4 |. B9 1A000000 |MOV ECX,1A ; 置除數 1A 004012D9 |. F7F9 |IDIV ECX 004012DB |. 8B45 A4 |MOV EAX,DWORD PTR SS:[EBP-5C] ; 明文開始位置有效位址裝入eax 004012DE |. 0345 AC |ADD EAX,DWORD PTR SS:[EBP-54] ; 修正游標位置 004012E1 |. 8A08 |MOV CL,BYTE PTR DS:[EAX] ; 傳送明文順序的每1字元 004012E3 02CA ADD CL,DL ; CL = 餘數+明文每字元 004012E5 |. 8B55 A4 |MOV EDX,DWORD PTR SS:[EBP-5C] ; 明文開始位置有效位址裝入eax 004012E8 |. 0355 AC |ADD EDX,DWORD PTR SS:[EBP-54] ; 修正游標位置 004012EB |. 880A |MOV BYTE PTR DS:[EDX],CL ; CL結果放回明文原處 004012ED |.^EB B2 \JMP SHORT G_ENCRYP.004012A1 004012EF |> 8BF4 MOV ESI,ESP 004012F1 |. 6A 00 PUSH 0 ; /pOverlapped = NULL 004012F3 |. 8D45 A0 LEA EAX,DWORD PTR SS:[EBP-60] ; | 004012F6 |. 50 PUSH EAX ; |pBytesWritten 004012F7 |. 8B4D A8 MOV ECX,DWORD PTR SS:[EBP-58] ; | 004012FA |. 51 PUSH ECX ; |nBytesToWrite 004012FB |. 8B55 A4 MOV EDX,DWORD PTR SS:[EBP-5C] ; | 004012FE |. 52 PUSH EDX ; |Buffer 004012FF |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; | 00401302 |. 50 PUSH EAX ; |hFile 00401303 |. FF15 C4524200 CALL DWORD PTR DS:[<&KERNEL32.WriteFile>>; \WriteFile 註:我用C語言寫的解碼器,在Turbo C 2.0下測試有特殊符號(貼上)不能通過,一怒之下毀了這個解碼器,後來想了一想原則上是沒問題的, 只是msdos視窗始終不是真正windows--有行長限制和控制符限制,自己現在只是懂得小小東西(玩msdos視窗標準設備輸出輸入), ★有誰可以教我做個脫離dos的讀寫文件的傢伙(技巧、語言不要太難學啊),灌些(假設大小不能預計)緩衝陣列啟始化大小的技巧★; 忽然靈機一閃,004012E8處的程式碼處的ADD不如改成SUB,程序不就可以為我輸出譯文,^_^ ^_^密文說:「...#·%¥@」 被毀解碼器源碼: #include <stdio.h> #include <string.h> main() {char choice[]={"8C41D6383B11686556BDC14DC4D42712E94820FDC0E591822CBE3890D0A3BDE9"}; char code[16535]; unsigned int i,n,m,k,code_len,still_len; printf("\n*******************G_encryp解碼器**************************"); printf("\n\n請輸入已加密的內容:"); gets(code); code_len=strlen(code); n=0;m=0; if(code_len<16535) {for(i=0;i<code_len;i++) {still_len=code_len-n; m=(still_len>>9)*2; k=(still_len^choice[m])%0x1a; code[i]=code[i]-k; n+=1; } printf("\n\n你的原始資料是:"); puts(code); } else printf("\n你輸入的資料太長或I/O錯誤!"); } |
送花文章: 3,
|