先跑一下,然後找出關鍵字符串
關鍵字符串是You Get Wrong和Try Again,不過IDA好像識別不出來這個字符串,在Ollydbg中右鍵Search For,尋找所有字符串,可以找到這些字符串,好像是unicode碼,可能IDA沒有辦法識別
然後定位到代碼
.text:004025E5 push offset aYouGetWrong ; "You Get Wrong"
然後定位到調用代碼,這裏的跳轉如果被忽略那麼就可以直接跳轉到正確結果
.text:0040258B jz short loc_4025E5
直接在Ollydbg中改寫這個地方的指令,右鍵binary->edit,將這兩個指令改成nop
然後就ok了
上面的修改說明了關鍵判斷確實是在這裏
看看這部分的代碼
.text:00402510 loc_402510: ; CODE XREF: .text:004024FC↑j .text:00402510 mov eax, [ebp-18h] ;指向UNICODE "Type In Your Serial" .text:00402513 mov ecx, [ebp-1Ch] ;指向UNICODE "1658111"
.text:00402516 mov edi, ds:__vbaStrCat .text:0040251C push eax .text:0040251D push offset aAka ; "AKA-" .text:00402522 push ecx .text:00402523 call edi ; __vbaStrCat ;應該是VBA裏面的字符串拼接函數,參數都是通過棧來傳遞的,返回值爲AKA-1658111 .text:00402525 mov ebx, ds:__vbaStrMove .text:0040252B mov edx, eax .text:0040252D lea ecx, [ebp-20h] .text:00402530 call ebx ; __vbaStrMove .text:00402532 push eax .text:00402533 call ds:__vbaStrCmp ;比較函數,比較的是"AKA-1658111"和序列號字符串 .text:00402539 mov esi, eax ;返回值爲1,賦值給esi .text:0040253B lea edx, [ebp-20h] .text:0040253E neg esi ;求補運算,這裏esi等於全f .text:00402540 lea eax, [ebp-18h] .text:00402543 push edx .text:00402544 sbb esi, esi .text:00402546 lea ecx, [ebp-1Ch] .text:00402549 push eax .text:0040254A inc esi ;加1變爲0 .text:0040254B push ecx .text:0040254C push 3 .text:0040254E neg esi ;求補還是0 .text:00402550 call ds:__vbaFreeStrList .text:00402556 add esp, 10h .text:00402559 lea edx, [ebp-28h] .text:0040255C lea eax, [ebp-24h] .text:0040255F push edx .text:00402560 push eax .text:00402561 push 2 .text:00402563 call ds:__vbaFreeObjList .text:00402569 add esp, 0Ch .text:0040256C mov ecx, 80020004h .text:00402571 mov eax, 0Ah .text:00402576 mov [ebp-64h], ecx .text:00402579 test si, si ;esi爲0,test設置了zf標誌位 .text:0040257C mov [ebp-6Ch], eax .text:0040257F mov [ebp-54h], ecx .text:00402582 mov [ebp-5Ch], eax .text:00402585 mov [ebp-44h], ecx .text:00402588 mov [ebp-4Ch], eax .text:0040258B jz short loc_4025E5 ;所以這裏ZF標誌位是1,要進行跳轉 .text:0040258D push offset aYouGetIt ; "You Get It" .text:00402592 push offset asc_401B9C ; "\r\n" .text:00402597 call edi ; __vbaStrCat .text:00402599 mov edx, eax .text:0040259B lea ecx, [ebp-18h] .text:0040259E call ebx ; __vbaStrMove .text:004025A0 push eax .text:004025A1 push offset aKeygenItNow ; "KeyGen It Now"
大致過一遍上面的代碼,可以知道只需要序列號等於AKA-1658111就可以讓比較函數返回0,然後通過後面的檢測,由於AKA是固定字符串,剩下的就是看1658111這個串是怎麼來的。
然後再往前找ebp-1ch在哪裏被引用了
004023F3這個位置,ebp-1ch被修改爲了用戶名字符串,接着402415處又將該字符串作爲參數調用長度,返回0x11,長度值。00402420處將長度值乘以17CFB,0040242D調用了rtcAnsiValueBstr函數,參數爲用戶名,返回第一個字符,該函數執行之後,eax值爲0x54,T的ascll碼,然後加上前面長度值乘以17CFB的結果,位0x194cff,0040243F將這個值作爲參數調用了__vbaStrI4函數,這個函數返回之後,eax指向字符串“1658111”,這個字符串就來了,所以這應該是數字轉字符串的函數。
所以最後的算法應該是用戶名的長度乘以17CFB加上用戶名的第一個字符,結果轉成10進制,再轉成字符串,加上前綴"AKA-"。
最後,可以改最後一個條件的判斷碼,來實現跳轉轉移,JE改成JNE,74改75