QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3074|回复: 0
打印 上一主题 下一主题

编写一个文件补丁

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 00:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

编者:昨天一个叫aqtata的朋友发给我了个最新的密界文集, 本来想打包下载,可那样很多朋友 $ B, |0 o7 h- }会看不到里面的好文章.于是我决定把其中较浅显通俗的一些文章发到文章区,希望能对您有所帮助

5 _3 R Y! ? O7 V

作者 : Detten Detten@tiscali.be 6 q# `% x0 V- B% ^" k% q* C 来源 : _blank>http://biw.rult.at/ 2 l+ {9 M$ g- X2 Q1 z: K% j 5 {' R) W) A3 w% ~$ I7 I翻译 : nbw _blank>http://www.vxer.com/ ; _# \' L; Y- } K9 Y4 { 9 i/ y9 T9 P- Q3 H6 F( P- a0 _1、前言& M% A- W" L, L; @ 一但破解了一个程序,你就想把成果共享给别人。为了不用把整个破解后的程序上传,你可以制作一个小补丁来修改程序中必要的字节。7 k9 j# S# O# G0 b# ~7 b 那如何来写呢? ' i- \) F1 C+ p- G* D0 X6 {9 G4 N, }===〉首先找到需要打补丁的文件。大多数补丁认为该文件处在自己当前目录下。3 m0 N' b" O& _: @ p- ^0 B4 x3 x: Z: M) h8 B ===〉如果找到,打开该文件。 2 Y% p$ U0 j; n) u$ r+ @! w3 N1 U ; z6 n1 j" d4 K===〉然后检查打开的文件是不是和所破解的文件。比如我们可以检查文件大小,或者随机检查一些字节,或者最好检查将要被修改的字节。 3 }( l$ f' u/ \8 H2 j$ ^+ j- u& M9 ` ===〉如果以上都无误,我们可以做需要调整 . y& S" ~9 I% c+ b+ t; S8 W 把文件指针移动到指定位置,然后写入新的操作码。 : D8 r( Z9 E' t# l) W7 c) I7 Y$ U3 v2 C6 G ===〉关闭文件,给出提示结果。 , w* G* e. J _1 g- t R+ z q- w, d 下面找一个你破解的文件,然后开始....) b8 r' V) O% |# }* j: q . y* \3 H1 z* w7 j% {& M2、必要的API! z* G, f: C) {5 ]2 F X3 y; } 做这个程序需要用到什么API呢? 2 h5 B, ?9 ~( l! |; l 0 K7 g% ^0 |8 m4 G3 L2 n5 R- U1 c( cHANDLE CreateFile( . i- z( h" ?5 M/ r1 t 9 R- G% ]0 j5 [0 mLPCTSTR lpFileName, // pointer to name of the file , j8 T5 [( i0 p; U! uDWORD dwDesiredAccess, // access (read-write) mode 9 ]/ J' R& i, y$ o' c2 j7 qDWORD dwShareMode, // share mode ' L8 A" A! U5 I" K LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes & [; k# j1 X! A) y% F! `4 vDWORD dwCreationDistribution, // how to create 4 ? M: o0 k; n5 W' kDWORD dwFlagsAndAttributes, // file attributes + D6 o8 r3 K3 D: w+ S ZHANDLE hTemplateFile // handle to file with attributes to copy : v* Y8 ]9 u. B5 I( c ); Z# ~2 Q% D& R- _' L4 A, V( B, z% c 这个API函数用来打开或者创建文件。. |" Q" X) R- U X dwDesiredAccess 应该设置为: 'GENERIC_WRITE OR GENERIC_READ' ,因为需要读写文件; $ Q5 I T2 Q' o \6 Y. `' NdwShareMode = 'FILE_SHARE_WRITE OR FILE_SHARE_READ'1 R, [6 _# U6 g2 c; I6 N* u+ j/ ~ dwCreationDistribution = 'OPEN_EXISTING' 我们只需要打开文件,如果文件不存在函数将返回失败,然后我们给出提示信息。5 v7 ]9 i. |- z8 T, W8 x; \ 可以察看WIN32.HLP获取详细信息,如果你没有这个API库,可以找相关资料。 ( m) u5 L* y; }2 w! a0 F 如你所见,这个API函数返回我们需要文件句柄。我们可以利用这个句柄做下一步:写文件。8 z) y1 U% K/ I6 _ x 4 W7 F0 T. M G; i" s BOOL WriteFile( , h7 I' @9 i6 j) f4 @+ K. y! \6 X0 P# ]HANDLE hFile, // handle to file to write to + U' N' D4 i- h* y' O: Y( e# Y LPCVOID lpBuffer, // pointer to data to write to file , {3 ^' f5 D: _ l' ?! |; N3 v- _ ~/ X6 G DWORD nNumberOfBytesToWrite, // number of bytes to write : q* X9 c @8 |* V- z2 {! w( Y; H9 qLPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written $ {; @, b! o: C5 qLPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O / {8 H- {, n$ N+ `5 N' s9 G: j);8 K o8 B: s. t0 @5 M4 ~ T' B $ P% M+ J) ?9 d, o$ E h$ ] 我们用这个函数把2个字节写入需要打补丁的文件(当然是在正确的位置)[译者:作者的例子是写2个字节,我们做的时候根据需要] ' {/ `2 X' i8 {/ C+ l @ 涉及到的hFile句柄就是CreateFile函数的返回值。! ]2 L# a, j0 ^0 ^/ `/ u' D& a# } 0 D& z. P4 B) L6 K lpOverlapped应该指向一个 OVERLAPPED 结构,我们需要用它设定正确的文件指针。2 G$ o/ R" f- [' Z $ X+ ?! L* H5 M# F typedef struct _OVERLAPPED { // o 8 w J, g. d5 _. q* \ DWORD Internal; ; f, P3 H- R5 c$ c; A( h3 R- e: TDWORD InternalHigh; 8 b# o; _/ r* P4 I DWORD Offset; , O2 I3 z: g. _DWORD OffsetHigh; ( L$ z9 j) j/ q7 C) FHANDLE hEvent; 8 q6 |; T9 @" A, A' k& u7 V( v8 F } OVERLAPPED; ) g: e2 y, n7 L" \0 m4 G Offset的内容是需要写入的地址。(译者:注意不是内存中的虚拟地址) & l/ `8 d' e, ?; L/ i A; v7 T- K# p- i( C& y0 W |0 i 3、目标7 ^0 v3 d% j6 A) Q$ }8 P( } 目标程序是Crackme5.exe,假定我们现在获取不到正确的序列号,而需要对他打补丁(译者:这个程序我也没有,大家知道意思就行) 3 G3 L+ {& U; d' B 当然你肯定是不错的Cracker 并且很快找出来了需要修补的地方:3 n* T8 p3 W8 V: H( V$ `5 ^6 v; ] 6 _! o$ Y# P# H& \( U1 w7 N/ A Offset 53Fh : 74h, 15h -> 90h, 90h # R3 m0 C$ P/ {; i4 I- d2 d8 y7 y' Y2 |, \ }# s# e h/ y2 s, G 以上就是我们所需要的所有信息。4 I# R% P9 J- v5 x: p: V0 N + E6 l+ f" c. Q5 H& g0 R' o; p 4、代码6 H8 I! _: i9 q8 _) A0 J 4 v1 ~1 ~# ]; z* S, D$ c# J, T386" F4 Q. o0 h: r2 D5 s/ V4 f/ e .model flat,stdcall 2 T7 s9 D1 s# N; N9 }; i7 Foption casemap:none : M( J7 A% M" @+ b2 C: j- a! J% }include \masm32\include\windows.inc & j" [: t) `+ v! G9 |: tinclude \masm32\include\user32.inc 5 L4 @) i. D: Pinclude \masm32\include\kernel32.inc: R7 i0 ^8 G8 M: o includelib \masm32\lib\user32.lib& w6 Z' m4 p2 n. i2 c- }! | includelib \masm32\lib\kernel32.lib % U: j4 m+ B1 W) _7 F # m, P8 Q8 b* y( q5 p $ Y1 H( |% U5 ~. _' U .data 5 U c- d6 e: V9 I9 F5 V FileName db "Crackme5.exe",0, l9 i2 F* Y2 Y9 r" _ AppName db "Crackme 5 Patch",0 5 B" v+ r; M2 ]( ~- ?+ I& ^Done db "File patched succesfully !",09 e. w- c; @. G- O NoFile db "Can't find crackme5.exe !",07 u& e* V. b( U) l4 x% S ReFile db "Wrong version of crackme5.exe !",0 * D4 J- X1 h( Z* x9 ^& l8 P0 ^! J* ^WrFile db "Error writing to crackme5.exe !",0 $ S, [- `; R3 ?4 R9 ~RBuffer db 75h, 15h ; R7 J" |, w3 V, E. O* [WBuffer db 90h,90h 4 ~& m( u3 Y3 XOffsetPos OVERLAPPED <NULL,NULL,53Fh,NULL,NULL> 3 X0 ?2 R5 k* x w - ]. x/ Q$ M) P .data? " _! r4 P$ N4 g6 X3 S) c `; R2 @3 | hInstance HINSTANCE ?! c) J# k! I/ X2 r7 j CommandLine LPSTR ? 4 x6 B0 s. p& ohwndname HWND ? , R l8 M0 w8 W T4 @hFile HANDLE ?! T7 T0 W& T1 B' i* g# M; L Numb dd ? F; M2 m, ?9 Q# Z) s" `8 I4 UBuffer db 2 dup(?) 9 p6 V0 ?1 |! |( A' n8 \8 y ( h/ `& \ D' j / H* C. C0 I: e) B6 f3 o9 A+ P9 | .const & K4 f1 W& J5 y/ U( L & T. t2 v, ^0 ]9 L .code - _( u8 c* `- I+ Pstart: , r6 S& f; n4 P6 v 3 k' _" M: q& j: a d: einvoke GetModuleHandleA, NULL$ ?; W% \2 z% `7 M mov hInstance,eax 1 r! F1 s* T7 S9 y! E) z8 O, r0 @) s & A& b2 A& C9 w, a* ~$ Uinvoke CreateFile,ADDR FileName, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL % x$ w# q! q" l% \. E7 i - [6 }9 l8 u# H* U.IF eax!=INVALID_HANDLE_VALUE4 C0 O# G1 Y1 ^8 T8 {4 Q- K0 X# i ) v2 D1 k# @" X, Y. T mov hFile, eax ; 存储文件句柄 . }4 U1 _7 O/ B& } ]9 V2 qInvoke ReadFile, hFile, ADDR Buffer, 2, ADDR Numb, ADDR OffsetPos ; 读取要修改的2个字节 / R" _% U" {9 v" D2 W6 tmov ax, word ptr [Buffer] 9 V( [4 ]: U4 n1 b .IF ax == word ptr [RBuffer] ; 如果判断正确 (75h,15h) 就覆盖他们 :-) - k0 d l- W- ~9 OInvoke WriteFile, hFile, ADDR WBuffer, 2, ADDR Numb, ADDR OffsetPos ;写入新的代码(90h 90h) . C$ Y a) Z- t2 y5 i/ r.IF Numb == 2 ; 如果返回值为 2, 弹出成功信息 2 Q1 F5 C: B% k, X' K. Wpush MB_OK ! D |3 t# A+ ~ ?( [7 p2 y push OFFSET AppName) F, q8 F! M" y# L/ Z; T push OFFSET Done ; 弹出信息地址入栈3 }1 {1 y8 e2 f$ f! o& o .ELSE ;如果返回值不是2,那么弹出错误信息' X) Q. T- Y1 x- S2 Q push MB_OK OR MB_ICONINFORMATION $ x) g) ^& A2 T$ r3 Mpush OFFSET AppName 4 z2 K+ w& m: S1 }, qpush OFFSET WrFile 8 M" M' C) n8 |% m* g9 @7 P( r# u.ENDIF 8 L& y7 H6 b Y% z# i5 p# K$ t.ELSE ; 如果读取的2个字节不正确,弹出文件选择错误信息 8 T( J. q; n" C/ b, H' Npush MB_OK OR MB_ICONINFORMATION * P% e1 e1 |0 O8 m$ K* qpush OFFSET AppName " m4 U( e! z+ e |: ypush OFFSET ReFile 0 V8 n) `% {# h& \ .ENDIF " W8 R) U: I+ e/ T3 z ; G" m/ U* L: p5 e! d2 ]% n* |2 ]& J.ELSE ; 如果未获得文件句柄,弹出文件不存在信息* n @7 _0 A" G# t8 _ push MB_OK OR MB_ICONINFORMATION% Q4 E# ~2 C! D( h% c) A5 ^% J# o push OFFSET AppName( J3 p; ]( W4 j8 V- v push OFFSET NoFile 2 x7 i0 x2 G4 |7 `1 x.ENDIF $ y3 H3 I* @ \7 z# {6 @2 l V$ @% V% R5 V( e" Y( ` push NULL 7 Q8 I# G* X, H$ _9 QCall MessageBox & l! R& l0 g5 G! ~( `invoke CloseHandle, hFile ; 关闭文件 5 Z Z) |8 J7 ?invoke ExitProcess,eax ; 退出; K; n& L6 ]3 K* g4 E+ W/ Q7 n4 K , H7 e" g: j0 l; ?3 D! w, Jend start - ]8 K8 g; a3 s" u+ O4 z4 ? 5 V5 [; D+ \; E3 ]' N. u$ \ 如果你看懂了上面的代码,就可以制作自己的文件补丁。当然也可以编写的更人性化一些,比如添加上选择文件路径的对话框,但那就是另外一个题目了。 ; J% w$ a4 |& v& L! G ! x# F) V0 Z$ g4 T! ^- N var currentpos,timer;/ d; [8 D) D; l) d- J0 ] % c6 }: c% u9 y% n* ?2 c function initialize() 7 {, k9 i; h% K{ # h6 M( r- S+ x- K9 v) U- btimer=setInterval("scrollwindow()",10); ; v4 e7 g5 n& W! }7 e0 w$ S} . L' \7 p1 s8 ]8 K" P* T- f# dfunction sc(){% q- U6 Z7 t( j) Y2 |9 S2 S1 ~6 M clearInterval(timer);7 o0 j0 i+ T- a& ?! s6 w9 I } * x$ l9 ^, S2 F3 P5 x$ Bfunction scrollwindow()- ^& q0 A6 O1 h2 f {7 Q! B% X6 w0 z: J2 T& c- e currentpos=document.body.scrollTop;& D) W' M, B+ c/ y4 W window.scroll(0,++currentpos); 0 L* O! K% {) h" eif (currentpos != document.body.scrollTop) 9 X/ C1 o& `5 }9 f; Hsc(); " t2 N& V( q3 Z. L& q2 x2 N$ w b- |# h}( D# b# Y/ V9 ~+ H document.onmousedown=sc `8 t+ T3 }8 L A5 Q) b1 n document.ondblclick=initialize + V& a x4 L4 k8 [' k0 w : p! U( R$ S* E' i3 v

- M8 [% b4 ?6 x7 b4 A8 p

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-6-11 23:37 , Processed in 0.516970 second(s), 51 queries .

回顶部