我和pcode的第一次――:) (5千字)

看雪資料發表於2002-09-23

娃娃的CCG crackme3簡要分析(P-CODE型)

作者:bbbsl[iPB][FCG]
目標:娃娃的CCG CRACKME3
工具:WKTVBDebugger v1.3,exdec(以上工具在風飄學兄的站點有下載)

      首先我得多謝master兄引我上路,要不到現在我還不知道怎麼弄P-CODE的東東,這兩天從風飄雪兄的網站下了幾個CRACKME,練習了一下,效果還不錯,這個可是我自己連猜帶蒙搞定的哦!!!哦,對了還要多謝好友upfeed每次耐心地聽我羅嗦及對我不吝其口舌的指點!!!還有一位很可愛的老朋友,儘管此君老大年紀了,居然還是和我一樣單身,哎,同病相憐啊,謝謝你老人家給予我信心!!!
      順便說一句,我從開始學著用exdec和wktvbdebugger到搞定這個東東的演算法總共不到5小時,哇,這樣一看,pcode的入門也不是很難嘛,所以會pcode的高手一定很多,幫忙看看我的分析有啥不對的啦!多謝!
      程式碼如下,用exdec反編譯的,哦,如果靜態分析有困難,可以用WKTVBDebugger,由於是在輸入的同時進行驗證,所以我們在EDIT上下斷點,方法:用WKTVBDebugger開啟crackme,點Form Manager,拉下拉框選擇main,然後選擇TEXTBOX,下拉框選擇TEXT1,點BPX鈕,OK,現在按F5執行程式,在輸入框中輸入任何東東,立刻斷下來了:)於是到了這裡....


40EAAC: 04 FLdRfVar                local_00E0    ==>push address這玩藝過會存放字串的地址,
40EAAF: 21 FLdPrThis                      ==>這裡我懷疑是取程式本身的控制程式碼,不確定,請高手指點
40EAB0: 0f VCallAd                (object 2 )    ==>之所以有上面的懷疑是因為這裡wktvbdbg註釋為
                    ==>main.text1,所以猜是呼叫某程式自身的函式
40EAB3: 19 FStAdFunc              local_00DC    
40EAB6: 08 FLdPr                  local_00DC
40EAB9: 0d VCallHresult            id        ==>get_ipropTEXTEDIT 得到輸入字串
40EABE: 3e FLdZeroAd              local_00E0    ==>字串地址指標
40EAC1: 46 CVarStr                local_00F0    ==>複製指標到local_00F0
40EAC4: 04 FLdRfVar                local_0100    ==>push函式引數,WKTVBdbg走到這裡可以看                        ==>locao_0100+8所指代的記憶體,那是你輸入的東東
40EAC7: 0a ImpAdCallFPR4:                  ==>rtvTrimVar相當於what?VB高手告訴我這函式幹嘛用的                    ==>好嗎?
40EACC: 04 FLdRfVar                local_0100    ==>push字串
40EACF: Lead0/eb FnLenVar                ==>得到字串長度
40EAD3: Lead1/f6 FStVar                  ==>將長度存到某處,哪裡我沒弄明白:(
40EAD7: 1a FFree1Ad                local_00DC
40EADA: 36 FFreeVar            ==>free...
40EAE1: f4 LitI2_Byte:            0x1  1  (.)    ==>push 1 as byte???
40EAE3: 04 FLdRfVar                local_00D6    
40EAE6: 04 FLdRfVar                local_00D4    
40EAE9: 55 CI2Var                        ==>這裡應該是相當於計數器i了,當然是以剛才取的長度為...
40EAEA: Lead3/63 ForI2:            (when done) 40EB5D==>靠,總算見著個確定的函式,for語句,都見過吧:)
40EAF0: 21 FLdPrThis                      ==>看看,又是一個,我剛才說過我的猜測了
40EAF1: 0f VCallAd                (object 2 )    ==>某函式???
40EAF4: 19 FStAdFunc              local_00DC        
40EAF7: 28 LitVarI2:              ( local_0100 ) 0x1  (1)==>把常數1賦給local_0100,然後將此變數入棧
40EAFC: 6b FLdI2                  local_00D6    ==>這裡是計數器i
40EAFF: e7 CI4UI1                        ==>似乎起符號擴充套件的作用,大夥看看
40EB00: 3e FLdZeroAd              local_00DC    
40EB03: Lead2/6f CVarAd         
40EB07: 04 FLdRfVar                local_0110
40EB0A: 0a ImpAdCallFPR4:                  ==>這裡是rtcMidChar,這十幾行就是Mid$(str,i,1)
40EB0F: 04 FLdRfVar                local_0110
40EB12: Lead1/f6 FStVar         
40EB16: 1a FFree1Ad                local_00DC
40EB19: 36 FFreeVar
40EB20: 04 FLdRfVar                local_0094
40EB23: Lead2/fe CStrVarVal        local_00E0    ==>取得的字元地址入棧
40EB27: 0b ImpAdCallI2                    ==>call rtcAnsiValueBstr,就是ASC$(char)
40EB2C: 44 CVarI2                  local_0124    ==>字元的ASCII值
40EB2F: Lead1/f6 FStVar         
40EB33: 2f FFree1Str              local_00E0
40EB36: 04 FLdRfVar                local_00B4    ==>這個應是返回值了
40EB39: 6b FLdI2                  local_00D6    ==>噹噹噹....當!計數器i出現,幹什麼用呢?
40EB3C: 44 CVarI2                  local_0124    ==>哇,取得的字元也出現了
40EB3F: Lead0/94 AddVar            local_00F0    ==>原來是加起來用啊
40EB43: Lead1/f6 FStVar         
40EB47: 04 FLdRfVar                local_00A4    ==>這個東東是sum
40EB4A: 04 FLdRfVar                local_00B4    ==>這個東東是剛才的結果
40EB4D: Lead0/94 AddVar            local_00F0    ==>兩個東東加一起
40EB51: Lead1/f6 FStVar                  ==>放到local_00A4裡面去.哦哦...
40EB55: 04 FLdRfVar                local_00D6    ==>計數器i再次登場
40EB58: 64 NextI2:                (continue) 40EAF0==>是否繼續???
40EB5D: 04 FLdRfVar                local_00A4        ==>剛才我說過的sum
40EB60: 28 LitVarI2:              ( local_0124 ) 0x6e4  (1764)==>一個常數0x6e4
40EB65: 5d HardType                      
40EB66: Lead0/33 EqVarBool                ==>兩者是否相等?
40EB68: 1c BranchF:                40EB94    ==>不等就錯誤了:)
40EB6B: 1b LitStr:                "恭喜你..."
40EB6E: 21 FLdPrThis             
40EB6F: 0f VCallAd                (object 2 )
40EB72: 19 FStAdFunc              local_00DC
40EB75: 08 FLdPr                  local_00DC
40EB78: 0d VCallHresult            禚d        ==>put _ipropTEXTEDIT寫下幾句肉麻的話^_*
40EB7D: 1a FFree1Ad                local_00DC
40EB80: f4 LitI2_Byte:            0x0  0  (.)
40EB82: 21 FLdPrThis             
40EB83: 0f VCallAd                (object 1 )
40EB86: 19 FStAdFunc              local_00DC
40EB89: 08 FLdPr                  local_00DC
40EB8C: 0d VCallHresult            禚d

總結:
    演算法如下:int sum=0;int char,len;
    gets(str);len=strlen(str);
    for (int i=0;i<len;i++) sum+=(i+1+str[i]);
    if (sum==0x6e4) printf("Bingo,just so so");
    呵呵,我就會弄些簡單的糊弄人,沒法,就這麼大本事,還請各位海涵....
    
附:反正得湊個數,沒什麼目的性,就當成序號產生器寫吧,其實寫的時候也是迷迷糊糊,儘量保證不出現特殊字元吧
int main(){
    int i,len,sum=0;
    char str[20]="bbbsl";
    clrscr();
    gets(str);
    len=strlen(str);
    for (i=0;i<len;i++) sum+=(str[i]+1+i);
    if (sum>0x6e4) printf("error name");
    else{
        sum=0x6e4-sum;
        do{
            str[i]=0x41;
            sum-=(0x42+i);
            i++;
        }while((sum-0x42-i)>0x40);
        if (sum>0x7a+0x14) {
            sum-=40;
            str[i]=sum/2;
            str[i+1]=sum-str[i]-1;
            str[i+2]='\0';
        }else{
            sum-=20;
            str[i]=sum;
            str[i+1]='\0';
        }
        puts (str);
    }
    return 0;
}

相關文章