首页 电脑 电脑学堂 查看内容

解密教程(四)

2004-9-29 20:05 555 0

摘要: 补丁制作1、文件补丁制作今天我们接触补丁制作工具是CodeFusion,界面制作也不错,它有以下功能:1、可以自动比较补丁前后的差别2、可以对字节逐个补丁,也可以使用普通和模板两种查找、替换;3、补丁...
关键词: nbsp 文件 CSiR 补丁 EXE AppName width 脚本 字节 offset

补丁制作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制成的补丁程序运行的界面。 screen.width-333)this.width=screen.width-333">界面还是不错的,只要你用用CodeFusion,你就发现它很容易上手。第一步、运行CodeFusion,界面如图二: screen.width-333)this.width=screen.width-333">图一和图二中的数字1、2、3、4、5是彼此对应的,要得到(图一)结果只需在(图二)中键入你自己的说明即可。你自己定制好界面可以存盘,存盘名是*.cfp,以后你只要打开该文件,就可出现所要的界面。很简单,自己摸索一下就能掌握。第二步、定制好界面后,可以按预览按钮(就是上面的眼睛图标)看看界面自己是否满意,满意后按下一步。screen.width-333)this.width=screen.width-333">在图三中,按(1)处的绿色的十字,以添加原文件(在这里是吸血鬼的原主文件),按1后出现左边的一窗口,按2选择吸血鬼的原主文,选好按Ok即可。第三步、这一步按图四的1处的绿色十字,出现如下结果: screen.width-333)this.width=screen.width-333"> 按上图中的2处是文件比较。第3处是Byte-path offset,在原文件中指定的地址处打字节补丁。第4处是Find &Replace,在原文件查找替换字节。第五处是Truncate offset,从指定地址处切断原文件。3,4,5的用处我在这里就不写了,大家可自己试试。第四步、用鼠标按图四中的2处(File Compare)出现图五,选择己被crack的文件,进行比较,在这里是C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。screen.width-333)this.width=screen.width-333">在1 处选择C:\TEMP\2\目录下, 已经CRACK的主程序VAMPIRE.EXE。下一步按第2处的compare,进行两文件的比较,比较结束后按Ok,再按下一步。第五步,这是最后一步,出现图六。screen.width-333)this.width=screen.width-333">在这界面上的各项选项就以默认值为主,它们都是些压缩选项,压缩补丁以保护你的版权。最后一步按1处(Make win32 Executable),选择路径、文件名,生成你的补丁。好了你可以把这补丁散发给大家,真可谓,辛苦你一人,方便千万人啊!该软件的其它功能,大家自己再摸索一下,是不是很直观好用。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 为脚本命令文件。 如你的输出文件己存在,它将覆盖。在命令方式下,脚本文件可是任何文件名和扩展名;但在对话窗口操作方式下,文件名必须为  *.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:[email protected] 写作日期: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    :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---------------------------------------------                   ------------------=====Last Words=====------------------     看过TKC教程的人都会发现,我写的这个Loader,和R!sc的相差无几。的确,R!sc的这个程序的框架 很不错,可以很方便地通过改变很小的代码而实现我们想要的不同功能。 :)                   ------------------=====Ending=====------------------     aNY qUESTIONS,pLEASE eMAIL tO: [email protected]     Thanks To All!Good Luck!
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部