W32DASM8.93捉蟲記    湖北 wuhuashang

看雪資料發表於2000-07-21

W32DASM8.93捉蟲記    湖北 wuhuashang
    W32DASM是除錯修改程式的強大工具,作為SOFTICE的輔助工具W32DASM為CRACKER必備。
    當前許多軟體採用註冊方式,輸入註冊號,若正確顯示"THANK YOU",否則顯示"INCORRECT PASSWORD",用W32DASM反編譯該軟體,然後查詢指定的錯誤資訊如"INCORRECT PASSWORD"或其他因沒有註冊而顯示的某些提示資訊,假若被找到,對熟練的CRACKER而言,可能10分鐘後便完成破解,而對於沒有破解經驗的計算機愛好者,只要他有一點組合語言知識,再看一些別人用W32DASM破解的文章,用不了幾天,他便可以破解INTERNET網上的許多共享軟體;但是如果顯示的資訊並不是英文而是中文如"註冊號不正確",您試著也找......,您發現只要是中文資訊,W32DASM是沒法對中文反編譯的!
  W32DASM不支援中文日文韓文的反編譯,把它看作BUG應該可以被修改,磨刀不誤砍柴工!.
  我寫此文章不是教人破解軟體的加密資訊,而是寫出修改此軟體的BUG的過程,假設反編譯的中文軟體DEMO.EXE,輸入錯誤註冊號後顯示"無效的註冊號".
1.您可以用HEXEDIT修改為"ERRORPASS"(若被未知的軟體壓縮加密呢?),修改後最好登出或重新啟動計算機(記憶體有ERRORPASS字串)
2.啟動W32DASM,開啟DEMO.EXE,在32DASM反編譯約1-3秒鐘後CTRL+D切入SOFTICE
  S DS:0 L FFFFFFFF "ERRORPA"  (不要輸入為ERRORPASS,就是不要完整啦)
  若沒有找到退出SOFTICE,重新開啟DEMO.EXE,大約3秒鐘後CTRL+D切入SOFTICE(依次類推),經過一翻鬥爭
  在167:00610175處發現有"ERRORPASS"字串.
3.設定斷點BPM 167:610175,退出SOFTICE,W32DASM繼續編譯,馬上被SOFTICE攔截,分析:W32DASM能反編譯的字  符串的ASCII值在20H-7F之間,必然有CMP AX,20類似的比較,上下觀察並沒有該語句,退出SOFTICE,馬上又被  SOFTICE攔截下來,停止在CS:417241處:

.0041721A: 8B8530FFFFFF                mov      eax,[ebp][0FFFFFF30]       
.00417220: 85C0                        test      eax,eax                     
.00417222: 0F848B000000                je      .0004172B3   
.00417228: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.0041722E: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.00417234: 8D040A                      lea      eax,[edx][ecx]             
.00417237: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.0041723D: 0FBE0C10                    movsx    ecx,b,[eax][edx

說明:D DS:EAX+EDX  好傢伙!原來正在讀入"ERRORPASS",可以猜想,W32DASM能識別的字串的ASCII碼為20-7D之間而中文的ASCII碼>A0 (是負數),改CS:417244 75 CC ==>90 90 ,中文資訊不就可以處理嗎?哈哈,別高興太早,會失敗得慘!記錄下CS:417241 83F9207C5C
.00417241: 83F920                      cmp      ecx,020 ;" "               
.00417244: 7C5C                        jl      .0004172A2  -------- (1)   
.00417246: 8B83A5726000                mov      eax,[ebx][0006072A5]       
.0041724C: 8B93081F6F00                mov      edx,[ebx][0006F1F08]       
.00417252: 8D0C10                      lea      ecx,[eax][edx]             
.00417255: 8B8530FFFFFF                mov      eax,[ebp][0FFFFFF30]       
.0041725B: 0FBE1401                    movsx    edx,b,[ecx][eax]           
.0041725F: 83FA7D                      cmp      edx,07D ;"}"               
.00417262: 7F3E                        jg      .0004172A2   

.00417264: 8B8BA5726000                mov      ecx,[ebx][0006072A5]       
.0041726A: 8B83081F6F00                mov      eax,[ebx][0006F1F08]       
.00417270: 8D1401                      lea      edx,[ecx][eax]             
.00417273: 8B8D30FFFFFF                mov      ecx,[ebp][0FFFFFF30]       
.00417279: 0FBE440AFF                  movsx    eax,b,[edx][ecx][-0001]     
.0041727E: 83F820                      cmp      eax,020 ;" " 
說明:有敏感的比較,共有多少處要修改呢?您不是設定有斷點嗎?退出SOFTICE,必然又攔截下來,用筆記錄攔截的CS:IP.
.00417281: 7C23                        jl      .0004172A6  -------- (2)   
.00417283: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.00417289: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.0041728F: 8D040A                      lea      eax,[edx][ecx]             
.00417292: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.00417298: 0FBE4C10FF                  movsx    ecx,b,[eax][edx][-0001]     
.0041729D: 83F97D                      cmp      ecx,07D ;"}"               
.004172A0: 7F04                        jg      .0004172A6   

.004172A2: 33C0                        xor      eax,eax                     
.004172A4: EB05                        jmps    .0004172AB 
.004172A6: B801000000                  mov      eax,000000001 ;"    "       
.004172AB: 898574FFFFFF                mov      [ebp][0FFFFFF74],eax       
.004172B1: EB4B                        jmps    .0004172FE 
.004172B3: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.004172B9: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.004172BF: 8D040A                      lea      eax,[edx][ecx]             
.004172C2: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.004172C8: 0FBE0C10                    movsx    ecx,b,[eax][edx]           
.004172CC: 83F920                      cmp      ecx,020 ;" "               
.004172CF: 7C1E                        jl      .0004172EF  -------- (3)   
.004172D1: 8B83A5726000                mov      eax,[ebx][0006072A5]       
.004172D7: 8B93081F6F00                mov      edx,[ebx][0006F1F08]       
.004172DD: 8D0C10                      lea      ecx,[eax][edx]             
......
00417392: 0FBE0431                    movsx    eax,b,[ecx][esi]           
.00417396: 83F820                      cmp      eax,020 ;" "               
.00417399: 7C25                        jl      .0004173C0  -------- (4)   
.0041739B: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.004173A1: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.004173A7: 8D040A                      lea      eax,[edx][ecx]             
.004173AA: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.004173B0: 8D0C10                      lea      ecx,[eax][edx]             
.004173B3: 0FBE0431                    movsx    eax,b,[ecx][esi]           
.004173B7: 83F87D                      cmp      eax,07D ;"}"               
.004173BA: 0F8E68FFFFFF                jle      .000417328   
.004173C0: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.004173C6: 85D2                        test      edx,edx                     
.004173C8: 0F8483000000                je      .000417451 
.004173CE: 8B8BA5726000                mov      ecx,[ebx][0006072A5]       
.004173D4: 8B83081F6F00                mov      eax,[ebx][0006F1F08]       
.004173DA: 8D1401                      lea      edx,[ecx][eax]             
.004173DD: 8B8D30FFFFFF                mov      ecx,[ebp][0FFFFFF30]       
.004173E3: 66833C0A20                  cmp      w,[edx][ecx],020 ;" "       
此處的比較有點奇怪,為啥是CMP WORD PTR [EDX+ECX],20 而不是CMP BYTE PTR[EDX+ECX],20呢?而且有好幾個地方.
.004173E8: 7256                        jb      .000417440  -------- (5)   
.004173EA: 8B83A5726000                mov      eax,[ebx][0006072A5]       
.004173F0: 8B93081F6F00                mov      edx,[ebx][0006F1F08]       
.004173F6: 8D0C10                      lea      ecx,[eax][edx]             

......
.004173F9: 8B8530FFFFFF                mov      eax,[ebp][0FFFFFF30]       
.004173FF: 66833C017D                  cmp      w,[ecx][eax],07D ;"}"       
.00417404: 773A                        ja      .000417440   
.00417406: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.0041740C: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.00417412: 8D040A                      lea      eax,[edx][ecx]             
.00417415: 8B9530FFFFFF                mov      edx,[ebp][0FFFFFF30]       
.0041741B: 66837C10FF20                cmp      w,[eax][edx][-0001],020 ;" "
多好的比較方式,用此方法可以快速解決某些西文軟體不能輸入漢字的問題.不是嗎?

.00417421: 7221                        jb      .000417444  -------- (6)   
.00417423: 8B8BA5726000                mov      ecx,[ebx][0006072A5]       
.00417429: 8B83081F6F00                mov      eax,[ebx][0006F1F08]       
.0041742F: 8D1401                      lea      edx,[ecx][eax]             
.00417432: 8B8D30FFFFFF                mov      ecx,[ebp][0FFFFFF30]       
.00417438: 66837C0AFF7D                cmp      w,[edx][ecx][-0001],07D ;"}"
.0041743E: 7704                        ja      .000417444       
.00417440: 33C0                        xor      eax,eax                     
.00417442: EB05                        jmps    .000417449 
.00417444: B801000000                  mov      eax,000000001 ;"    "       
.00417449: 898570FFFFFF                mov      [ebp][0FFFFFF70],eax       
.0041744F: EB47                        jmps    .000417498 
.00417451: 8B93A5726000                mov      edx,[ebx][0006072A5]       
.00417457: 8B8B081F6F00                mov      ecx,[ebx][0006F1F08]       
.0041745D: 8D040A                      lea      eax,[edx][ecx]         

......
00460556: 8A0418                        mov      al,[eax][ebx]               
.00460559: 3C20                        cmp      al,020 ;" "                 
.0046055B: 7204                        jb      .000460561  -------- (7)   
.0046055D: 3C7D                        cmp      al,07D ;"}"                 
.0046055F: 7613                        jbe      .000460574   
.00460561: 68DE3D4C00                  push      0004C3DDE ;" L=?           
.00460566: 8D95C0FEFFFF                lea      edx,[ebp][0FFFFFEC0]       
.0046056C: 52                          push      edx                         
.0046056D: E8E8E60400                  call    .0004AEC5A 
.00460572: EB2D                        jmps    .0004605A1   
.00460574: 6A01                        push      001             
我試所有的類似 CMP xxxx,20       
    JB/JL  xxxx    (該行用90 90 替換)
經驗證發現許多應該顯示的字串也沒有顯示,慘慘慘!問題出在比較的方式不一樣.您可以用HEXEDIT開啟一個EXE檔案,所有被顯示字串末尾有一個位元組00H,當讀取字串完畢後讀入字元00H,此時JB/JL必然成立,必須正常跳轉,不能被改成NOP,所以改思路:
    CMP    WORD PTR [XXXX],20
    JB/JL  XXXX  ==>90 90
    CMP    BYTE PTR[XXXX],20  { 對照(3)(4) (7)處} ===>20改00
    JB/JL  XXXX                                  ==>JB改JE
完整記錄下要修改處的CS:IP或16進位制字串,用UNASPACK脫掉W32DASM的外殼,再用HEXEDIT(必須記錄被修改處的16進位制字串)或HACKVIEW修改,最後您去測試,中文資訊是不是全顯示出來了?

  版權所有,請不要修改原內容

相關文章