Twist1逆向分析

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值