第一次尝试Crack(逆向异或算法)
来源:互联网 发布:程序员的心理疾病 编辑:程序博客网 时间:2024/05/23 14:30
【详细过程】
用peid查壳,无壳,运行,收集足够信息用OD载入,通过bp GetDlgItemTextA下断点,断点在USER32领空下,
从堆栈区Follow in Disassembler找到 call 调用函数地址为[004010B0],果断F7跟进
004010B0 |. E8 14000000 CALL crackme.004010C9004010B5 |> EB 09 JMP SHORT crackme.004010C0004010B7 |> B8 00000000 MOV EAX,0004010BC |. C9 LEAVE004010BD |. C2 1000 RET 10004010C0 |> B8 01000000 MOV EAX,1004010C5 |. C9 LEAVE004010C6 /. C2 1000 RET 10004010C9 /$ 56 PUSH ESI004010CA |. 57 PUSH EDI004010CB |. 51 PUSH ECX004010CC |. 33F6 XOR ESI,ESI004010CE |. 33FF XOR EDI,EDI004010D0 |. B9 08000000 MOV ECX,8 ;定义循环次数004010D5 |. BE 44304000 MOV ESI,crackme.00403044 ;载入输入的密码004010DA |> 8036 32 /XOR BYTE PTR DS:[ESI],32 ;各个位进行与32的异或004010DD |. 46 |INC ESI ;esi递增004010DE |.^ E2 FA /LOOPD SHORT crackme.004010DA ;loop循环004010E0 |. BE 44304000 MOV ESI,crackme.00403044 ;下面是把变化后的密码前后取异或004010E5 |. B9 04000000 MOV ECX,4 ;8变4004010EA |> 8A06 /MOV AL,BYTE PTR DS:[ESI] 004010EC |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1] 004010EF |. 32C3 |XOR AL,BL ;将异或后的esi寄存器内容再次进行4次异或004010F1 |. 8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL ;将起始结果存入地址[0040304c]004010F7 |. 83C6 02 |ADD ESI,2 ;esi递增2004010FA |. 47 |INC EDI ;edi递增004010FB |.^ E2 ED /LOOPD SHORT crackme.004010EA ;loop循环004010FD |. BE 4C304000 MOV ESI,crackme.0040304C ;下面再次把变化后的四位进行前后异或00401102 |. 8A06 MOV AL,BYTE PTR DS:[ESI] 00401104 |. 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]00401107 |. 32C3 XOR AL,BL ;再次异或取值4位变2位00401109 |. 8A5E 02 MOV BL,BYTE PTR DS:[ESI+2]0040110C |. 8A4E 03 MOV CL,BYTE PTR DS:[ESI+3]0040110F |. 32D9 XOR BL,CL00401111 |. 32C3 XOR AL,BL ;再次异或取值2位变成1位00401113 |. B9 08000000 MOV ECX,8 ;定义循环次数00401118 |. BE 44304000 MOV ESI,crackme.00403044 ;将用户输入值存放在esi寄存器0040111D |> 3006 /XOR BYTE PTR DS:[ESI],AL ;然后再同上面异或过32的8个数异或0040111F |. 46 |INC ESI ;esi递增00401120 |.^ E2 FB /LOOPD SHORT crackme.0040111D ;loop循环00401122 |. B9 08000000 MOV ECX,8 ;下面是比较00401127 |. BE 44304000 MOV ESI,crackme.00403044 ;将用户输入值存放在esi0040112C |. BF 08304000 MOV EDI,crackme.00403008 ;将00403008处的值存放在edi(密码)00401131 |> 8A06 /MOV AL,BYTE PTR DS:[ESI] ;将00401133 |. 3A07 |CMP AL,BYTE PTR DS:[EDI] ;将用户输入与原密码逐位对比00401135 |. 75 1D |JNZ SHORT crackme.00401154 ;不对就跳转至sorry(爆破点!!!)00401137 |. 46 |INC ESI ;esi递增00401138 |. 47 |INC EDI ;edi递增00401139 |.^ E2 F6 /LOOPD SHORT crackme.00401131 ;loop循环0040113B |. 6A 40 PUSH 40 0040113D |. 68 35304000 PUSH crackme.00403035 ; |Title = "Crackme 1.0"00401142 |. 68 10304000 PUSH crackme.00403010 ; |Text = "Good Work Cracker"00401147 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = NULL0040114D |. E8 3C000000 CALL ; /MessageBoxA00401152 |. EB 17 JMP SHORT crackme.0040116B00401154 |> 6A 30 PUSH 30 00401156 |. 68 35304000 PUSH crackme.00403035 ; |Title = "Crackme 1.0"0040115B |. 68 22304000 PUSH crackme.00403022 ; |Text = "Bad Serial, Sorry!"00401160 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = NULL00401166 |. E8 23000000 CALL ; /MessageBoxA0040116B |> 5F POP EDI0040116C |. 5E POP ESI0040116D |. 59 POP ECX0040116E /. C3 RET
【算法解密】
如果输入12345678
机器码 31 32 33 34 35 36 37 38
与32异或 03 00 01 06 07 04 05 0A —-(1)
8变4为 03 07 03 0F
4变2为 04 0C
2变1为 08 —-(2)
(1)与08取异或 0B 08 09 0E 0F 0C 0D 02
00403008 内正确的为 71 18 59 1B 79 42 45 4C
根据正确反推注册码: (关键是如何计算(2))
由算法可知(2)是由机器码反复取异或得到,其实由它的正确的密码重复这一算法也可求的(2),实验得出。缺少证明。
机器码 71 18 59 1B 79 42 45 4C
8变4为 69 42 3B 09
4变2为 2B 32
2变1为 19 —-正确的密码的(2)值应为19
接着反推正确的注册码:
机器码 71 18 59 1B 79 42 45 4C
与19取异或 68 01 40 02 60 5B 5C 55
与32取异或 5A 33 72 30 52 69 6E 67
查表得正确的注册码为: Z 3 r 0 R i n g (Z3r0Ring)
- 第一次尝试Crack(逆向异或算法)
- 第一次crack
- 第二次尝试CRACK...
- Crack Me逆向练习
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次尝试
- 第一次 CRACK ME,试手试手~
- 逆向研究Crack Me No.1
- reverse kr easy crack 逆向 write up
- 第一次尝试BLOG!
- Appfuse第一次尝试
- C++类第一次尝试
- 所以收效很微小
- 【简单常用】NSDictionary
- C++实现查找字符串中的数字,并输出
- A. Crazy Town
- 数学技巧 ZigZag Conversion
- 第一次尝试Crack(逆向异或算法)
- 迫不及待的想要分享一个神器Codota
- oc初始化方法,便利构造器
- Linux中nginx
- PHP5 non-thread-safe和thread-safe的区别
- 判断是否允许使用相机
- Android 深入理解Android中的自定义属性
- Java之美[从菜鸟到高手演变]之设计模式四
- Java8 Collection接口源码阅读(二)