﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-O型-随笔分类-C/C#</title><link>http://www.cppblog.com/oxft/category/10309.html</link><description>饭桶</description><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2009 15:41:26 GMT</lastBuildDate><pubDate>Mon, 20 Apr 2009 15:41:26 GMT</pubDate><ttl>60</ttl><item><title>简单keygen制作[原创]</title><link>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html</link><dc:creator>O型饭桶</dc:creator><author>O型饭桶</author><pubDate>Mon, 20 Apr 2009 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html</guid><wfw:comment>http://www.cppblog.com/oxft/comments/80574.html</wfw:comment><comments>http://www.cppblog.com/oxft/archive/2009/04/20/80574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/oxft/comments/commentRss/80574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/oxft/services/trackbacks/80574.html</trackback:ping><description><![CDATA[举个简单的例子说明下，以下就是软件的注册码关键代码，根据其生成注册码的函数，分析其思路，写出相应的程序生成注册码即可。<br><br>004011AE . 6A 51 PUSH 51 ; /Count = 51 (81.)<br>004011B0 . 50 PUSH EAX ; |Buffer<br>004011B1 . 6A 6E PUSH 6E ; |ControlID = 6E (110.)<br>004011B3 . 56 PUSH ESI ; |hWnd<br>004011B4 . FFD7 CALL EDI ; \GetDlgItemTextA<br>004011B6 . 8D8C24 9C0000&gt;LEA ECX,DWORD PTR SS:[ESP+9C]<br>004011BD . 6A 65 PUSH 65 ; /Count = 65 (101.)<br>004011BF . 51 PUSH ECX ; |Buffer<br>004011C0 . 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)<br>004011C5 . 56 PUSH ESI ; |hWnd<br>004011C6 . 8BD8 MOV EBX,EAX ; |EBX存放用户名的长度<br>004011C8 . FFD7 CALL EDI ; \GetDlgItemTextA<br>004011CA . 8A4424 4C MOV AL,BYTE PTR SS:[ESP+4C]<br>004011CE . 84C0 TEST AL,AL ; 是否结束<br>004011D0 . 74 76 JE SHORT TraceMe.00401248<br>004011D2 . 83FB 05 CMP EBX,5<br>004011D5 . 7C 71 JL SHORT TraceMe.00401248 ; 如果用户名长度小于5，跳<br>004011D7 . 8D5424 4C LEA EDX,DWORD PTR SS:[ESP+4C] ; EDX指向用户名<br>004011DB . 53 PUSH EBX ; 用户名长度<br>004011DC . 8D8424 A00000&gt;LEA EAX,DWORD PTR SS:[ESP+A0]<br>004011E3 . 52 PUSH EDX ; 用户名<br>004011E4 . 50 PUSH EAX ; key<br>004011E5 . E8 56010000 CALL TraceMe.00401340 ; 判断注册码是否正确，有三个参数[输入key，用户名，用户名长度]<br>&nbsp;<br>思路：<br>从用户名的第4个字符开始分别与全局的一个长度为7的标识相乘最后和就为key<br>--注册码部分--<br>00401340 /$ 55 PUSH EBP ; 保存EBP<br>00401341 |. 8B6C24 0C MOV EBP,DWORD PTR SS:[ESP+C] ; 获取第2个参数，用户名<br>00401345 |. 56 PUSH ESI ; 保护ESI,EDI<br>00401346 |. 57 PUSH EDI<br>00401347 |. 8B7C24 18 MOV EDI,DWORD PTR SS:[ESP+18] ; 取第一个参数，用户名长度<br>0040134B |. B9 03000000 MOV ECX,3<br>00401350 |. 33F6 XOR ESI,ESI<br>00401352 |. 33C0 XOR EAX,EAX<br>00401354 |. 3BF9 CMP EDI,ECX<br>00401356 |. 7E 21 JLE SHORT TraceMe.00401379 ; 如果用户名长度小于等于3，跳<br>00401358 |. 53 PUSH EBX<br>00401359 |&gt; 83F8 07 /CMP EAX,7<br>0040135C |. 7E 02 |JLE SHORT TraceMe.00401360 ; 如果EAX小于等于7，跳<br>0040135E |. 33C0 |XOR EAX,EAX<br>00401360 |&gt; 33D2 |XOR EDX,EDX<br>00401362 |. 33DB |XOR EBX,EBX<br>00401364 |. 8A1429 |MOV DL,BYTE PTR DS:[ECX+EBP] ; DL存放从用户名中取出的第ECX字符<br>00401367 |. 8A98 30504000 |MOV BL,BYTE PTR DS:[EAX+405030] ; BL存放某个全局变量<br>0040136D |. 0FAFD3 |IMUL EDX,EBX ; 某个用户名&#215;全局变量C<br>00401370 |. 03F2 |ADD ESI,EDX ; ESI似乎是这些值的统计<br>00401372 |. 41 |INC ECX<br>00401373 |. 40 |INC EAX<br>00401374 |. 3BCF |CMP ECX,EDI ; 如果ECX小于用户名的长度则继续循环<br>00401376 |.^ 7C E1 \JL SHORT TraceMe.00401359<br>00401378 |. 5B POP EBX ; 还原EBX，不需要使用了<br>00401379 |&gt; 56 PUSH ESI ; /&lt;%ld&gt;<br>0040137A |. 68 78504000 PUSH TraceMe.00405078 ; |Format = "%ld"<br>0040137F |. 55 PUSH EBP ; |s<br>00401380 |. FF15 9C404000 CALL DWORD PTR DS:[&lt;&amp;USER32.wsprintfA&gt;] ; \wsprintfA<br>00401386 |. 8B4424 1C MOV EAX,DWORD PTR SS:[ESP+1C]<br>0040138A |. 83C4 0C ADD ESP,0C ; C调用方式<br>0040138D |. 55 PUSH EBP ; /String2<br>0040138E |. 50 PUSH EAX ; |String1<br>0040138F |. FF15 04404000 CALL DWORD PTR DS:[&lt;&amp;KERNEL32.lstrcmpA&gt;] ; \lstrcmpA<br>00401395 |. F7D8 NEG EAX<br>00401397 |. 1BC0 SBB EAX,EAX<br>00401399 |. 5F POP EDI<br>0040139A |. 5E POP ESI<br>0040139B |. 40 INC EAX<br>0040139C |. 5D POP EBP<br>0040139D \. C3 RETN<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;GetKey(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;userName,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;userNameLength)<br>{<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;ecx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sum&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;eax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;flag&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0x0C</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0A</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x13</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x09</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0C</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0B</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x0A</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0x08</span><span style="color: #000000;">};<br></span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(ecx&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;userNameLength)<br>{<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(eax&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;flag.Length)<br>eax&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;eax&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;flag.Length;<br>sum&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;userName[ecx]&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;flag[eax];<br>ecx</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>eax</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;sum.ToString();<br>}</span></div>
<br><img src ="http://www.cppblog.com/oxft/aggbug/80574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/oxft/" target="_blank">O型饭桶</a> 2009-04-20 22:17 <a href="http://www.cppblog.com/oxft/archive/2009/04/20/80574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>