📄 lesson504.htm
字号:
<br>
0167:004014F3 7E41
JLE 00401536
<br>
0167:004014F5 8D86E0000000 LEA
EAX,[ESI+000000E0]
<br>
0167:004014FB 8BCF
MOV ECX,EDI
<br>
0167:004014FD 50
PUSH EAX
<br>
0167:004014FE E841030000 CALL
00401844
<br>
0167:00401503 8DBEE4000000 LEA
EDI,[ESI+000000E4] <br>
0167:00401509 8BCD
MOV ECX,EBP
<br>
0167:0040150B 57
PUSH EDI
<br>
0167:0040150C E833030000 CALL
00401844
<br>
0167:00401511 8B07
MOV EAX,[EDI] //把,[EDI]的值作为地址传给EAX,此时D EAX可看到输入的序列号
<br>
0167:00401513 803836
CMP BYTE PTR [EAX],36//关键
<br>
0167:00401516 751E
JNZ 00401536// 跳到出错信息处
<br>
0167:00401518 80780132
CMP BYTE PTR [EAX+01],32 //关键
<br>
0167:0040151C 7518
JNZ 00401536
<br>
0167:0040151E 80780238
CMP BYTE PTR [EAX+02],38//关键
<br>
0167:00401522 7512
JNZ 00401536
<br>
0167:00401524 80780337
CMP BYTE PTR [EAX+03],37 //关键
<br>
0167:00401528 750C
JNZ 00401536
<br>
0167:0040152A 8078042D
CMP BYTE PTR [EAX+04],2D//关键
<br>
0167:0040152E 7506
JNZ 00401536
<br>
0167:00401530 80780541
CMP BYTE PTR [EAX+05],41//关键
<br>
0167:00401534 7417
JZ 0040154D
<br>
0167:00401536 6A00
PUSH 00
<br>
0167:00401538 6864304000 PUSH
00403064
<br>
0167:0040153D 6838304000 PUSH
00403038
<br>
0167:00401542 8BCE
MOV ECX,ESI
<br>
0167:00401544 E8F5020000 CALL
0040183E //出错的对话框<br>
0167:00401549 6A00
PUSH 00
<br>
0167:0040154B FFD3
CALL EBX
<br>
0167:0040154D 8D8EE0000000 LEA
ECX,[ESI+000000E0]
<br>
0167:00401553 8D542414
LEA EDX,[ESP+14]
<br>
<br>
上面看明白了吗? <br>
36(hex) = 6 <br>
32(hex) = 2 <br>
38(hex) = 8 <br>
37(hex) = 7 <br>
2D(hex) = - <br>
41(hex) = A <br>
所以序列号: 6287-A ,注意姓名必须 6 个字符以上,且和序列号无关。 </p>
</td>
</tr>
</table>
<span class="p9"> </span></div>
<div id="KB2Parent" class="parent"> <span class="p9"><a href="#" onClick="expandIt('KB2'); return false">
2、习题二答案</a> </span></div>
<div id="KB2Child" class="child"> <span class="p9"> </span>
<table width="100%" cellspacing="0" align="center">
<tr bgcolor="#EFEFEF">
<td>
<p class="p9">1、在Name:填入toye<br>
Serial:87654321(先乱填)</p>
<p class="p9">2、CTRL+D切入SOFTICE环境下;</p>
<p class="p9">3、下命令:<span class="p9">BPX HMEMCPY </span></p>
<p class="p9"><span class="p9">在Windows NT中:bpx memcpy不能拦断,可试试MessageBox(A)或Dialogbox(A)设断拦截对话框,一般都能拦截成功。<br>
注:在windows NT下类似命令是bpx memcpy,不过好象实用不大,拦不到什么。</span></p>
<p class="p9">4、按F5(或CTRL+D)回到windows环境,点击OK按钮;</p>
<p class="p9">5、SOFTICE拦截后,BD *(把断点暂时关闭,可用BE *恢复)(注意:BC *是清除断点);</p>
<p class="p9">6、按13下F12,跳出出错的对话框,因此重新一来遍:be *(恢复hmemcpy这个断点);</p>
<p class="p9">7、点击OK按钮将再次中断,此时一定要记住禁止断点:bc * </p>
<p class="p9">8、这次按12下F12,来到:(这时你要按F10,让指令一行行执行)</p>
<p class="p9"><span class="p9"><font color="#000000">0167:004417E7
8B83C4020000 MOV EAX,[EBX+000002C4]
<br>
0137:004417ED CALL 004231A4 <br>
0137:004417F2 MOV EAX,[EBP-0C] ←过了这一行,下命令D
EAX将看到你的姓名。 <br>
0137:004417F5 LEA EDX,[EBP-08] //也就是说要在这一行,下命令D EAX<br>
0137:004417F8 CALL 004416F8 ←此CALL就是根据姓名计算序列号
<br>
0137:004417FD MOV EDX,[EBP-08] ←将计算结果的地址放入EDX<br>
0137:00441800 POP EAX //也就是说要在这一行,下命令D EAX看到正确的序列号
<br>
0137:00441801 CALL 00403B44 <br>
0137:00441806 JNZ 00441822 ←此处如不跳转,则程序能跳过0441835的CALL,因此向上分析
<br>
0137:00441808 PUSH 00000040 <br>
0137:0044180A MOV ECX,0044186C <br>
0137:0044180F MOV EDX,00441878 <br>
0137:00441814 MOV EAX,[00442C30] <br>
0137:00441819 MOV EAX,[EAX] <br>
0137:0044181B CALL 0043EEF4 <br>
0137:00441820 JMP 0044183A ←这里可跳过下面的0137:00441835的CALL,再向上看看
<br>
0137:00441822 PUSH 00000010 <br>
0137:00441824 MOV ECX,00441884 <br>
0137:00441829 MOV EDX,0044188C <br>
0137:0044182E MOV EAX,[00442C30] <br>
0137:00441833 MOV EAX,[EAX] <br>
0137:00441835 CALL 0043EEF4
←过了这一行,将出现Wrong Code的出错框。因此向上 <br>
看看何处能跳过此CALL </font><br>
</span></p>
<p class="p9">10、姓名:toye<br>
序列号: 9074-04B7-F265-3F57</p>
</td>
</tr>
</table>
</div>
<div id="KB3Parent" class="parent"> <span class="p9"><a href="#" onClick="expandIt('KB3'); return false">
3、习题三答案</a> </span></div>
<div id="KB3Child" class="child"> <span class="p9"> </span>
<table width="100%" cellspacing="0" align="center">
<tr bgcolor="#EFEFEF">
<td>
<p><span class="p9">前面几个习题讲解很详细,下面的几个就把要点拎出</span></p>
<p><span class="p9"><span class="p9">你可用bpx hmemcpy设断,在你按OK会中断。如不中断,这时你在姓名加或减一字符,就会中断。按F10、F12来到:(按F12前记住要清除刚设的断点:BC
* )</span></span><span class="p9"><br>
:00401132 E841020000 CALL USER32!SendDlgItemMessageA 注意:函数SendDlgItemMessageA你可用它设断<br>
:00401132 E841020000 Call 00401378<br>
:00401137 A3AF214000 mov dword ptr [004021AF], eax (姓名长度)<br>
:0040113C 83F800 cmp eax, 00000000 (什么也没输入?)<br>
:0040113F 0F84D5000000 je 0040121A ->如什么没输入出错<br>
:00401145 83F808 cmp eax, 00000008 (name<=8?)<br>
:00401148 0F8FCC000000 jg 0040121A ->否则出错<br>
:0040114E 8BF0 mov esi, eax (将姓名长度放入esi)<br>
:00401150 6A00 push 00000000<br>
:00401152 6A00 push 00000000<br>
:00401154 6A0E push 0000000E<br>
:00401156 6A04 push 00000004<br>
:00401158 FF7508 push [ebp+08]<br>
:0040115B E818020000 Call 00401378 (取你输入的序列号)<br>
:00401160 83F800 cmp eax, 00000000 (什么也没输入?)<br>
:00401163 0F84B1000000 je 0040121A ->如什么没输入出错<br>
:00401169 3BF0 cmp esi, eax -> (name的长度=serial的长度?)<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -