《hacktooth crackme #3》
今天这道CM,我看了一天,诸多不顺。
到最后也没解出来。想着把这个CM的步骤给写一下吧,后面等别人的出了之后参考参考。
就昨天下午的一个新的CM。

下载下来是一个exe

打开看看
一个比较传统的样式。

拿exeinfo看一下信息
无壳的,IDA看看

进来直接就是main函数
如图所示

流程比较复杂,想从string来入手

定位到registered
也就是这个地方看看流程
简单来说就是之前做了一个验证的过程
然后改变标志位,然后根据cmovz决定是否把ecx的内容覆盖进去。
扔OD动调一下

直接nop掉

爆破成功

分析算法
首先要做两件事情
第一个 原本放进OD不是401000开始的,因为这在vs2010后面写的。
到这里改一下这个值
把这玩意的值改成0
就可以了

另外一个,本题题目说有一个简单的反调试,我看string里面有一个

跟进

就在这个函数里面调用

他是在初始化的函数里面的
想办法patch掉。
注意到就给了v8
后面有个用到v8的地方

根据v8
403b06


patch成75就可以了

然后另存为这个就可以了。
其实最开始后看的时候没注意到isdebugger,也不确定是否只有这个反调试
最开始我以为是用线程的方式开的
网上找了很多,看着都不像,就往调用链上面看。

这里面调了main
又往前面看了一些,由以为是互斥锁搞得鬼。

不由得只能动调
可以看到我下的断的过程。

最开始从这里
这里跳到输出字符串

发现已经备好了

字符串的位置在
4080e0

我就想在这下个内存写入断点
注意这里要shift f9启动,忽略一些错误
来到这里
这条是关键

跟随一下地址

发现这个地址b5fe90
重启下断点
告知无效

看一下m

开始的时候还没有申请这块区域,里面有个用malloc开过,ida看看


确实如此
而且调用了很多遍
根据ida信息找到
这块区域

在里面下断点。
然后后面的步骤更复杂,我看了看,应该是用虚函数 对密文处理,存放在一个另外开辟出来的7b开头的区域,然后逐个读入b5fe90。然后再进入004080E0的。
但是调用链太复杂,可能我掉了哪个坑,等后续别人的解。