Reversing.kr上的一个逆向题目…
这个程序有Anti,我用的吾爱破解修改版OD,稍微配置下就可以无视反调试了。程序也加了壳,可以无视…
载入后直接运行,然后搜索字符串,可以看到有“Correct”,"Wrong"等,跟过去,可以看见在上边有个比较,可以确定上边的那个CALL就是算法CALL了…
在这个CALL下一个端点,随便输入一个假码,我这而输入"zhighest",回车后断下,然后跟进这个CALL
然后下边就是一些反调试的东西了,如果没有过反调试的插件,可以看我的图,手动修改跳转的实现…
在00407486处有一段代码
00407486 . 33DB xor ebx,ebx
00407488 . 8A1D 91B94000 mov bl,byte ptr ds:[0x40B991] ; 取输入字符串的第7位,简单运算后存入[0x40C450]
0040748E . 80F3 36 xor bl,0x36
00407491 . 881D 50C44000 mov byte ptr ds:[0x40C450],bl
然后00407600在这儿有一处验证…
00407600 . 803D 50C44000>cmp byte ptr ds:[0x40C450],0x36 ; 取出第七位的计算结果
00407607 . 0F85 F8020000 jnz Twist1.00407905 ; 只有第7位为0时才不跳转,所以可以确定密码为6位
慢慢跟,就到0040760F了…密码验证正式开始!
遇到CALL一定要跟进去,不要步过…跟进0040762B这个CALL,发现是乱码,“从模块中删除分析”即可…
密码验证是一位一位验证的,代码也不连续,大跳很多,为了方便阅读,我把每位的验证代码放在一起…
第一位
0040760F A0 90B94000 mov al,byte ptr ds:[0x40B990] ; 取第一位
0040762D C0C8 06 ror al,0x6 ; 第一位计算
00407630 A2 00B04000 mov byte ptr ds:[0x40B000],al ; 保存第一位计算结果
00407700 8A0D 00B04000 mov cl,byte ptr ds:[0x40B000] ; 取出第一位计算结果,放入cl
004076D0 80F9 49 cmp cl,0x49 ; cl为第一位计算结果,与0x49比较,不等则失败
004076D3 0F85 2C020000 jnz Twist1.00407905 ; 由此可逆推出第一位为'R'
第三位
00407783 A0 E0CC4000 mov al,byte ptr ds:[0x40CCE0] ; 取出第三位
00407788 34 77 xor al,0x77 ; 第三位计算
004077A3 3C 35 cmp al,0x35 ; 与第三位计算结果比较
004077A5 75 59 jnz XTwist1.00407800 ; 由此可计算出第三位为'B'
第二位
0040780C 8B0D 80CD4000 mov ecx,dword ptr ds:[0x40CD80] ; 取出第二位
004077AC 80F1 20 xor cl,0x20 ; 第二位计算
004077C5 80F9 69 cmp cl,0x69 ; 与第二位计算结果比较
004077C8 ^ 75 F0 jnz XTwist1.004077BA ; 计算出第二位为'I'
又是第一位
004077EC 8A15 E8CC4000 mov dl,byte ptr ds:[0x40CCE8] ; 又是取第一位
00407814 80F2 10 xor dl,0x10 ; 取出的第一位,计算
00407817 80FA 43 cmp dl,0x43 ; 这是一个坑,因为第一位已计算出来了,是'R'
0040781A 75 08 jnz XTwist1.00407824 ; 所以此处不用理会
第六位
0040778C 8A0D E4CC4000 mov cl,byte ptr ds:[0x40CCE4] ; 取第六位
00407792 880D F4CF4000 mov byte ptr ds:[0x40CFF4],cl ; 这儿只是取出第六位并保存,验证第六位是在最后
//最后才计算
004078A6 C005 F4CF4000 0>rol byte ptr ds:[0x40CFF4],0x4 ; 第六位计算
00407F77 8A15 F4CF4000 mov dl,byte ptr ds:[0x40CFF4] ; 第六位计算结果
00407F7D C605 777F4000 F>mov byte ptr ds:[0x407F77],0xFD
00407F84 80FA 14 cmp dl,0x14 ; 比较,由此计算出第第六位,为'A'
00407F87 75 36 jnz XTwist1.00407FBF
取第四位
0040790E 8A15 01C44000 mov dl,byte ptr ds:[0x40C401] ; 第四位
00407914 80F2 21 xor dl,0x21
00407918 80FA 64 cmp dl,0x64 ; 第四位计算结果比较
0040791B 0F84 AD040000 je Twist1.00407DCE ; 计算出第四位必为E
第五位
00407DCE 8A15 30CD4000 mov dl,byte ptr ds:[0x40CD30] ; 取出第五位
00407E02 80F2 46 xor dl,0x46 ; 第五位计算
00407E1A 3C 08 cmp al,0x8 ; 第五位计算结果比较
00407E1C 75 02 jnz XTwist1.00407E20 ; 计算出第五位为N
最后的密码为:REBNEA