分析一个delphi程序
系统 : Windows xp
程序 : k4n6
程序下载地址 :https://pan.baidu.com/s/1pLANxyj
要求 : 注册机编写
使用工具 : OD & DeDe
可在看雪论坛中查找关于此程序的破文,传送门
首先在DeDe找到激发按钮点击事件的 代码:
- 0044435C push ebp
- 0044435D 8BEC mov ebp, esp
- 0044435F 33C9 xor ecx, ecx
- push ecx
- push ecx
- push ecx
- push ecx
- push ecx
- push ecx
- push ecx
- push ecx
- push ebx
- 0044436A push esi
- 0044436B push edi
- 0044436C 8BD8 mov ebx, eax
- 0044436E 33C0 xor eax, eax
- push ebp
- * Possible String Reference to: '閒铥朕_^[嬪]?
- |
- 00444371 680D454400 push $0044450D
- ***** TRY
- |
- 00444376 64FF30 push dword ptr fs:[eax]
- 00444379 648920 mov fs:[eax], esp
- 0044437C 8D55E4 lea edx, [ebp-$1C]
- * Reference to control Edit3 : TEdit
- |
- 0044437F 8B83D8020000 mov eax, [ebx+$02D8]
- * Reference to: controls.TControl.GetText(TControl):TCaption;
- |
- 00444385 E892F9FDFF call 00423D1C
- 0044438A 8B45E4 mov eax, [ebp-$1C]
- * Reference to: system.@LStrLen:Integer;
- | or: system.@DynArrayLength;
- | or: system.DynArraySize(Pointer):Integer;
- |
- 0044438D E8CEF7FBFF call 00403B60
- 00444392 48 dec eax
- 00444393 0F8C4C010000 jl 004444E5
- 00444399 8D55E8 lea edx, [ebp-$18]
- * Reference to control Edit3 : TEdit
- |
- 0044439C 8B83D8020000 mov eax, [ebx+$02D8]
....略
看到提供的很多Call dede都提供了参考,再用od载入程序查看该段代码:
- 0044435C . push ebp ; Button1Click
- 0044435D . 8BEC mov ebp, esp
- 0044435F . 33C9 xor ecx, ecx
- . push ecx
- . push ecx
- . push ecx
- . push ecx
- . push ecx
- . push ecx
- . push ecx
- . push ecx
- . push ebx
- 0044436A . push esi
- 0044436B . push edi
- 0044436C . 8BD8 mov ebx, eax
- 0044436E . 33C0 xor eax, eax
- . push ebp
- . 0D454400 push 0044450D
- . :FF30 push dword ptr fs:[eax]
- . : mov dword ptr fs:[eax], esp
- 0044437C . 8D55 E4 lea edx, dword ptr [ebp-1C]
- 0044437F . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
- . E8 92F9FDFF call 00423D1C
- 0044438A . 8B45 E4 mov eax, dword ptr [ebp-1C] ; 获取密钥
- 0044438D . E8 CEF7FBFF call 00403B60 ; 取长度
- . dec eax
- . 0F8C 4C010000 jl 004444E5 ; 字符串为空则跳出判断
- . 8D55 E8 lea edx, dword ptr [ebp-]
- 0044439C . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
- 004443A2 . E8 75F9FDFF call 00423D1C
- 004443A7 . 8D55 F0 lea edx, dword ptr [ebp-]
- 004443AA . 8B83 D0020000 mov eax, dword ptr [ebx+2D0]
- 004443B0 . E8 67F9FDFF call 00423D1C
- 004443B5 . 8D55 EC lea edx, dword ptr [ebp-]
- 004443B8 . 8B83 D4020000 mov eax, dword ptr [ebx+2D4]
- 004443BE . E8 59F9FDFF call 00423D1C
- 004443C3 . 8B45 F0 mov eax, dword ptr [ebp-] ; 获取用户名
- 004443C6 . E8 95F7FBFF call 00403B60 ; 取长度
- 004443CB . 83F8 cmp eax, ; 小于4则跳出判断
- 004443CE . 0F8C jl 004444E5
- 004443D4 . 8B45 EC mov eax, dword ptr [ebp-] ; 获取公司名
- 004443D7 . E8 84F7FBFF call 00403B60 ; 取长度
- 004443DC . 83F8 cmp eax, ; 小于3则跳出判断
- 004443DF . 0F8C jl 004444E5
- 004443E5 . 8B45 F0 mov eax, dword ptr [ebp-] ; 取用户名
- 004443E8 . 0FB600 movzx eax, byte ptr [eax] ; 取第一个字符
- 004443EB . 0FB680 DF5944>movzx eax, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值,这里用插件取出表
- 004443F2 . F4 mov dword ptr [ebp-C], eax
- 004443F5 . 8B45 F0 mov eax, dword ptr [ebp-]
- 004443F8 . 0FB640 movzx eax, byte ptr [eax+] ; 取第三个字符
- 004443FC . 0FB6B0 DF5944>movzx esi, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
- . 8B45 EC mov eax, dword ptr [ebp-] ; 再取公司名
- . E8 55F7FBFF call 00403B60 ; 获取公司名长度
- 0044440B . 8B55 EC mov edx, dword ptr [ebp-] ; 保存公司名
- 0044440E . 0FB64402 FE movzx eax, byte ptr [edx+eax-] ; 取倒数第二个字符
- . 0FB6B8 DF5944>movzx edi, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
- 0044441A . 8B45 EC mov eax, dword ptr [ebp-]
- 0044441D . E8 3EF7FBFF call 00403B60
- . 8B55 EC mov edx, dword ptr [ebp-]
- . 0FB64402 FF movzx eax, byte ptr [edx+eax-] ; 取倒数第一个字符
- 0044442A . 0FB680 DF5944>movzx eax, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
- . 8B55 F0 mov edx, dword ptr [ebp-]
- . 0FB652 movzx edx, byte ptr [edx+] ; 取用户名第四个字符
- . 0FB692 DF5944>movzx edx, byte ptr [edx+4459DF] ; 按照字符的值取出 表里的值
- 0044443F . 8B4D EC mov ecx, dword ptr [ebp-]
- . 0FB649 movzx ecx, byte ptr [ecx+] ; 取公司名第三个字符
- . 0FB689 DF5944>movzx ecx, byte ptr [ecx+4459DF] ; 按照字符的值取出 表里的值
- 0044444D . 0FAFD1 imul edx, ecx
- . F8 mov dword ptr [ebp-], edx ; 保存相乘结果
- . 8B55 F4 mov edx, dword ptr [ebp-C] ; 用户名第一个字符在表中对应的值
- . 0FAFD6 imul edx, esi
- . 0FAFD7 imul edx, edi
- 0044445C . 0FAFD0 imul edx, eax
- 0044445F . F8 add edx, dword ptr [ebp-]
- . FC mov dword ptr [ebp-], edx
- . 8B45 FC mov eax, dword ptr [ebp-]
- . D8280000 xor eax, 28D8
- 0044446D . 7D4A8D28 add eax, 288D4A7D
- . FC mov dword ptr [ebp-], eax ; 结果保存
- . 8B45 FC mov eax, dword ptr [ebp-]
- . B9 mov ecx,
- 0044447D . C1C1 rol ecx, ; 循环左移
- . xor eax,
- . C1C8 ror eax,
- . C1F8 sar eax, ; 算数右移
- 0044448B . 01C8 add eax, ecx
- 0044448D . F8 add eax, dword ptr [ebp-]
- . inc eax
- . :F7D0 not ax
- . 09C1 or ecx, eax
- . 9A020000 add eax, 29A
- 0044449B . FC mov dword ptr [ebp-], eax ; 结果保存
- 0044449E . 33C0 xor eax, eax
- 004444A0 . push ebp
- 004444A1 . DB444400 push 004444DB
- 004444A6 . :FF30 push dword ptr fs:[eax]
- 004444A9 . : mov dword ptr fs:[eax], esp
- 004444AC . 8D55 E0 lea edx, dword ptr [ebp-]
- 004444AF . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
- 004444B5 . E8 62F8FDFF call 00423D1C ; 获取密钥
- 004444BA . 8B45 E0 mov eax, dword ptr [ebp-]
- 004444BD . E8 4E36FCFF call 00407B10 ; StrToInt
- 004444C2 . 3B45 FC cmp eax, dword ptr [ebp-] ; 和结果是否相同?
- 004444C5 . 0A jnz short 004444D1
- 004444C7 . B8 mov eax, ; good , this number come from your keygen ?
- 004444CC . E8 A3FAFFFF call 00443F74 ; ShowMessage
- 004444D1 > 33C0 xor eax, eax
- 004444D3 . 5A pop edx
- 004444D4 . pop ecx
- 004444D5 . pop ecx
代码分析完毕,虽然变量操作很多很复杂,但耐下心来做的话还是觉得比较简单的。
打开http://www.cnblogs.com/ZRBYYXDM/p/5115596.html中搭建的框架,向着界面上多加一个编辑框和标签用来输入公司名。
- ID: IDC_EDIT_COMPANY | TYPE:BUTTON
- ID: IDC_STATIC | TYPE:Label | Caption:公司名
修改OnBtnDecrypt函数如下:
- void CKengen_TemplateDlg::OnBtnDecrypt()
- {
- // TODO: Add your control notification handler code here
- CString name;
- GetDlgItemText( IDC_EDIT_NAME,name ); //获取用户名字串基本信息。
- CString company;
- GetDlgItemText( IDC_EDIT_COMPANY,company ); //获取用户名字串基本信息。
- if ( name.GetLength() >= && company.GetLength() >= ){ //格式控制。
- int table[] = {
- 0x00, 0x10, 0x39, 0x44, 0x00, 0x24, 0x39, 0x44, 0x00, 0x0C,
- 0xAF, 0x40, 0x00, 0x14, 0xAF, 0x40, 0x00, 0x1C, 0xAF, 0x40,
- 0x00, 0x24, 0xAF, 0x40, 0x00, 0x34, 0xAF, 0x40, 0x00, 0x3C,
- 0xAF, 0x40, 0x00, 0x44, 0xAF, 0x40, 0x00, 0x4C, 0xAF, 0x40,
- 0x00, 0x54, 0xAF, 0x40, 0x00, 0x5C, 0xAF, 0x40, 0x00, 0x2C,
- 0xAF, 0x40, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
- 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
- 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x61, 0x23,
- 0x47, 0x0E, 0x26, 0x61, 0x20, 0x31, 0x49, 0x36, 0x24, 0x2B,
- 0x42, 0x31, 0x63, 0x0E, 0x29, 0x5E, 0x30, 0x4B, 0x38, 0x2A,
- 0x33, 0x44, 0x3D
- };
- unsigned int ch = table[name[]];
- unsigned int ch2 = table[name[]];
- unsigned int ch3 = table[ company[company.GetLength() - ] ];
- unsigned int ch4 = table[ company[company.GetLength() - ] ];
- unsigned int ch5 = table[ name[] ];
- unsigned int ch6 = table[ company[] ];
- unsigned int res = ch5 * ch6;
- unsigned int res2 = ch * ch2 * ch3 * ch4 + res;
- unsigned int res3;
- //左移异或这些操作直接拷贝源汇编代码改改
- __asm{
- push eax
- push ecx
- mov eax, res2
- xor eax, 0x28D8
- add eax, 0x288D4A7D
- mov ecx, 0x3039
- rol ecx,
- xor eax, 0x9714
- ror eax,
- sar eax,
- add eax, ecx
- add eax, res
- inc eax
- not ax
- or ecx, eax
- add eax, 0x29A
- mov res3, eax
- pop ecx
- pop eax
- }
- CString PassWord;
- PassWord.Format( "%lu",res3 );
- SetDlgItemText( IDC_EDIT_PASSWORD2,PassWord );
- }
- else
- MessageBox( "用户名格式错误!" );
- }
再将OnBtnCopy函数改成:
- 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 == "拷贝公司名" )
- GetDlgItemText( IDC_EDIT_COMPANY,str );
- else
- GetDlgItemText( IDC_EDIT_PASSWORD2,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,"拷贝公司名" );
- SetDlgItemText( IDC_STC_MSG,"拷贝用户名成功!" ); //提示成功
- }
- else{
- if ( cmd == "拷贝公司名" ){
- SetDlgItemText( IDC_BTN_COPY,"拷贝序列号" );
- SetDlgItemText( IDC_STC_MSG,"拷贝公司名成功!" );
- }
- else{
- SetDlgItemText( IDC_BTN_COPY,"拷贝用户名" );
- SetDlgItemText( IDC_STC_MSG,"拷贝序列号成功!" );
- }
- }
- }
- else
- SetDlgItemText( IDC_STC_MSG,"拷贝失败!" );
- }
再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("Keygen"));
运行效果:
分析一个delphi程序的更多相关文章
- OD 实验(十二) - 对一个 Delphi 程序的逆向
程序: 运行程序 界面显示的是未注册 点击 Help -> About 点击 Use Reg Key 这里输入注册码 用 PEiD 看一下 该程序是用 Delphi 6.0 - 7.0 写的 逆 ...
- Delphi程序员如何找到高薪的工作?(赚不到钱,原因只有一个,就是他们没有被公司录取。Delphi必须要独自进行深入研究,才能精通,同时也不能自由性太强)
转帖自:http://www.tommstudio.com/ViewNews.aspx?ID=187http://hi.baidu.com/rarnu/blog/ 本文翻译自<美国优秀经理观念大 ...
- OD学习笔记10:一个VB程序的加密和解密思路
前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...
- OD调试器调试Delphi程序按钮事件断点方法
这几天我调试一个Delphi程序,总是无法断点按钮事件,像我这样的菜鸟断点按钮事件真心累啊.所以我分享一下我下断点的经验!希望新手们少走弯路!! 工具/原料 OD调试器 Delphi程序 方法 ...
- 如何分析一个已有的Delphi项目源代码
分析一个已有的Delphi项目,应该从以下入手(按先后顺序):1. 编译条件,包括自定义的Condition以及inc文件里的标识2. 主项目文件dpr,因为窗体的windows消息循环只是程序的一部 ...
- 【C语言】03-第一个C程序代码分析
前面我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下 ...
- 【C语言】01-第一个c程序代码分析
创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #i ...
- 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件
作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
随机推荐
- .Net Globalization and Localization
随着互联网的发展日益壮大和活跃,网上购物交易越来越频繁,一个网站支持多种语言在所难免,所以国际化和本地化在现在的网站中的作用越来越大,一个网站的使用量和搜索量有可能受国际化的影响一点.所以在当今做一个 ...
- nodeType的意思
nodeType是用来获得当前节点对象的类型.nodeType 属性可返回节点的类型.元素element 1 属性attr 2 文本text 3 注释comments 8 ...
- Ionic 的 ng-class 在聊天功能上面的巧妙运用
很多人在问我是ionic好呢?还是react好呢? 其实我只想告诉你去看文档啊,不用用怎么知道哪个合适呢? 嘿嘿但是真的这么问的时候我也不会这么回答的,那岂不是太张狂了哈哈哈 react我确实没有用过 ...
- 总结js中数据类型的bool值及其比较
首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)为true. 可以使用Bo ...
- LNAMP服务器环境搭建(手动编译安装)
LNAMP服务器环境搭建(手动编译安装) 一.准备材料 阿里云主机一台,操作系统CentOS 6.5 64位 lnamp.zip包(包含搭建环境所需要的所有软件) http://123.56.144. ...
- Visual Studio安装及单元测试
一.安装环境 操作系统版本:Win10中文版64位 CPU:i5-4200M 2.50GHz 硬盘内存:500G 二.软件版本 Visual Studio 2013 三.安装过程 1.首先开始安装, ...
- Java集合类学习笔记(Set集合)
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...
- μC/OS-Ⅲ系统中的任务种类及基本状态
在μC/OS-Ⅲ系统中,任务自身一共有五种状态. 1.休眠态 调用函数OSTaskCreate()创建任务后,任务就可以接受μC/OS-Ⅲ的管理.处于休眠态的任务代码实际上已经写入代码空间中了,但是μ ...
- 通过GET方法返回定义的任意对象
package util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputSt ...
- Xcode快捷键
1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 CMD + S: 保存 CMD + SHIFT + S: 另存为 CMD + W: 关闭窗口 C ...