无聊看了下 挺有意思的.
初始化时就启动了线程, 不停的执行.
所以最开始bp CreateThread 可得到线程处理函数 004011e0
/*4011E0*/ SUB ESP,208
/*4011E6*/ MOV EAX,DWORD PTR DS:[4091F4]
/*4011EB*/ XOR EAX,ESP
/*4011ED*/ PUSH EBX
/*4011EE*/ PUSH EBP
/*4011EF*/ PUSH ESI
/*4011F0*/ PUSH EDI
/*4011F1*/ MOV EDI,DWORD PTR SS:[ESP+21C]
/*4011F8*/ MOV DWORD PTR SS:[ESP+214],EAX
/*4011FF*/ MOV BL,1
/*401201*/ LEA EAX,DWORD PTR SS:[ESP+14]
/*401205*/ PUSH EAX
/*401206*/ CALL crackme.00401000
/*40120B*/ MOV AL,BYTE PTR SS:[ESP+18]
/*40120F*/ ADD ESP,4
/*401212*/ TEST AL,AL
/*401214*/ MOV ESI,EDI
/*401216*/ LEA EDX,DWORD PTR SS:[ESP+14]
/*40121A*/ MOV BYTE PTR DS:[40A4D0],BL
/*401220*/ JE SHORT crackme.0040123D
/*401222*/ MOV CL,AL
/*401224*/ MOVSX EBP,BYTE PTR DS:[ESI]
/*401227*/ MOVSX ECX,CL
/*40122A*/ SUB ECX,EBP
/*40122C*/ MOV DWORD PTR SS:[ESP+10],ECX
/*401230*/ JNZ SHORT crackme.00401249
/*401232*/ MOV CL,BYTE PTR DS:[EDX+2]
/*401235*/ ADD EDX,2
/*401238*/ INC ESI
/*401239*/ TEST CL,CL
/*40123B*/ JNZ SHORT crackme.00401224
/*40123D*/ MOV DWORD PTR DS:[409AC8],crackme.00409030
/*401247*/ JMP SHORT crackme.00401253
/*401249*/ MOV DWORD PTR DS:[409AC8],crackme.00409110
/*401253*/ CMP BYTE PTR DS:[40A4D1],BL
/*401259*/ JNZ SHORT crackme.00401201
/*40125B*/ TEST AL,AL
/*40125D*/ MOV EDX,EDI
/*40125F*/ LEA ECX,DWORD PTR SS:[ESP+14]
/*401263*/ MOV BYTE PTR DS:[40A4D0],BL
/*401269*/ JE SHORT crackme.00401289
/*40126B*/ JMP SHORT crackme.00401270
/*40126D*/ LEA ECX,DWORD PTR DS:[ECX]
/*401270*/ MOVSX ESI,BYTE PTR DS:[EDX]
/*401273*/ MOVSX EAX,AL
/*401276*/ SUB EAX,ESI
/*401278*/ MOV DWORD PTR SS:[ESP+10],EAX
/*40127C*/ JNZ SHORT crackme.00401298
/*40127E*/ MOV AL,BYTE PTR DS:[ECX+2]
/*401281*/ ADD ECX,2
/*401284*/ INC EDX
/*401285*/ TEST AL,AL
/*401287*/ JNZ SHORT crackme.00401270
/*401289*/ MOV DWORD PTR DS:[409AC8],crackme.00409030
/*401293*/ JMP crackme.00401201
/*401298*/ MOV DWORD PTR DS:[409AC8],crackme.00409110
/*4012A2*/ JMP crackme.00401201
其实这里就是算法部分. 如果正确将执行这个
/*401289*/ MOV DWORD PTR DS:[409AC8],crackme.00409030
/*401293*/ JMP crackme.00401201
不正确会执行
/*401298*/ MOV DWORD PTR DS:[409AC8],crackme.00409110
/*4012A2*/ JMP crackme.00401201
而大家都知道
在sleep一些随机时间后 会执行
/*4011C1*/ CALL DWORD PTR DS:[409AC8]
这个
当DWORD PTR DS:[409AC8]=00409030 即跳向正确
所以仅分析那个线程中的算法即可.
而这个算法 较为简单 并且sessiondiy 已经说过了 就不在赘述啦
楼上谁的计算机名是cat