160个Crackme -008解析

首先用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值