一个简单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")))
- 一个简单crackme破解及注册机编写
- 破解的一个crackme,附注册机
- 一个简单crackme破解及去除暗桩
- 一个简单CrackMe分析+keyGen编写
- 西电第四届网络攻防竞赛Crackme破解第四关分析及注册机
- 一个简单的crackme,程序是由.Net编写的
- TraceMe.exe注册码破解及注册机编写
- CrackMe破解【3】- 简单级别
- CrackMe 破解能力测试等级2的注册代码定位及爆破
- 一个Crackme的简单Code
- 一个简单的CrackMe分析
- 一个简单的CrackMe分析
- 庖丁解牛破解与注册机编写
- 逆向CrackMe-01写注册机
- 逆向CrackMe-02写注册机
- 逆向CrackMe-03写注册机
- 一个简单的linux crackme的逆向
- 一个简单的linux crackme的逆向
- 2017/2/21 学习html的第五天
- ExtJs Window解决内部组件双重边框问题
- 元数据 and 元数据标准
- 杂七杂八JS :使用this对象
- IPC机制<一>
- 一个简单crackme破解及注册机编写
- synchronized
- sql语句优化
- Gradle 修改本地仓库的位置
- javaScript、css实现toast
- 2017/2/22 学习css的第一天
- mysql处理高并发,防止库存超卖
- ssm 框架整合
- 设计模式6大规则