首先用Exeinfope.exe 了解信息,vb写的,Not packed 无壳
双击运行,发现报错。
直接用everything 搜索一下MSVBVM50.DLL,crackme其他地方有这个dll,复制到当前目录。双击运行,正常运行。
发现标题乱码,随便点点,猜测是其他语言,用自动翻译试下,好像是德语。
继续往下,挂od,搜索文本字符,看到可疑地方,转过去打断点.
观察代码,很容易猜想到是跟SynTaX 2oo1 做比较,然后根据结果走不同的流程。
后面因为我大小写输入错误,导致一直走进了错误流程。顺带去分析了一下这部分neg的指令。
Neg是对操作数取反加1,会影响cf位,如果操作数是0,则cf位为0,如果非0,则cf位为1。
对edi Neg 后,通过带进位sbb 减法指令,把cf位取反码到edi中。Sbb edi ,edi 可以翻译成Neg cf 结果存放到edi中。
Inc edi 。因为cf只有0和1,这时候edi仅有两种状态,0和ffffffff ,也就是0和-1。然后再inc的话,cf位又受到影响,回到第一次Neg原来状态。但edi变成了 1和0两种状态。
Neg edi。edi变成-1和0。置换了状态,然后cmp 跟si比较。此处si一直是0.
疑问:其实只需要比较cmp eax,1,然后jmp就行了,为啥还要搞那么复杂呢?
推测:上面strcmp函数返回的是一个int 型,但是代码应该写的是if(ret == 0)这种吧,然后编译器优化成这样了吧?
总的来说,这是最简单的一次crackme,直接输入特定值破解。唯一收获的的是这个判断返回值的技巧,下面附录指令后的对应edi状态变化。
小菜一枚,如果错误,欢迎大佬指教。
指令前 指令后
指令 edi cf edi
Neg 0/1 0/1 0/-1
Sbb 0/-1 0/0 0/-1
Inc 0/-1 0/1 1/0
Neg 1/0 1/0 -1/0