科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网安全频道一步一步教你加密解密技术——注册机和补丁制作(1)

一步一步教你加密解密技术——注册机和补丁制作(1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

注册机和补丁制作何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的算法(这当然是通过跟踪调试了解的),之后用汇编语言……

作者:看雪 来源:看雪 2008年10月16日

关键字: 注册机 补丁制作 加密解密

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

  注册机和补丁制作

  第一节 概念介绍

  何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的算法(这当然是通过跟踪调试了解的),之后用汇编语言或其它高级语言来把算法还原。这样大家可根据自己的要求输入注册码,如根据自己的姓名,公司的名称注册。

  目前共享软件有两种注册方式:

  一 种是交费后,作者给寄有全部功能的 Register软件,原来的Shareware根本没有某些功能;

  第二种交费后, 作者给你个注册码(Register Number),注册后功能就无限制了 。共享软件注册前后基本相同 , 只是功能受限制 ,或者使用时间受限制 ,或者经常出现要求注册的画面 , 等等 。

  我们平时所接触的共享软件是第二种,通过算出注册码或打补丁使该软件有注册后的功能。

  软件的破解也分两种:

  一是、补丁(patches),这些小程序的功能是用来改变某种软件内某些特定的部位,因此它们的作用通常只限于某一个软件的版本。请勿使用针对不同版本所设计的patch,必须注意所使用软件版本的版本号与patch是否相同。倘若使用不当,将导至错误信息,会破坏程序,严重时也有可能死机!

  二是、序列号(serial number)和注册码(key generator)就显的安全多了。有时候旧版的序号亦适用于新出的版本,就算不能用也毫无伤害。只有在极少数的情况下软件作者会设下某些陷阱,当使用者输入黑名单上的序号后,软件会自动销毁而无法使用。

  通过补丁和注册机可以大大方便用户的注册,就是目前有不少的程序,它的注册码都与硬件有关,就是在每一台机上安装都有一个机器码,要把这个机器码E-MAIL给作者, 作者把收到的机器码用注册程序算出注册码后再寄回给用户,这样做使得软件的防复制方面加强了,但造成了不少用户的麻烦,因为只要用户一重装系统或升级主板 ,就要重新去注册了。对于这种程序,一般初学者只能在内存中找到自己机器的注册码,但这种注册码到了其它的机器上又不能用了。所以要求大家能自己写出注册机来。

  而有的软件注册码计算很复杂,或只是试用版,到期就停止使用,根本无法输入注册码。对这类软件只能通过改动原程序代码指令,但如何让大家很方便地解除限制,当然你可把改动的字节告诉大家,用二进制编辑工具修改,但很不方便。所以大家有必要自己制作补丁程序,只要用户运行该补丁程序,让它帮你改动指定的代码,就可解除原软件限制,是不是很方便。

  摘要:注册机和补丁制作何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的算法(这当然是通过跟踪调试了解的),之后用汇编语言……

  标签:加密 解密 crack 破解

  第二节 补丁制作

  1、文件补丁制作

  今天我们接触补丁制作工具是CodeFusion,界面制作也不错,它有以下功能:

  1、可以自动比较补丁前后的差别

  2、可以对字节逐个补丁,也可以使用普通和模板两种查找、替换;

  3、补丁前后的文件尺寸可以不同;

  4、可以对单个文件补丁,也可以处理多个不同盘、不同目录、甚至名字并不匹配的多个文件;

  5、界面文字和链接等完全定制;

  6、可以使用内置和外部的压缩器;也可以不压缩自行修改窗体;

  为了使初学者能更快掌握这一工具使用,我就把一补丁最常用的制作过作写下来。

  首先建立一个临时目录C:\TEMP(只是为了下面讲述的方便罢了).并在其下建立两个子目录,分别为C:\TEMP\1\以及 C:\TEMP\2\. 以网络吸血鬼NET VAMPIRE 3.2为例: 将没有CRACK的主程序VAMPIRE.EXE拷到C:\TEMP\1\目录下. 将已经CRACK的主程序VAMPIRE.EXE拷到C:\TEMP\2\目录下.

  (图一)是用CodeFusion制成的补丁程序运行的界面。

(图一)

  界面还是不错的,只要你用用CodeFusion,你就发现它很容易上手。

  第一步、运行CodeFusion,界面如图二:

(图二)

  图一和图二中的数字1、2、3、4、5是彼此对应的,要得到(图一)结果只需在(图二)中键入你自己的说明即可。你自己定制好界面可以存盘,存盘名是*.cfp,以后你只要打开该文件,就可出现所要的界面。很简单,自己摸索一下就能掌握。

  第二步、定制好界面后,可以按预览按钮(就是上面的眼睛图标)看看界面自己是否满意,满意后按下一步。

(图三)

  在图三中,按(1)处的绿色的十字,以添加原文件(在这里是吸血鬼的原主文件),按1后出现左边的一窗口,按2选择吸血鬼的原主文,选好按Ok即可。

  第三步、这一步按图四的1处的绿色十字,出现如下结果:

(图四)

  按上图中的2处是文件比较。第3处是Byte-path offset,在原文件中指定的地址处打字节补丁。第4处是Find &Replace,在原文件查找替换字节。第五处是Truncate offset,从指定地址处切断原文件。3,4,5的用处我在这里就不写了,大家可自己试试。

  第四步、用鼠标按图四中的2处(File Compare)出现图五,选择己被crack的文件,进行比较,在这里是C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。

(图五)

  在1 处选择C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。下一步按第2处的compare,进行两文件的比较,比较结束后按Ok,再按下一步。

  第五步,这是最后一步,出现图六。

(图六)

  在这界面上的各项选项就以默认值为主,它们都是些压缩选项,压缩补丁以保护你的版权。最后一步按1处(Make win32 Executable),选择路径、文件名,生成你的补丁。好了你可以把这补丁散发给大家,真可谓,辛苦你一人,方便千万人啊!

  该软件的其它功能,大家自己再摸索一下,是不是很直观好用。

  摘要:注册机和补丁制作何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的算法(这当然是通过跟踪调试了解的),之后用汇编语言……

  标签:加密 解密 crack 破解

  2、内存补丁制作

  2.1 R!SC'sPatcher 工具使用

  简介

  RPP.EXE 是内存动态补丁制作软件。它通过脚本命令创建win32文件,以此文件装载程序,装载过程中等待软件解压或解除其自身保护后,然后按脚本要求修补内存中的指令,以使软件能够按我们要求运行。

  如ACDSEE3.0是用ASPACK压缩软件,你crack时发现在内存地址433FEA处把6A00改成EB17就可成功,但你不可能直接修改压缩过的ACDSEE.EXE文件;这里就可用 RPP.EXE 按我们要求生成一LOAD.EXE文件,首先运行LOAD.EXE,它自动装载ACDSEE.EXE,等其自解压完成后,然后修改内存433FEA地址为EB17,这样ACDSEE.EXE就可按我们要求运行了,不过我不赞成用此法对付ACDSEE.EXE,因为ACDSEE.EXE运行有两种界面,其中VIEW界面用此法不太灵。

  RPP.EXE 还可很方便对付NAG(一些提示、警告窗口的软件),如用 NEOLITE 2.0 Y压缩过的软件运行之前弹出来的那种窗口,当然也有专门除掉NAG的工具。

  用法

  在资源管理器中双击rpp.exe文件,它弹出一菜单,你选择事先编好的脚本文件,然后按OK 。

  或在WINDOWS下的DOS窗口下用命令方式“rpp.exe <script.rpp>”,其中script.rpp为脚本命令文件。

  如你的输出文件己存在,它将覆盖。在命令方式下,脚本文件可是任何文件名和扩展名;但在对话窗口操作方式下,文件名必须为 *.rpp

  脚 本 命 令

  -------------------

  ';' 注释符号, 跟着的只是些说明, 不会执行的, 直到下一行.

  'T=' 表示对内存的检测次数,T=1000:意味着对内存检测1000次,在放弃之前,告诉你的应用程序是

  不正确的版本。

  注意:在脚本文件里,默认值T=8000。

  'F=' 需要补丁的文件名

  'O=' 生成的补丁文件名,如你没指定文件名,默认为LOAD.EXE

  'P=' 如何在内存补丁, 格式:内存地址/原码/补码

  具体看看脚本的例子

  'R:' 把前面需要补的全部补好后, 再继续, 可以看看azpr243.rpp这个例子

  ':' 每一行都要以冒号结尾, 相当于回车

  '$' 脚本结束标志

  所有数字采用16进制

  内存地址和原码都符合才会进行补丁, 字节间请用逗号分开。脚本文件不能大于40K,被补的字节有限为1f0h字节,被处理的原文件不小于30h字节。

  脚本例子

  script.rpp

  T=1000: ;对内存尝试1000次补丁, 不行则放弃, 如果不设默认为8000

  F=test.exe: ;要补丁的程序

  P=40101D/74,60/74,00: ;将命令jz xx 改为jz next instruction

  P=4024A6/46,52,45,45,20/52,21,53,43,00: ;将字符 'FREE ' 替换成 'R!SC'

  $ ;结束

  具体的脚本范例大家可参考其自带的Scripts.zip。

  一些问题

  下面是一有趣的试验,写一脚本文件,输入输出名一样,产生一执行文件,该文件将不断装载其自身

  最后导致windows崩溃,你只好重新启动了。

  'P=401000/68/B8:'

  'F=fun.exe:'

  'O=fun.exe:', 然后运行 fun.exe 不一会你只好重新启动微机了 :)

  ——————————————————————————————————

  2.2 如何写Loader

  

  作者:夜月

  E-mail:luoyi.ly@yeah.net

  写作日期:31th, August 2001

  使用的工具

  Trw2000 V1.23--Win9X Debugger

  Masm32 V5.00--Loader Compiler

  难易程度

  Easy( ) Medium(X) Hard( ) Pro( )

  ----------=======Declare========----------

  未经作者同意,不得修改、引用原文,一切权利保留。

  本教程只供教学用,其他一切用途皆被禁止。

  ------------------=====Begin=====------------------

  以Director 7.0为例,和大家谈谈如何写 Loader。当然,破解Director 7.0并不一定需要Loader,

  它既没加壳,也没有CRC校验,完全可以用Patch的方法。但我这篇文章的目的不是教你如何破解Director,

  而是教你如何写Loader。Clearly?

  Ready?

  Go!

  Director 7.0也是一个狗保护的软件,和Authorware差不多。跟踪过程并不复杂,在此略去。

  程序判断的关键点:

  * Referenced by a CALL at Address:

  |:00445A24

  |

  :0058CC24 53 push ebx

  :0058CC25 32DB xor bl, bl

  :0058CC27 E835000000 call 0058CC61

  :0058CC2C 83F852 cmp eax, 00000052

  :0058CC2F 741D je 0058CC4E

  :0058CC31 83F856 cmp eax, 00000056

  :0058CC34 7418 je 0058CC4E

  :0058CC36 3D76030000 cmp eax, 00000376

  :0058CC3B 7411 je 0058CC4E

  :0058CC3D 3D54030000 cmp eax, 00000354

  :0058CC42 740A je 0058CC4E

  :0058CC44 83F841 cmp eax, 00000041

  :0058CC47 7405 je 0058CC4E

  :0058CC49 83F851 cmp eax, 00000051

  :0058CC4C 7502 jne 0058CC50

  * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:

  |:0058CC2F(C), :0058CC34(C), :0058CC3B(C), :0058CC42(C), :0058CC47(C)

  |

  :0058CC4E B301 mov bl, 01

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:

  |:0058CC4C(C)

  |

  :0058CC50 E83E000000 call 0058CC93

  :0058CC55 84C0 test al, al

  :0058CC57 7402 je 0058CC5B

  :0058CC59 B301 mov bl, 01

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:

  |:0058CC57(C)

  |

  :0058CC5B 8AC3 mov al, bl <-----------改为 mov al,1

  :0058CC5D 5B pop ebx

  :0058CC5E C20400 ret 0004

  Loader的写作思路很简单,主要是你要知道有这些个API存在。我买了一本32位汇编的书,上面

  竟然说在Window98里面,不能对别的进程进行读写。幸亏有《论坛精华2》中,DDXia翻译的一篇文章上

  面有介绍如何读写别的进程,不然,我到现在还被蒙在鼓里。哎!现在的书呀,真有误人子弟的嫌疑了。

  写Loader要用到的几个API函数:

  (1) BOOL GetOpenFileName(

  LPOPENFILENAME lpofn // 指向一个OPENFILENAME的结构

  );

  该函数的作用是得到要被Load的程序的路径以及文件名

  (2) (摘自罗云彬的Win32Asm教程)

  BOOL CreateProcess(

  LPCTSTR lpApplicationName, // 执行程序文件名

  LPTSTR lpCommandLine, // 参数行

  LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全参数

  LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全参数

  BOOL bInheritHandles, // 继承标记

  DWORD dwCreationFlags, // 创建标记

  LPVOID lpEnvironment, // 环境变量

  LPCTSTR lpCurrentDirectory, // 运行该子进程的初始目录

  LPSTARTUPINFO lpStartupInfo, // 创建该子进程的相关参数

  LPPROCESS_INFORMATION lpProcessInformation // 创建后用于被创建子进程的信息

  );

  改函数的作用是创建进程,使被Load的程序运行起来

  (3) BOOL ReadProcessMemory(

  HANDLE hProcess, // 被读的进程的句柄

  LPCVOID lpBaseAddress, // 开始读的地址

  LPVOID lpBuffer, // 读完后,数据存放的地址

  DWORD nSize, // 要读的数量,以字节为单位

  LPDWORD lpNumberOfBytesRead // 实际上读的数量,以字节为单位

  );

  改函数的作用是读去一片范围的内存,可以作校验用——看看运行的进程是不是我们要Load的那个。

  (4) BOOL WriteProcessMemory(

  HANDLE hProcess, // 被写的进程的句柄

  LPVOID lpBaseAddress, // 开始写的地址

  LPVOID lpBuffer, // 要写入的数据存放地址

  DWORD nSize, // 要写的数量,以字节为单位

  LPDWORD lpNumberOfBytesWritten // 实际上写的数量,以字节为单位

  );

  写一个Loader要用的主要就是这4个函数。

  还有一个问题:如果程序被加壳了,我们如何知道它已经在内存里面节压缩完毕?

  R!sc用的是WaitForInputIdle的方法。这个方法很不错,对付大多数的壳都可以行得通。

  但是,对于这个程序而言,就没有WaitForInputIdle的必要了。因为它并没有加壳。

  好了,下面看看我写的这个Loader的源代码:

  Loader源代码(load.exe):

  ---------------------------------------Cut From Here------------------------------------------

  **********************************************************

  主程序 *

  **********************************************************

  .386p

  .model flat,stdcall

  option casemap :none

  include windows.inc

  include kernel32.inc

  include user32.inc

  include comdlg32.inc

  include comctl32.inc

  includelib kernel32.lib

  includelib user32.lib

  includelib comdlg32.lib

  includelib comctl32.lib

  **********************************************************

  Normal Data *

  **********************************************************

  .data

  CSiR_Tag db 'PE LOADER &CRACKER-----ROBOTOW 2001',0

  CSiR_Error db 'Error!',0

  CSiR_Error1 db 'Something fucked up...',0

  OpenERR_txt db 'CreateProcess Error :( ',0

  ReadERR_txt db 'ReadProcess Error :(',0

  WriteERR_txt db 'WriteProcess Error :P',0

  VersionERR_txt db 'Incorrect Version of application :(',0

  CSiR_ProcessInfo dd 4 dup(0)

  CSiR_StartupInfo db 48h dup(0)

  CSiR_RPBuffer db 10h dup(0)

  szFilter db 'Director.exe',0,'Director.exe',0

  db 'Execute Files',0,'*.exe,;*.com',0

  db 0

  szTitleOpen db 'Find Director.exe,0

  szExt db '*.exe',0

  **********************************************************

  Patch Data *

  **********************************************************

  CSiR_AppName OPENFILENAME <?>

  CSiR_AppName_Buffer db 512 dup(?)

  fuck dd 58cc5bh

  mysizeof dd 6h

  checkbytes db 08Ah,0C3h,05Bh,0C2h,04h,00h

  patch_data_1 db 0B0h,0

  patch_size_1 dd 2

  patch_addr_1 dd 58cc5bh

  .code

  Start:

  invoke InitCommonControls

  invoke GetModuleHandle,NULL

  mov CSiR_AppName.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST

  mov CSiR_AppName.lStructSize,SIZEOF CSiR_AppName

  mov CSiR_AppName.hwndOwner,eax

  mov CSiR_AppName.lpstrFilter,offset szFilter

  mov CSiR_AppName.lpstrFile,offset CSiR_AppName_Buffer

  mov CSiR_AppName.nMaxFile,512

  mov CSiR_AppName.lpstrInitialDir,0

  mov CSiR_AppName.lpstrTitle,offset szTitleOpen

  mov CSiR_AppName.lpstrDefExt,offset szExt

  invoke GetOpenFileName,offset CSiR_AppName

  mov dword ptr [CSiR_StartupInfo],44h

  invoke CreateProcessA,offset CSiR_AppName_Buffer,0,0,0,0,20h,0,0,\

  offset CSiR_StartupInfo,offset CSiR_ProcessInfo

  test eax,eax

  jz OpenERR

  invoke ReadProcessMemory,[CSiR_ProcessInfo],[fuck],offset CSiR_RPBuffer,\

  [mysizeof],0

  test eax,eax

  jz ReadERR

  cld

  lea esi,CSiR_RPBuffer

  lea edi,checkbytes

  mov ecx,6

  repe cmpsb

  jnz VersionERR

  Patch:

  invoke WriteProcessMemory,[CSiR_ProcessInfo],[patch_addr_1],offset patch_data_1,\

  [patch_size_1],0

  test eax,eax

  jz WriteERR

  close_this_app:

  invoke CloseHandle,[CSiR_ProcessInfo]

  invoke CloseHandle,[CSiR_ProcessInfo+4]

  invoke ExitProcess,NULL

  VersionERR:

  lea eax,VersionERR_txt

  jmp abort

  ReadERR:

  lea eax,ReadERR_txt

  jmp abort

  WriteERR:

  lea eax,WriteERR_txt

  jmp abort

  OpenERR:

  lea eax,OpenERR_txt

  abort:

  invoke MessageBox,0,eax,offset CSiR_Error,0

  jmp close_this_app

  End Start

  ------------------------------------------Cut End---------------------------------------------

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章