系统 : Windows xp

程序 : k4n6

程序下载地址 :https://pan.baidu.com/s/1pLANxyj

要求 : 注册机编写

使用工具 : OD & DeDe

可在看雪论坛中查找关于此程序的破文,传送门

首先在DeDe找到激发按钮点击事件的 代码:

  1. 0044435C push ebp
  2. 0044435D 8BEC mov ebp, esp
  3. 0044435F 33C9 xor ecx, ecx
  4. push ecx
  5. push ecx
  6. push ecx
  7. push ecx
  8. push ecx
  9. push ecx
  10. push ecx
  11. push ecx
  12. push ebx
  13. 0044436A push esi
  14. 0044436B push edi
  15. 0044436C 8BD8 mov ebx, eax
  16. 0044436E 33C0 xor eax, eax
  17. push ebp
  18.  
  19. * Possible String Reference to: '閒铥朕_^[嬪]?
  20. |
  21. 00444371 680D454400 push $0044450D
  22.  
  23. ***** TRY
  24. |
  25. 00444376 64FF30 push dword ptr fs:[eax]
  26. 00444379 648920 mov fs:[eax], esp
  27. 0044437C 8D55E4 lea edx, [ebp-$1C]
  28.  
  29. * Reference to control Edit3 : TEdit
  30. |
  31. 0044437F 8B83D8020000 mov eax, [ebx+$02D8]
  32.  
  33. * Reference to: controls.TControl.GetText(TControl):TCaption;
  34. |
  35. 00444385 E892F9FDFF call 00423D1C
  36. 0044438A 8B45E4 mov eax, [ebp-$1C]
  37.  
  38. * Reference to: system.@LStrLen:Integer;
  39. | or: system.@DynArrayLength;
  40. | or: system.DynArraySize(Pointer):Integer;
  41. |
  42. 0044438D E8CEF7FBFF call 00403B60
  43. 00444392 48 dec eax
  44. 00444393 0F8C4C010000 jl 004444E5
  45. 00444399 8D55E8 lea edx, [ebp-$18]
  46.  
  47. * Reference to control Edit3 : TEdit
  48. |
  49. 0044439C 8B83D8020000 mov eax, [ebx+$02D8]
    ....略

看到提供的很多Call  dede都提供了参考,再用od载入程序查看该段代码:

  1. 0044435C . push ebp ; Button1Click
  2. 0044435D . 8BEC mov ebp, esp
  3. 0044435F . 33C9 xor ecx, ecx
  4. . push ecx
  5. . push ecx
  6. . push ecx
  7. . push ecx
  8. . push ecx
  9. . push ecx
  10. . push ecx
  11. . push ecx
  12. . push ebx
  13. 0044436A . push esi
  14. 0044436B . push edi
  15. 0044436C . 8BD8 mov ebx, eax
  16. 0044436E . 33C0 xor eax, eax
  17. . push ebp
  18. . 0D454400 push 0044450D
  19. . :FF30 push dword ptr fs:[eax]
  20. . : mov dword ptr fs:[eax], esp
  21. 0044437C . 8D55 E4 lea edx, dword ptr [ebp-1C]
  22. 0044437F . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
  23. . E8 92F9FDFF call 00423D1C
  24. 0044438A . 8B45 E4 mov eax, dword ptr [ebp-1C] ; 获取密钥
  25. 0044438D . E8 CEF7FBFF call 00403B60 ; 取长度
  26. . dec eax
  27. . 0F8C 4C010000 jl 004444E5 ; 字符串为空则跳出判断
  28. . 8D55 E8 lea edx, dword ptr [ebp-]
  29. 0044439C . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
  30. 004443A2 . E8 75F9FDFF call 00423D1C
  31. 004443A7 . 8D55 F0 lea edx, dword ptr [ebp-]
  32. 004443AA . 8B83 D0020000 mov eax, dword ptr [ebx+2D0]
  33. 004443B0 . E8 67F9FDFF call 00423D1C
  34. 004443B5 . 8D55 EC lea edx, dword ptr [ebp-]
  35. 004443B8 . 8B83 D4020000 mov eax, dword ptr [ebx+2D4]
  36. 004443BE . E8 59F9FDFF call 00423D1C
  37. 004443C3 . 8B45 F0 mov eax, dword ptr [ebp-] ; 获取用户名
  38. 004443C6 . E8 95F7FBFF call 00403B60 ; 取长度
  39. 004443CB . 83F8 cmp eax, ; 小于4则跳出判断
  40. 004443CE . 0F8C jl 004444E5
  41. 004443D4 . 8B45 EC mov eax, dword ptr [ebp-] ; 获取公司名
  42. 004443D7 . E8 84F7FBFF call 00403B60 ; 取长度
  43. 004443DC . 83F8 cmp eax, ; 小于3则跳出判断
  44. 004443DF . 0F8C jl 004444E5
  45. 004443E5 . 8B45 F0 mov eax, dword ptr [ebp-] ; 取用户名
  46. 004443E8 . 0FB600 movzx eax, byte ptr [eax] ; 取第一个字符
  47. 004443EB . 0FB680 DF5944>movzx eax, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值,这里用插件取出表
  48. 004443F2 . F4 mov dword ptr [ebp-C], eax
  49. 004443F5 . 8B45 F0 mov eax, dword ptr [ebp-]
  50. 004443F8 . 0FB640 movzx eax, byte ptr [eax+] ; 取第三个字符
  51. 004443FC . 0FB6B0 DF5944>movzx esi, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
  52. . 8B45 EC mov eax, dword ptr [ebp-] ; 再取公司名
  53. . E8 55F7FBFF call 00403B60 ; 获取公司名长度
  54. 0044440B . 8B55 EC mov edx, dword ptr [ebp-] ; 保存公司名
  55. 0044440E . 0FB64402 FE movzx eax, byte ptr [edx+eax-] ; 取倒数第二个字符
  56. . 0FB6B8 DF5944>movzx edi, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
  57. 0044441A . 8B45 EC mov eax, dword ptr [ebp-]
  58. 0044441D . E8 3EF7FBFF call 00403B60
  59. . 8B55 EC mov edx, dword ptr [ebp-]
  60. . 0FB64402 FF movzx eax, byte ptr [edx+eax-] ; 取倒数第一个字符
  61. 0044442A . 0FB680 DF5944>movzx eax, byte ptr [eax+4459DF] ; 按照字符的值取出 表里的值
  62. . 8B55 F0 mov edx, dword ptr [ebp-]
  63. . 0FB652 movzx edx, byte ptr [edx+] ; 取用户名第四个字符
  64. . 0FB692 DF5944>movzx edx, byte ptr [edx+4459DF] ; 按照字符的值取出 表里的值
  65. 0044443F . 8B4D EC mov ecx, dword ptr [ebp-]
  66. . 0FB649 movzx ecx, byte ptr [ecx+] ; 取公司名第三个字符
  67. . 0FB689 DF5944>movzx ecx, byte ptr [ecx+4459DF] ; 按照字符的值取出 表里的值
  68. 0044444D . 0FAFD1 imul edx, ecx
  69. . F8 mov dword ptr [ebp-], edx ; 保存相乘结果
  70. . 8B55 F4 mov edx, dword ptr [ebp-C] ; 用户名第一个字符在表中对应的值
  71. . 0FAFD6 imul edx, esi
  72. . 0FAFD7 imul edx, edi
  73. 0044445C . 0FAFD0 imul edx, eax
  74. 0044445F . F8 add edx, dword ptr [ebp-]
  75. . FC mov dword ptr [ebp-], edx
  76. . 8B45 FC mov eax, dword ptr [ebp-]
  77. . D8280000 xor eax, 28D8
  78. 0044446D . 7D4A8D28 add eax, 288D4A7D
  79. . FC mov dword ptr [ebp-], eax ; 结果保存
  80. . 8B45 FC mov eax, dword ptr [ebp-]
  81. . B9 mov ecx,
  82. 0044447D . C1C1 rol ecx, ; 循环左移
  83. . xor eax,
  84. . C1C8 ror eax,
  85. . C1F8 sar eax, ; 算数右移
  86. 0044448B . 01C8 add eax, ecx
  87. 0044448D . F8 add eax, dword ptr [ebp-]
  88. . inc eax
  89. . :F7D0 not ax
  90. . 09C1 or ecx, eax
  91. . 9A020000 add eax, 29A
  92. 0044449B . FC mov dword ptr [ebp-], eax ; 结果保存
  93. 0044449E . 33C0 xor eax, eax
  94. 004444A0 . push ebp
  95. 004444A1 . DB444400 push 004444DB
  96. 004444A6 . :FF30 push dword ptr fs:[eax]
  97. 004444A9 . : mov dword ptr fs:[eax], esp
  98. 004444AC . 8D55 E0 lea edx, dword ptr [ebp-]
  99. 004444AF . 8B83 D8020000 mov eax, dword ptr [ebx+2D8]
  100. 004444B5 . E8 62F8FDFF call 00423D1C ; 获取密钥
  101. 004444BA . 8B45 E0 mov eax, dword ptr [ebp-]
  102. 004444BD . E8 4E36FCFF call 00407B10 ; StrToInt
  103. 004444C2 . 3B45 FC cmp eax, dword ptr [ebp-] ; 和结果是否相同?
  104. 004444C5 . 0A jnz short 004444D1
  105. 004444C7 . B8 mov eax, ; good , this number come from your keygen ?
  106. 004444CC . E8 A3FAFFFF call 00443F74 ; ShowMessage
  107. 004444D1 > 33C0 xor eax, eax
  108. 004444D3 . 5A pop edx
  109. 004444D4 . pop ecx
  110. 004444D5 . pop ecx

代码分析完毕,虽然变量操作很多很复杂,但耐下心来做的话还是觉得比较简单的。

打开http://www.cnblogs.com/ZRBYYXDM/p/5115596.html中搭建的框架,向着界面上多加一个编辑框和标签用来输入公司名。

  1. ID: IDC_EDIT_COMPANY | TYPE:BUTTON
  2. ID: IDC_STATIC | TYPE:Label | Caption:公司名

修改OnBtnDecrypt函数如下:

  1. void CKengen_TemplateDlg::OnBtnDecrypt()
  2. {
  3. // TODO: Add your control notification handler code here
  4. CString name;
  5. GetDlgItemText( IDC_EDIT_NAME,name ); //获取用户名字串基本信息。
  6.  
  7. CString company;
  8. GetDlgItemText( IDC_EDIT_COMPANY,company ); //获取用户名字串基本信息。
  9.  
  10. if ( name.GetLength() >= && company.GetLength() >= ){ //格式控制。
  11. int table[] = {
  12. 0x00, 0x10, 0x39, 0x44, 0x00, 0x24, 0x39, 0x44, 0x00, 0x0C,
  13. 0xAF, 0x40, 0x00, 0x14, 0xAF, 0x40, 0x00, 0x1C, 0xAF, 0x40,
  14. 0x00, 0x24, 0xAF, 0x40, 0x00, 0x34, 0xAF, 0x40, 0x00, 0x3C,
  15. 0xAF, 0x40, 0x00, 0x44, 0xAF, 0x40, 0x00, 0x4C, 0xAF, 0x40,
  16. 0x00, 0x54, 0xAF, 0x40, 0x00, 0x5C, 0xAF, 0x40, 0x00, 0x2C,
  17. 0xAF, 0x40, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
  18. 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03,
  19. 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
  20. 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A,
  21. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x61, 0x23,
  22. 0x47, 0x0E, 0x26, 0x61, 0x20, 0x31, 0x49, 0x36, 0x24, 0x2B,
  23. 0x42, 0x31, 0x63, 0x0E, 0x29, 0x5E, 0x30, 0x4B, 0x38, 0x2A,
  24. 0x33, 0x44, 0x3D
  25. };
  26.  
  27. unsigned int ch = table[name[]];
  28. unsigned int ch2 = table[name[]];
  29. unsigned int ch3 = table[ company[company.GetLength() - ] ];
  30. unsigned int ch4 = table[ company[company.GetLength() - ] ];
  31. unsigned int ch5 = table[ name[] ];
  32. unsigned int ch6 = table[ company[] ];
  33.  
  34. unsigned int res = ch5 * ch6;
  35. unsigned int res2 = ch * ch2 * ch3 * ch4 + res;
  36. unsigned int res3;
  37.  
  38. //左移异或这些操作直接拷贝源汇编代码改改
  39. __asm{
  40. push eax
  41. push ecx
  42.  
  43. mov eax, res2
  44. xor eax, 0x28D8
  45. add eax, 0x288D4A7D
  46.  
  47. mov ecx, 0x3039
  48. rol ecx,
  49. xor eax, 0x9714
  50. ror eax,
  51. sar eax,
  52. add eax, ecx
  53.  
  54. add eax, res
  55. inc eax
  56. not ax
  57. or ecx, eax
  58. add eax, 0x29A
  59. mov res3, eax
  60.  
  61. pop ecx
  62. pop eax
  63. }
  64.  
  65. CString PassWord;
  66. PassWord.Format( "%lu",res3 );
  67. SetDlgItemText( IDC_EDIT_PASSWORD2,PassWord );
  68. }
  69. else
  70. MessageBox( "用户名格式错误!" );
  71. }

再将OnBtnCopy函数改成:

  1. void CKengen_TemplateDlg::OnBtnCopy()
  2. {
  3. // TODO: Add your control notification handler code here
  4. CString cmd;
  5. GetDlgItemText( IDC_BTN_COPY,cmd );
  6.  
  7. if ( OpenClipboard() ){ //打开剪贴板
  8. CString str;
  9. HANDLE hClip;
  10. char *pBuf;
  11.  
  12. EmptyClipboard();
  13.  
  14. if ( cmd == "拷贝用户名" ) //如果命令是拷贝用户名
  15. GetDlgItemText( IDC_EDIT_NAME,str );
  16. else{
  17. if ( cmd == "拷贝公司名" )
  18. GetDlgItemText( IDC_EDIT_COMPANY,str );
  19. else
  20. GetDlgItemText( IDC_EDIT_PASSWORD2,str );
  21. }
  22.  
  23. hClip = GlobalAlloc( GMEM_MOVEABLE,str.GetLength() + );
  24. pBuf = (char*)GlobalLock( hClip );
  25. strcpy( pBuf,str );
  26. GlobalUnlock( hClip );
  27. SetClipboardData( CF_TEXT,hClip );
  28. CloseClipboard();
  29.  
  30. if ( cmd == "拷贝用户名" ){ //变换命令
  31. SetDlgItemText( IDC_BTN_COPY,"拷贝公司名" );
  32. SetDlgItemText( IDC_STC_MSG,"拷贝用户名成功!" ); //提示成功
  33. }
  34. else{
  35. if ( cmd == "拷贝公司名" ){
  36. SetDlgItemText( IDC_BTN_COPY,"拷贝序列号" );
  37. SetDlgItemText( IDC_STC_MSG,"拷贝公司名成功!" );
  38. }
  39. else{
  40. SetDlgItemText( IDC_BTN_COPY,"拷贝用户名" );
  41. SetDlgItemText( IDC_STC_MSG,"拷贝序列号成功!" );
  42. }
  43. }
  44. }
  45. else
  46. SetDlgItemText( IDC_STC_MSG,"拷贝失败!" );
  47. }

再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("Keygen"));

运行效果:

分析一个delphi程序的更多相关文章

  1. OD 实验(十二) - 对一个 Delphi 程序的逆向

    程序: 运行程序 界面显示的是未注册 点击 Help -> About 点击 Use Reg Key 这里输入注册码 用 PEiD 看一下 该程序是用 Delphi 6.0 - 7.0 写的 逆 ...

  2. Delphi程序员如何找到高薪的工作?(赚不到钱,原因只有一个,就是他们没有被公司录取。Delphi必须要独自进行深入研究,才能精通,同时也不能自由性太强)

    转帖自:http://www.tommstudio.com/ViewNews.aspx?ID=187http://hi.baidu.com/rarnu/blog/ 本文翻译自<美国优秀经理观念大 ...

  3. OD学习笔记10:一个VB程序的加密和解密思路

    前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...

  4. OD调试器调试Delphi程序按钮事件断点方法

    这几天我调试一个Delphi程序,总是无法断点按钮事件,像我这样的菜鸟断点按钮事件真心累啊.所以我分享一下我下断点的经验!希望新手们少走弯路!!   工具/原料   OD调试器 Delphi程序 方法 ...

  5. 如何分析一个已有的Delphi项目源代码

    分析一个已有的Delphi项目,应该从以下入手(按先后顺序):1. 编译条件,包括自定义的Condition以及inc文件里的标识2. 主项目文件dpr,因为窗体的windows消息循环只是程序的一部 ...

  6. 【C语言】03-第一个C程序代码分析

    前面我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下 ...

  7. 【C语言】01-第一个c程序代码分析

    创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #i ...

  8. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

  9. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

随机推荐

  1. .Net Globalization and Localization

    随着互联网的发展日益壮大和活跃,网上购物交易越来越频繁,一个网站支持多种语言在所难免,所以国际化和本地化在现在的网站中的作用越来越大,一个网站的使用量和搜索量有可能受国际化的影响一点.所以在当今做一个 ...

  2. nodeType的意思

    nodeType是用来获得当前节点对象的类型.nodeType 属性可返回节点的类型.元素element   1   属性attr   2   文本text   3   注释comments   8 ...

  3. Ionic 的 ng-class 在聊天功能上面的巧妙运用

    很多人在问我是ionic好呢?还是react好呢? 其实我只想告诉你去看文档啊,不用用怎么知道哪个合适呢? 嘿嘿但是真的这么问的时候我也不会这么回答的,那岂不是太张狂了哈哈哈 react我确实没有用过 ...

  4. 总结js中数据类型的bool值及其比较

    首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)为true. 可以使用Bo ...

  5. LNAMP服务器环境搭建(手动编译安装)

    LNAMP服务器环境搭建(手动编译安装) 一.准备材料 阿里云主机一台,操作系统CentOS 6.5 64位 lnamp.zip包(包含搭建环境所需要的所有软件) http://123.56.144. ...

  6. Visual Studio安装及单元测试

    一.安装环境 操作系统版本:Win10中文版64位 CPU:i5-4200M  2.50GHz 硬盘内存:500G 二.软件版本 Visual Studio 2013 三.安装过程 1.首先开始安装, ...

  7. Java集合类学习笔记(Set集合)

    Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...

  8. μC/OS-Ⅲ系统中的任务种类及基本状态

    在μC/OS-Ⅲ系统中,任务自身一共有五种状态. 1.休眠态 调用函数OSTaskCreate()创建任务后,任务就可以接受μC/OS-Ⅲ的管理.处于休眠态的任务代码实际上已经写入代码空间中了,但是μ ...

  9. 通过GET方法返回定义的任意对象

    package util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputSt ...

  10. Xcode快捷键

    1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 CMD + S: 保存 CMD + SHIFT + S: 另存为 CMD + W: 关闭窗口 C ...