環境
Windows xp sp3
工具
1.VBExplorer
2.ollydbg
查殼
OD載入往上翻可以看出是vb程序,看到
00401042 .- FF25 60104100 jmp dword ptr ds:[<&MSVBVM50.MethCallEngine>] ; MSVBVM50.MethCallEngine
可以知道是p-code的了
測試
OD載入后搜字符串是搜不到的東西了。
參考
《使用OllyDbg從零開始Cracking》第29和30章關于p-code的內容之后就可以分析出來了。
0040E393前面的是一些對輸入內容長度格式等判斷
0040E393 循環開始
0040E3A6 讀入name
0040E3B8 name入棧
0040E3BB 將name從str變成variant類型
0040E3BE 這個是指向上面的variant的指針
0040E3C1 這是取第一個字符函數
0040E3C6 將上面的函數計算出的結果進棧
0040E3C9
0040E3CD 將剛剛進棧的字符轉成數值
0040E3D2 將剛剛得到的數值保存起來
0040E3D5 將得到的數值轉成10進制然后再轉為字符串
0040E3D9 將得到的字符串轉回variant
0040E3EF 跳回去0040E3930040E3F5 這里是將上面循環得到的字符串入棧
0040E3F8 得到上面入棧字符串的長度
0040E402 與0x9比較
0040E404 相等就跳到40E425
0040E407 將上面循環得到的字符串入棧
0040E40A push了一個圓周率
0040E416 字符串轉為數值除以3.141592654
0040E41A 將結果入棧
0040E422 jmp 0040E3F50040E425 將上面的結果取整入棧
0040E430 將棧中的值轉為16進制后再與0x30F85678進行異或運算
0040E434
0040E438 將上面的計算結果入棧
0040E43E
0040E441 將0xD8B3入棧
0040E445 將0040E438處入棧的值減去0xD8B3,并將結果入棧
0040E449
0040E44D
0040E452
0040E455 0040E45A 開始for循環
0040E460
0040E463
0040E464
0040E46D 讀取serial
0040E472 serial入棧
0040E475
0040E478
0040E47A
0040E47D
0040E480 這里push了一個值
0040E481 和輸入的serial比較是否相同
0040E483
0040E486
0040E489 相同則跳到0040E48C
0040E48C
0040E48F 跳回循環0040E4A2 讀入serial
0040E4A7
0040E4AA 將字符串轉為variant
0040E4AD 將上面的計算的值存了進來
0040E4B0 用字符串的字面值減去上面計算的值
0040E4B4
0040E4B7
0040E4C1 讀入name
0040E4C6
0040E4C9 計算name長度
0040E4CF 判斷是否相等,不相等就為0
0040E4DE 如果上面判斷結果為0就跳到錯誤消息框,
還是和Native-code代碼一樣,在分析算法中還是存在許多東西可以跳過的。
指令的位置可以用VBExplorer反編譯出來。
然后用OD動態調試觀察執行細節就行了
總結起來就是:
將name中每一個字符轉成ascii值。
如:abcdefg
變成:979899100101102103
再判斷這個值長度是否大于0x9
如果是就除以3.141592654
重復直到長度不大于0x9
于是就有:351021547
再將結果與0x30F85678異或
變成:605323155
減去0xD8B3,
變成:605267680
最后加上name的長度7:
變成:605267687