适合新手的160个creakme(二)
先跑一下,然后找出关键字符串
关键字符串是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