复健小CM
系统 : Windows xp
程序 : Keygenme # 2
程序下载地址 :http://pan.baidu.com/s/1qYIk2HQ
要求 : 注册机编写
使用工具 : OD
可在“PEDIY CrackMe 2007”中查找关于此程序的讨论,标题为“一个据说是新手级Crackme的分析”。
运行程序,查找字符串定位关键算法位置。大致的看一下程序主体:
004014AF |. C74424 CE0>mov dword ptr [esp+], 004400CE ; enter user-name: enter user-id: enter password: access granted !
004014B7 |. C70424 C03344>mov dword ptr [esp], 004433C0
004014BE |. E8 95AE0300 call 0043C358
004014C3 |. C74424 28B>mov dword ptr [esp+], 0043B128
004014CB |. mov dword ptr [esp], eax
004014CE |. E8 DD8D0200 call 0042A2B0
004014D3 |. C74424 CF0>mov dword ptr [esp+], 004400CF ; enter user-name: enter user-id: enter password: access granted !
004014DB |. C70424 C03344>mov dword ptr [esp], 004433C0
004014E2 |. E8 71AE0300 call 0043C358
004014E7 |. 8D85 F8FEFFFF lea eax, dword ptr [ebp-] ; |
004014ED |. mov dword ptr [esp], eax ; |
004014F0 |. E8 8BF40000 call <jmp.&msvcrt.gets> ; \gets
004014F5 |. 80BD F8FEFFFF>cmp byte ptr [ebp-], ; 是否为空?
004014FC |. 0F84 A8010000 je 004016AA ; 是则失败
|. C74424 E10>mov dword ptr [esp+], 004400E1 ; enter user-id: enter password: access granted !
0040150A |. C70424 C03344>mov dword ptr [esp], 004433C0
|. E8 42AE0300 call 0043C358
|. 8D85 DCFEFFFF lea eax, dword ptr [ebp-]
0040151C |. mov dword ptr [esp+], eax
|. C70424 >mov dword ptr [esp],
|. E8 C4720200 call 004287F0 ; 读入id的子程序
0040152C |. C785 D8FEFFFF>mov dword ptr [ebp-], ; 循环变量初始化
|> 8D85 F8FEFFFF /lea eax, dword ptr [ebp-] ; |
0040153C |. |mov dword ptr [esp], eax ; |
0040153F |. E8 2CF40000 |call <jmp.&msvcrt.strlen> ; \strlen
|. 3B85 D8FEFFFF |cmp eax, dword ptr [ebp-] ; 长度低于等于 循环变量
0040154A |. 5B |jbe short 004015A7 ; 则跳出循环
0040154C |. 8D45 F8 |lea eax, dword ptr [ebp-]
0040154F |. D8FEFFFF |add eax, dword ptr [ebp-] ; 地址 加上 循环变量
|. 2D |sub eax, ; 还原成User-Name
0040155A |. 0FBE00 |movsx eax, byte ptr [eax] ; 扩展载入到eax
0040155D |. F4FEFFFF |mov dword ptr [ebp-10C], eax
|. 8D85 F4FEFFFF |lea eax, dword ptr [ebp-10C]
|. 656C2A03 |add dword ptr [eax], 32A6C65 ; 保存的值加上一个 固定数值
0040156F |. 8B85 DCFEFFFF |mov eax, dword ptr [ebp-] ; 读入的id
|. 0FAF85 DCFEFF>|imul eax, dword ptr [ebp-]
0040157C |. 01C0 |add eax, eax
0040157E |. F4FEFFFF |add eax, dword ptr [ebp-10C] ; 加上之前保存的值
|. 237AD602 |add eax, 2D67A23 ; 再加
|. F4FEFFFF |mov dword ptr [ebp-10C], eax
0040158F |. 8B95 F4FEFFFF |mov edx, dword ptr [ebp-10C] ; 存入edx
|. 8D85 F0FEFFFF |lea eax, dword ptr [ebp-]
0040159B |. |add dword ptr [eax], edx
0040159D |. 8D85 D8FEFFFF |lea eax, dword ptr [ebp-]
004015A3 |. FF00 |inc dword ptr [eax] ; 循环变量自增
004015A5 |.^ EB 8F \jmp short
004015A7 |> C74424 F10>mov dword ptr [esp+], 004400F1 ; enter password: access granted !
004015AF |. C70424 C03344>mov dword ptr [esp], 004433C0
004015B6 |. E8 9DAD0300 call 0043C358
004015BB |. 8D85 E8FEFFFF lea eax, dword ptr [ebp-]
004015C1 |. mov dword ptr [esp+], eax
004015C5 |. C70424 >mov dword ptr [esp],
004015CC |. E8 1F720200 call 004287F0
004015D1 |. C74424 CE0>mov dword ptr [esp+], 004400CE ; enter user-name: enter user-id: enter password: access granted !
004015D9 |. C70424 C03344>mov dword ptr [esp], 004433C0
004015E0 |. E8 73AD0300 call 0043C358
004015E5 |. C74424 28B>mov dword ptr [esp+], 0043B128
004015ED |. mov dword ptr [esp], eax
004015F0 |. E8 BB8C0200 call 0042A2B0
004015F5 |. 8B85 F0FEFFFF mov eax, dword ptr [ebp-]
004015FB |. 3B85 E8FEFFFF cmp eax, dword ptr [ebp-]
3A jnz short 0040163D
|. C74424 >mov dword ptr [esp+], ; access granted !
0040160B |. C70424 C03344>mov dword ptr [esp], 004433C0
|. E8 41AD0300 call 0043C358
|. C74424 28B>mov dword ptr [esp+], 0043B128
0040161F |. mov dword ptr [esp], eax
|. E8 898C0200 call 0042A2B0
|. C74424 >mov dword ptr [esp+], ; you did it cracker...now make a keygen !access denied !press any key to continue...access violation !
0040162F |. C70424 C03344>mov dword ptr [esp], 004433C0
|. E8 1DAD0300 call 0043C358
0040163B |. EB 5C jmp short
0040163D |> C74424 3D0>mov dword ptr [esp+], 0044013D ; access denied !press any key to continue...access violation !
一个比较典型的二元函数加密的例子,算法也很简单。唯一的难点是不能对存放id的地址下内存断点,一旦这样操作就会导致读取失败,不过用硬件断点可以很方便地解决问题。
打开http://www.cnblogs.com/ZRBYYXDM/p/5115596.html中搭建的框架,加入新的ID文本编辑框控件,并在消息响应函数中加上解密代码:
void CKengen_TemplateDlg::OnBtnDecrypt()
{
// TODO: Add your control notification handler code here
CString str,ID;
GetDlgItemText( IDC_EDIT_NAME,str ); //获取用户名字串基本信息。
GetDlgItemText( IDC_EDIT_ID,ID ); if ( str.GetLength() && ID.GetLength() ){ //格式控制。
int IDnum = atoi( ID );
DWORD Res = ,Sum = ;
for ( int i = ; i != str.GetLength() ; i++ ){
Sum = IDnum * IDnum;
Sum += Sum;
Sum += ( str.GetAt(i) + 0x32A6C65 );
Sum += 0x2D67A23;
Res += Sum;
} CString PassWord;
PassWord.Format( "%d",Res );
SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
}
else
MessageBox( "用户名格式错误!" );
}
继续完善一下拷贝按钮:
void CKengen_TemplateDlg::OnBtnCopy()
{
// TODO: Add your control notification handler code here
CString cmd;
GetDlgItemText( IDC_BTN_COPY,cmd ); if ( OpenClipboard() ){ //打开剪贴板
CString str;
HANDLE hClip;
char *pBuf; EmptyClipboard(); if ( cmd == "拷贝用户名" ) //如果命令是拷贝用户名
GetDlgItemText( IDC_EDIT_NAME,str );
else{
if ( cmd == "拷贝ID" )
GetDlgItemText( IDC_EDIT_ID,str );
else
GetDlgItemText( IDC_EDIT_PASSWORD,str );
} hClip = GlobalAlloc( GMEM_MOVEABLE,str.GetLength() + );
pBuf = (char*)GlobalLock( hClip );
strcpy( pBuf,str );
GlobalUnlock( hClip );
SetClipboardData( CF_TEXT,hClip );
CloseClipboard(); if ( cmd == "拷贝用户名" ){ //变换命令
SetDlgItemText( IDC_BTN_COPY,"拷贝ID" );
SetDlgItemText( IDC_STC_MSG,"拷贝用户名成功!" ); //提示成功
}
else{
if ( cmd == "拷贝ID" ){
SetDlgItemText( IDC_BTN_COPY,"拷贝序列号" );
SetDlgItemText( IDC_STC_MSG,"拷贝ID成功!" );
}
else{
SetDlgItemText( IDC_BTN_COPY,"拷贝用户名" );
SetDlgItemText( IDC_STC_MSG,"拷贝序列号成功!" );
}
}
}
else
SetDlgItemText( IDC_STC_MSG,"拷贝失败!" );
}
再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("CRACKME_Keygen"));
运行效果:

复健小CM的更多相关文章
- 2019NOIP算法复健+学习
前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...
- 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击
题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...
- 并不对劲的复健训练-bzoj5249:loj2472:p4364[2018多省联考]IIIDX
题目大意 给出\(n,k,d_1,...,d_n\)(\(n\leq 5\times 10^5,1<k\leq 10^9,d\leq 10^9,k\in R\)).有一个满足 对于每个点\(i\ ...
- 并不对劲的复健训练-p3674
题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...
- (25+4/25+4)复健-KMP/EKMP/manache/Trie
(29/29) 3.23已完成 1.KMP int Next[maxn]; void prekmp(char* x,int len){ ,suf=; Next[]=-; while(suf<l ...
- 【Java复健指南09】项目练习全解--房屋出租系统
一个基于文本界面的综合练习,主要用于串联和回忆知识点,比较简单 各个界面的设计样式 主菜单 =============房屋出租系统菜单============ 1 新 增 房 源 2 查 找 房 屋 ...
- 并不对劲的复健训练-CF1187D
题目大意 有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) ).一次操作是选取 \([l,r]\ ...
- 并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎
题目大意 题目链接 题解 先将\(a\)排序. \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上:而当\(a_m= ...
- 并不对劲的复健训练-CF1205B Shortest Cycle
题目大意 有\(n\)(\(n\leq 10^5\))个数\(a_1,...,a_n\)(\(a\leq 10^{18}\)).有一个图用这个方法生成:若\(a_i\)按位与\(a_j\)不为0,则在 ...
随机推荐
- 2x2矩阵相乘模版
由于Unity只有4x4矩阵,今天要做一个2x2矩阵的旋转,居然忘了顺序.故写下作为模版记录. 顺序: 下面是使用其进行旋转的C#代码: public struct Position { public ...
- [问题2014A01] 解答一(第一列拆分法,由张钧瑞同学提供)
[问题2014A01] 解答一(第一列拆分法,由张钧瑞同学提供) (1) 当 \(a=0\) 时,这是高代书复习题一第 33 题,可用升阶法和 Vander Monde 行列式来求解,其结果为 \[ ...
- 《BI那点儿事》SQL Server 2008体系架构
Microsoft SQL Server是一个提供了联机事务处理.数据仓库.电子商务应用的数据库和数据分析的平台.体系架构是描述系统组成要素和要素之间关系的方式.Microsoft SQL Serve ...
- iOS - Xcode 配置
1.Xcode 配置 1.1 OS X 1)main 文件注释修改路径: /Applications(应用程序) ▸ Xcode.app ▸ Contents ▸ Developer ▸ Librar ...
- C语言复杂声明
C语言复杂声明 First step int *f(); /* f:是一个函数,它返回一个指向int类型的指针*/ int (*pf)(); /* pf:是一个指向函数的指针,该函数返回一个int类型 ...
- 被table单元格colspan属性折磨了
基础知识不牢固,被colspan折磨了很长时间 table里面的td使用colspan前提条件是所跨的单元格宽度必须一样,不然显示效果会是属性不起作用或直接导致表格变形,下面的例子可以看出效果 < ...
- iOS开发 ReactiveCocoa入门教程 第一部分
作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...
- LCT专题练习
[bzoj2049]洞穴勘测 http://www.cnblogs.com/Sdchr/p/6188628.html 小结 (1)LCT可以方便维护树的连通性,但是图的连通性的维护貌似很麻烦. [bz ...
- 关于OPencv版本不符合,相关库变化问题
由于OPencv发展迅速,已经省略了很多原来的库文件,奈何自己才疏学浅,所以只能把OPencv 1.0中的相关版本中的库文件一直过去. 链接: http://pan.baidu.com/s/1qY1Z ...
- Android中Webview使用自定义的javascript进行回调
先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ...