如有错误或理解不到位的地方劳烦各位大佬指出,感谢!
一、Reverse000.exe
1.使用OD打开Reverse000.exe
2.右键选择中文搜索引擎->智能搜索
3.双击please input password:跟进去
4.此处为明文密码,直接就能找到
密码为: i love this game(i前面有个空格)
二、Reverse001.exe
1.Ctrl+F9运行到输入的位置,之后随便输入一个密码测试一下
2.第一个数字会与0x32进行比较,之后JE跳转,然后我们跟着JE看看下面的代码
3.跟下来发现下面又有一个CMP,其实这里就是比较第二个数字的位置,下面也照样有JE,跟上一步一样,不断跟JE找到CMP的比较值就可以了
4.随着最后一个JE我们就来到了成功
最后的值为:32 73 38 33 67 72 33 6b 79 33 6b 77 33 68 64 71
当然,这里全是0x32 0x73 … 0x71
然后我们对照ASCLL码
0x32 2
0x73 s
…
0x71 q
最终密码:
三、Reverse002.exe
1.日常Ctrl+F9跟进来,随便输一个密码测试一下
2.来到我们的第一次跳转,根据后面的代码可以看出这里是一个判断跳转,后面的代码也可以看出区别,还是照常跟着JNZ走
(JNZ结果不为零(或不相等)则转移),说明这里第一个值与0x33不相等的时候才会跳转
3.现在我们来到了第一个属于密码的CMP对比的位置,还是按照上一题的方法,不断JE,找到CMP,直至成功提示
4.这里就来到了我们的成功提示的位置,这里也可以看出我们最后一位是0x71
至此我们得到的数字:33 31 31 73 39 68 34 36 38 67 32 72 41 36 4f 6b 59 79 78 36 71 6b 36 77 68 36 65 68 79 64 77 71
根据上一题,可以判断33是不属于密码的值的,真正的密码从31开始,71结束,故实际密码值为:31 31 73 39 68 34 36 38 67 32 72 41 36 4f 6b 59 79 78 36 71 6b 36 77 68 36 65 68 79 64 77 71
5.然后我们测试一下,发现当输入0x31 0x31 0x73 0x39…的值时,突然发现第二个0x31的位置不是我们之前的JE,而是JNZ,我们知道(JNZ结果不为零(或不相等)则转移),所以第二值得不为0x31才能正常跳转,之后我们继续测试后面得值
6.来到下一个值对比得位置,从这里大概能看出来了,咱们每一个正确的值还得通过JE后的CMP拿到,所以我们之前拿到的值按照这个方法进行第二次筛选
最终的值:31 73 68 36 67 72 36 6b 79 36 6b 77 36 68 64 71
我们继续对照ASCLL码,得到我们最后的密码
四、Reverse003.exe
1.日常Ctrl+F9跟进来,随便输一个密码测试一下
2.这里可以看到我们的JGE,所以这里是大于等于则跳过,可以看到这里是与7做比较,故应该大于7的情况跳过就不会触发下面的错误提示
3.跟着JGE来到了第一个属于密码的CMP对比的位置,还是之前的老方法。这里是JNZ,JNZ是结果不为零(或不相等)则转移,故这里如果匹配不上的话就会跳转到下面的错误提示,这里就没有JE了,我们接着往下看
4.接下来往下就找到了第二个做比较的数值,按照同样的思路不断往下找,直至找到成功提示
5.最后得到的结果是68 31 32 33 6A,对应ASCLL码就是h123j,密码是一个倒循环的数,在寻找值得过程中有一段是CMP EDX,ECX,这里相当于在判断该值得倒数第一位,由此可知,这里的第一位与最后一位相同,第二位与倒数第二位相同…,然后运行到第一个数字的CMP时发现ECX值为6A,所以发现到这里是从后往前对比的,所以这里应该是倒序的
6.最后测试密码h123jj321h,成功了
五、Reverse004.exe
1.日常Ctrl+F9跟进来,随便输一个密码测试一下
2.日常CMP …JE…拿到Name
3.继续往下单步走,看到EDX就是68,所以不管了,然后在下面找到密码的值
4.最后拿到的Name是68 38 67 32 79 77 ,也就是h8g2yw,密码是61 33 6F 72,就是a3or
六、Reverse005.exe
1.同上步骤,最后结果为Name:61 31 36 73 6c 65,为a16sle;Id:62 33 6f 72,为b3or
2.步骤如下:
七、Reverse006.exe
1.来到开始的地方,这次是key,TEST会判断eax是否为零
2.照常找值
3.后面的找值得方法有了一点点变化
4.这里其实我们已经找到所有的数值了61 31 36 73 6c 65 6a 77 66,对应
a16sle jwf
八、Reverse007.exe
1.点进去,找到他
2.找到Name的值:31 32 67 65 6c 34 ,即 12gel4
3.找ID的值,31 35 70 62
4.成功了
九、Reverse008.exe
1.第一步,跟进去
2.往下找到值,第一个数是31,第二个是35,最后Name是31 35 70 62
3.ID无关,ID长度小于7即可
在这里比较次数,直至EAX>64时跳出,和ID值无关
附1:
按钮点击处理函数特征码
mov ecx,dword ptr[ebp+8]
call dword ptr[ebp-8]
cmp esi,esp
1.MFCPj000.exe
按一下回车或者空格
或添加 | WS_VISIBLE ,点击确定按钮即可见
2.MFCPj001.exe
搜一下特征码,跟进去找,打个断点
先把窗口弹出来,点一下按钮,就会断在刚找到的call
然后F7进去,单步一个F8,来到015DB410的位置,在这里我们就可以往下看看每一个CALL了,这里正确的位置是我打了断点的015DB455这里这个CALL,跟进去看看
跟着JMP跳下来就找到我们的密码了,C 8 5
我们试一下密码,成功了
3.2.MFCPj002.exe
同样的步骤,找到特征码,打断点,F7跟进去,F8单步步过
找到第二个CALL,图上打了断点的位置,继续跟进去
这里需要注意,有些跳转是JE,有些跳转则是JNZ,JE是相等则跳转,如第一位密码,等于1则跳转;JNZ则是不相等跳转,如第二位密码,不等于1则跳转,故第二位密码应为0,下同,注意区别即可
最后我们找到九位密码为:101100101,然后我们测试一下,成功了
4.MFCPj003.exe
老方法,搜索特征码,打断点进去找到关键位置
0的地方按两次重新变为0,1的地方按一次
在上图中015EB512的CALL的位置打上断点,跟进去看看,一下就来到了开心愉快的地方,然后密码为011010101
测试一下,再次提醒:0的地方按两次重新变为0,1的地方按一次
他并不知道自己是0,点击一次变为1,再点击一次变为0时他才算完整的一次,这里他才知道自己是0了
5.开动脑筋.exe
…
附2:
1.CrackMe_01.exe
用户名为明文密码就不再赘述了
2.CrackMe_02.exe
随便测试一下,然后看下OD
单步时可以发现之前明明拿到了用户名,为什么后面变成0了呢,我们可以多打几个断点观察一下寄存器中的变化
这里可以看见我们输入的用户名111
实验可知,用户名长度与序列号位数有关,但是这里我们也可以发现序列号是不能超过8位的
序列号长度=用户名长度,序列号值均为0即可