既然菜了,就要努力啊,这是个必经的过程.不要气馁,我为自己打气.感谢看雪论坛给了个交流的平台,再次谢谢.今天又学分析一个简单的程序,我把整个过程详细地说出来,虽然简单,初学最忌小而不为.源程序由群上的朋友提供,下面我们开始,
1.照旧运行程序
好,没输入的时候会提示的.下来输入用户和密码,可是没反应,猜是要正确了就会对话框的
用peid检测一下,没壳,不知道什么语言编写.我们先来找没输入密码的提示框是在哪里运行的.用OD附加,标题上显示到ntDLL,让它回到软件的领空.在反汇编窗口,右键==>查看==>我这里选择的是"EE",好了,回到软件的领空了.
按住CTRL+N来看看导入了什么函数,来到这里
图2:
为messageboxa下断,右键==>在每个参考上设置断点,此时看到左下角状态栏的提示:"没有参考命令",也就是说我们没设成功断点啦.下来我摸索,用了这样的方法成功下了断.
1.在图2中的MessageBoxA按住ENTER键,查找输入函数参考,来到下面
2.回车,来到这里
3.右键==>选定"查找参考"==>选择"选定命令",来到这里
为前三个分别下断点,按住F2,成功了下了断就地址那栏地就成红色的了.呵~是不是下个断都觉得是大费周章啊,不要紧啦,开头难
切换到破解的程序,用户名与密码都留空,我们开始来捕捉弹出的提示框,单击"确定"按钮,被OD断下来了
0040112F 6A 1F PUSH 1F
00401131 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
00401134 50 PUSH EAX
00401135 68 EA030000 PUSH 3EA
0040113A FF75 08 PUSH DWORD PTR SS:[EBP+8]
0040113D E8 DC000000 CALL <JMP.&user32.GetDlgItemTextA>
00401142 0BC0 OR EAX,EAX
00401144 75 14 JNZ SHORT gg.0040115A
00401146 6A 00 PUSH 0
00401148 6A 00 PUSH 0
0040114A 68 00304000 PUSH gg.00403000
0040114F 6A 00 PUSH 0
00401151 E8 CE000000 CALL <JMP.&user32.MessageBoxA> ; 判断用户名为空
00401156 C9 LEAVE
00401157 C2 1000 RETN 10
0040115A 6A 1F PUSH 1F
0040115C 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
0040115F 50 PUSH EAX
00401160 68 EC030000 PUSH 3EC
00401165 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401168 E8 B1000000 CALL <JMP.&user32.GetDlgItemTextA>
0040116D 0BC0 OR EAX,EAX
0040116F 75 14 JNZ SHORT gg.00401185
00401171 6A 00 PUSH 0
00401173 6A 00 PUSH 0
00401175 68 00304000 PUSH gg.00403000
0040117A 6A 00 PUSH 0
0040117C E8 A3000000 CALL <JMP.&user32.MessageBoxA> ; 判断密码为空
00401181 C9 LEAVE
00401182 C2 1000 RETN 10
00401185 8D45 C0 LEA EAX,DWORD PTR SS:[EBP-40]
00401188 50 PUSH EAX
00401189 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
0040118C 50 PUSH EAX
0040118D E8 D8FEFFFF CALL gg.0040106A ; 此处比较可疑,把之前的断点全部禁掉,在这里按下断
下来再输入用户名及密码,分别是:TheUser,ThePassword来到这里
0040106A 55 PUSH EBP
0040106B 8BEC MOV EBP,ESP
0040106D 83C4 F8 ADD ESP,-8
00401070 FF75 08 PUSH DWORD PTR SS:[EBP+8]
00401073 E8 94010000 CALL <JMP.&kernel32.lstrlenA>
00401078 8BC8 MOV ECX,EAX
0040107A 83F9 06 CMP ECX,6
0040107D 75 7E JNZ SHORT gg.004010FD ; 用户名长度不等于6则完蛋
0040107F FF75 0C PUSH DWORD PTR SS:[EBP+C]
00401082 E8 85010000 CALL <JMP.&kernel32.lstrlenA>
00401087 8BC8 MOV ECX,EAX
00401089 83F9 06 CMP ECX,6 ; 密码长度不为6同样完蛋
0040108C 75 6F JNZ SHORT gg.004010FD
0040108E 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
00401091 B9 04000000 MOV ECX,4
00401096 33FF XOR EDI,EDI
00401098 8A06 MOV AL,BYTE PTR DS:[ESI]
0040109A 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
0040109D 32C3 XOR AL,BL
0040109F 3E:88443D F8 MOV BYTE PTR DS:[EBP+EDI-8],AL ; 每操作一次,将异或后的字符写入指定内存
004010A4 83C6 02 ADD ESI,2
004010A7 47 INC EDI
004010A8 ^ E2 EE LOOPD SHORT gg.00401098 ; 循环操作用户前四位字符,主要是异或,后总共生成四个字符
004010AA 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C]
004010AD B9 04000000 MOV ECX,4
004010B2 33FF XOR EDI,EDI
004010B4 8A06 MOV AL,BYTE PTR DS:[ESI]
004010B6 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
004010B9 32C3 XOR AL,BL
004010BB 3E:88443D FC MOV BYTE PTR DS:[EBP+EDI-4],AL ; 循环操作密码前四位字符,主要是异或,后总共生成四个字符
004010C0 83C6 02 ADD ESI,2
004010C3 47 INC EDI
004010C4 ^ E2 EE LOOPD SHORT gg.004010B4 ; 算法与用户名一样
004010C6 B9 03000000 MOV ECX,3
004010CB 33FF XOR EDI,EDI
004010CD 36:8A442F F8 MOV AL,BYTE PTR SS:[EDI+EBP-8]
004010D2 36:8A5C2F FC MOV BL,BYTE PTR SS:[EDI+EBP-4]
004010D7 32C3 XOR AL,BL ; 用户中得到的前三个,每个字符依次与密码中的每个字符进异或
004010D9 88442F F8 MOV BYTE PTR DS:[EDI+EBP-8],AL ; 存入异或的结果
004010DD 47 INC EDI
004010DE ^ E2 ED LOOPD SHORT gg.004010CD
004010E0 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004010E3 2D 0E151C00 SUB EAX,1C150E ; 异或后的结果的三个字若不等于1c150E则完蛋
004010E8 75 13 JNZ SHORT gg.004010FD
004010EA 6A 00 PUSH 0
004010EC 68 15304000 PUSH gg.00403015
004010F1 68 15304000 PUSH gg.00403015
004010F6 6A 00 PUSH 0
004010F8 E8 27010000 CALL <JMP.&user32.MessageBoxA> ; 弹出成功的地方
004010FD C9 LEAVE
004010FE C2 0800 RETN 8 ; 传说的中栈平衡
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)