一个简单crackme破解及注册机编写

来源:互联网 发布:博罗政府网络问政 编辑:程序博客网 时间:2024/05/17 01:26

本文转载自FOR新手:一个简单crackme破解及注册机编写
首先运行软件查看情况。
这里写图片描述
查壳。
这里写图片描述
开始破解。
任务一:禁用Splash Screen
载入OD停在了入口处,然后搜索字符串。
这里写图片描述
这里写图片描述
上图中我们可以看到Splish,Splash和Splash_Class字符串,果断在第一个Splash_Class下断点。
这里写图片描述
F9运行程序,断在了4014DD处。
这里写图片描述
上图中我们可以看到断点上面有个LoadBitmapA调用,下面的两个API调用分别是CreateWindowExA和ShowWindow,这些看起来像是Splash Screen的显示代码。要让该窗口不显示的话,因为hWnd参数是要显示窗口的句柄,所以可以将PUSH DWORD PTR DS:[403211]改为PUSH 0,或者直接把ShowWindow函数直接改成nop。
这里写图片描述
要将改动保存到exe文件中,命名为Splish_noSplash.exe。
任务二:找到HardCoded序列号
前面可以看到点击check hardcoded按钮后,弹出的对话框中有句sorry,please try again,所以我们依然搜索字符串试试看。
这里写图片描述
下断点以后运行,输入yysniper。
这里写图片描述
点击Check Hardcoded按钮,不久程序停在了我们刚下的断点处。
这里写图片描述
我们看到在sorry,please try again上面就是祝贺找到硬编码的提示框代码。点击提示失败的代码的第一行也就是PUSH 0(如下图),看到左边有个红色箭头,说明是从301386跳转过来的。
这里写图片描述
分析从40136F到40138A的代码,可以看出程序是在对EAX和EBX中的内容进行逐个的比较,如果不同就跳转到提示失败的消息框处。在40137B处下断点,看看EAX和EBX中到底是什么。继续运行程序,再次点击Check Hardcoded按钮,程序停在断点处。
这里写图片描述
可以看到图片中红色箭头处,EAX中是HardCoded,EBX则是输入的yysniper。
这里写图片描述
任务三:对Name/Serial部分写注册机
先删除刚才下的所有断点。
这里写图片描述
在Name和Serial中随便输入内容,点击后同样弹出了sorry,please try again,可不可以通过搜索字符串然后下断呢?当然可以。不过这里换一个方法,右键CPU窗口,如下图。
这里写图片描述
点击Name (label)in current module Ctrl+N搜索当前模块中调用的API,弹出如下窗口。
这里写图片描述
看到GetWindowTextA函数,一般程序可以通过该函数获取到用户输入在文本框中的内容。对它下断点试试。这里不要再F2了,右击该函数然后选择Toggle breakpoint on import或者第二项Follow import in Disassembler后在CPU窗口中再F2。
这里写图片描述
断点窗口中我们可以看到,我们的断点下在了USER32模块中。
这里写图片描述
运行程序,窗口出现后在Name那填入yysniper,Serial那填入456987,点击Name/Serial Check按钮。
这里写图片描述
看窗口标题栏那个USER32,断点停在了系统领空,我们需要回到程序领空。
这里写图片描述
如果停在了箭头处,再按一下F7就行了。
这里写图片描述
回到程序领空后如下图。
这里写图片描述
注意上面的四个箭头,很明显两个GetWindowTextA,两个MessageBoxA。将CPU窗口往下拉,可以看到另外两个MessageBoxA,其中一个有成功的提示。
这里写图片描述
从GetWindowTextA一直到提示成功的汇编代码没有其他的call,说明输入的name和serial是在这些汇编代码中进行处理的,在提示成功的上面可以明显的看出是一个按字节进行比较判断跳转的代码。继续刚才的断点,程序停在了第一个GetWindowTextA的后面。GetWindowTextA上面有个Buffer,输入的内容就在这个Buffer中,也就是403242这个地址中。同样,输入的name在403236这个地址中。
这里写图片描述
下面分析第二个GetWindowTextA到提示please enter your name的消息框中的汇编代码。正是这些代码对我们输入的name和serial进行操作,算出正确的序列号。处理后的name和serial分别存放在403258和40324D中,再回头看看提示成功的消息框前面的代码。
这里写图片描述
上面的代码中两个地址存放的正是处理后的name和serial,然后对两个处理后的数据进行比较,如果相同则提示成功。用Python写的注册机如下。

#coding=utf8  def procname(strname):      """     对用户输入的name进行处理,得到中间码     """      ecx=0      ebx=0      edx=0      esi=strname      edi=""      ecx=10      for i in esi:          eax=i          edx=ord(eax) % ecx          edx=edx^ebx          edx=edx+2          if edx<10:              edi=edi+str(edx)          else:              edi=edi+str(edx-10)          ebx=ebx+1      return edi  def procserial(strserial):      """     对用户输入的serial进行处理,得到中间码,这里只是给出程序作者的处理代码,其实注册机用不到这段代码     """      ecx=0      ebx=0      edx=0      esi=strserial      edi=""      ecx=10      for i in esi:          eax=i          edx=ord(eax) % ecx          edi=edi+str(edx)  def keygen(strmidcode):      realserial=""      for i in strmidcode:          realserial=realserial+chr(int(i)+70)      return realserial  #看看yysniper的对应serial是多少  print(keygen(procname("yysniper")))  
0 0
原创粉丝点击