破解练习-CRACKME001

打印 上一主题 下一主题

主题 651|帖子 651|积分 1953

001-注册算法分析

一、工具和调试环境


  • 动态调试工具:x64dbg
  • 系统环境:win10 1909
二、分析Serial/name的算法

由于Serial里面就是一个字符串比较,没有啥算法,这里就不详细说了,大概就是通过搜索字符串Failed,就能定位到关键位置,Serial直接可以在栈中观察到,为:Hello Dude!。所以我们主要分析Serial/name的注册算法。
直接使用提示字符串验证,得到错误提示如下

那么我们直接搜索字符串Sorry,得知有两个地方使用该字符串,都设置上断点,然后重新验证,成功断在0x0042F826处,先分析这个,另一个后面再说

断下之后向上定位到关键算法如下
  1. 0042FA87     | 8B45 F0                    | mov eax,dword ptr ss:[ebp-10]      | [ebp-10]:"Please enter your name !" ; 获取name首地址
  2. 0042FA8A     | 0FB600                     | movzx eax,byte ptr ds:[eax]        | ; eax = name[0] 取出name的第一个字符存放在eax中
  3. 0042FA8D     | F72D 50174300     | imul dword ptr ds:[431750]         | 00431750:L")"  ; ")" aiscii码为 0x29  eax = name[0] * 0x29
  4. 0042FA93     | A3 50174300       | mov dword ptr ds:[431750],eax      | ; key = name[0] * 0x29
  5. 0042FA98     | A1 50174300       | mov eax,dword ptr ds:[431750]      | ;
  6. 0042FA9D     | 0105 50174300     | add dword ptr ds:[431750],eax      |        ; key = name[0] * 0x29 * 2
复制代码
通过算法key = name[0] * 0x29 * 2算出key后,紧接着拼接得到Serial,格式为:CW-key-CRACKED
三、算法核心代码模拟
  1. char* GetSerial(char* szName)
  2. {
  3.         static char szSerial[60] = {};
  4.         if (strlen(szName) < 4)
  5.         {
  6.                 MessageBox(NULL, "Name至少需要4位", "温馨提示", MB_OK);
  7.                 return nullptr;
  8.         }
  9.         int key = szName[0] * 0x29 * 2;
  10.        
  11.         sprintf(szSerial, "CW-%d-CRACKED", key);
  12.         return szSerial;
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表