QQ登录

只需要一步,快速开始

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

编写一个文件补丁

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

编者:昨天一个叫aqtata的朋友发给我了个最新的密界文集, 本来想打包下载,可那样很多朋友9 I5 ]; R/ V- V9 S; D% @1 b 会看不到里面的好文章.于是我决定把其中较浅显通俗的一些文章发到文章区,希望能对您有所帮助

' q" L+ [! t# H, Q# j; x% I) {

作者 : Detten Detten@tiscali.be 3 Z, B1 z; e9 b8 W" D) G 来源 : _blank>http://biw.rult.at/0 y1 r+ g% {& Q9 [; G- Z# w0 b- y ( \ J$ X$ n7 L9 O! h8 S; H翻译 : nbw _blank>http://www.vxer.com/ 4 a7 x6 i+ m" c: m) P9 m + x8 ~: x, ^5 h. A. _0 @1、前言 . `3 X6 i& F' G9 {; x. L# |! s 一但破解了一个程序,你就想把成果共享给别人。为了不用把整个破解后的程序上传,你可以制作一个小补丁来修改程序中必要的字节。$ J- C- N& ?* [& r& H& m 那如何来写呢?9 i4 R. k/ Q+ r" X$ d ===〉首先找到需要打补丁的文件。大多数补丁认为该文件处在自己当前目录下。0 O4 N; s9 C' O# T- T5 A & d8 g2 |% ^" J8 h ===〉如果找到,打开该文件。7 ?7 J; V9 q7 q: A m) m- d, P) V7 C% v. O) \0 d5 c1 c===〉然后检查打开的文件是不是和所破解的文件。比如我们可以检查文件大小,或者随机检查一些字节,或者最好检查将要被修改的字节。 . W% G$ o1 R% z# J 1 g' U% y! h7 O0 P7 F===〉如果以上都无误,我们可以做需要调整 ; r" T x. R K( \( d0 Z7 z 把文件指针移动到指定位置,然后写入新的操作码。 $ M" f6 ~% }0 Q K1 _ ; q: N$ [! u" Z: q# t [2 I7 [===〉关闭文件,给出提示结果。 ; I' |1 |% `$ t5 m$ k8 s- J) n; v; k 下面找一个你破解的文件,然后开始.... . E' A! T+ T; L5 P' L" X4 h1 k j 7 b4 [8 O" P3 Q: y: j7 O7 h, _2、必要的API" q+ [6 n: i: S 做这个程序需要用到什么API呢?' f4 I' D/ l0 r* x/ o) |8 ? * P+ k. d1 r# o1 W/ QHANDLE CreateFile( " i7 }/ o+ `3 s3 z! s J4 J 2 c1 o- p' U; [5 P LPCTSTR lpFileName, // pointer to name of the file 0 h8 A) J+ y# ]$ u DWORD dwDesiredAccess, // access (read-write) mode / \5 \& p* T9 o9 S7 t# }( EDWORD dwShareMode, // share mode 4 C, F* y) w9 L* z5 c LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes ) H7 |) j+ m0 Q3 L( f5 s* u HDWORD dwCreationDistribution, // how to create , ?+ H7 G( g0 S1 `- C' D& U9 U DWORD dwFlagsAndAttributes, // file attributes % E" x. o" p8 Z6 w& Y" G0 B7 GHANDLE hTemplateFile // handle to file with attributes to copy 5 C1 Y$ F7 f) q, O ); * d/ ~! H/ x- }) d# D # L6 n& A2 y ~ 这个API函数用来打开或者创建文件。 9 B( f+ {) U1 Q' @dwDesiredAccess 应该设置为: 'GENERIC_WRITE OR GENERIC_READ' ,因为需要读写文件; . L3 u$ Z8 \8 H" mdwShareMode = 'FILE_SHARE_WRITE OR FILE_SHARE_READ' # w' o- c _0 T) YdwCreationDistribution = 'OPEN_EXISTING' 我们只需要打开文件,如果文件不存在函数将返回失败,然后我们给出提示信息。 x: ?0 Y# H* W) _: ~ 可以察看WIN32.HLP获取详细信息,如果你没有这个API库,可以找相关资料。* C: ?8 B% f5 G4 A 如你所见,这个API函数返回我们需要文件句柄。我们可以利用这个句柄做下一步:写文件。2 O3 s% J K! E0 I3 [( v* n7 D0 C ( t' S( J$ U8 D) `7 \! e. V: u: G BOOL WriteFile( ; M- t g; k1 rHANDLE hFile, // handle to file to write to + e5 C. ?7 E# Q; C5 vLPCVOID lpBuffer, // pointer to data to write to file 2 F6 A: v2 M6 C9 j( V7 f2 Z DWORD nNumberOfBytesToWrite, // number of bytes to write ' h- H" H( g# d1 Q- eLPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written ( z6 m4 {8 }, V8 H, M$ f LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O 3 Q7 x* e- a$ U$ K: ^); 1 ~8 \$ A2 f; j+ j! k4 C# r i: H5 Q5 X% Y) F$ Q 我们用这个函数把2个字节写入需要打补丁的文件(当然是在正确的位置)[译者:作者的例子是写2个字节,我们做的时候根据需要]! ]+ g9 X# c F0 c3 B, m 涉及到的hFile句柄就是CreateFile函数的返回值。' ?) z5 E; p- e4 k6 c! I1 Y# q3 N / B P# F( j) s8 g( R6 slpOverlapped应该指向一个 OVERLAPPED 结构,我们需要用它设定正确的文件指针。 # o6 B. Q8 H" s4 b' y. f$ t; b6 H0 x1 P% p) u typedef struct _OVERLAPPED { // o , U% P1 {# F3 U/ x1 l; q$ | DWORD Internal; & H7 R/ j. ?! n, i- e, E( ^# qDWORD InternalHigh; 3 p+ ~! Y0 M& ]2 qDWORD Offset; " C U. S; K/ @3 m# ^# tDWORD OffsetHigh; ) F4 H* C9 A& \1 l4 [' N! V HANDLE hEvent; . Y7 h" w5 f" W `6 N9 z: ]} OVERLAPPED; 0 U. Q6 T- H* |- R, ]Offset的内容是需要写入的地址。(译者:注意不是内存中的虚拟地址) 8 W, u3 `/ E: D: Y3 G! e+ i1 B/ Z% F, O- S }/ K1 i. _ 3、目标9 M( H) e! K5 k1 l: v6 j 目标程序是Crackme5.exe,假定我们现在获取不到正确的序列号,而需要对他打补丁(译者:这个程序我也没有,大家知道意思就行) 4 ?; B. K$ V. L1 J z* T& m 当然你肯定是不错的Cracker 并且很快找出来了需要修补的地方: # q7 E v' C# `/ @0 b + q) ]% B ?/ j. d1 OOffset 53Fh : 74h, 15h -> 90h, 90h 5 s$ ~. U& N2 u$ i2 s0 e9 |( T _$ Q3 j7 ?; X% e 以上就是我们所需要的所有信息。4 z0 T) A f% Q9 N! q" _ & I6 S% @9 \4 A: q, O1 [4、代码) v4 x9 h$ ?3 D: T! s+ } 2 {% L/ \9 K7 {' R1 P- i6 u6 D386# f! ]2 r X2 g3 Q6 N) @ .model flat,stdcall ' z$ s2 \$ t2 X2 F0 Joption casemap:none & s0 ^* N$ ?: a4 h8 v4 Pinclude \masm32\include\windows.inc0 H/ T! D5 D' j7 G2 g% U* O, o/ M include \masm32\include\user32.inc7 ^! ^2 Q4 H, L4 X* z include \masm32\include\kernel32.inc 8 r2 r: n' Z: y9 G+ E+ {* {* Bincludelib \masm32\lib\user32.lib * e9 [6 W9 M, A# e/ I+ u6 O) ~; R# qincludelib \masm32\lib\kernel32.lib4 j) b I5 `& ~* A6 ~9 l9 A 9 ^ ~. H) ?( k% l7 h" R , u5 y+ y. _3 q7 n' F, A; V .data % F6 R- ^" y9 s& }( S0 b6 d2 kFileName db "Crackme5.exe",0 2 w0 V( m/ I3 Q% BAppName db "Crackme 5 Patch",00 x- e9 i6 B k! K8 `, k Done db "File patched succesfully !",0: z" W! b! g* }1 I1 m6 j9 ~+ p NoFile db "Can't find crackme5.exe !",0 ' e3 T: A/ C0 u3 M j ]- h$ U4 jReFile db "Wrong version of crackme5.exe !",0 , x Z/ D+ F) G# tWrFile db "Error writing to crackme5.exe !",0! @/ h! h; G0 t RBuffer db 75h, 15h 6 s0 \+ L2 u9 X* ~1 M# C; ?WBuffer db 90h,90h4 F2 B3 Z6 x9 w9 Q5 u OffsetPos OVERLAPPED <NULL,NULL,53Fh,NULL,NULL> 5 R9 r9 i9 b% z9 J7 g # K' U9 w* g1 m: Z' g* x" [ .data? q# ^) ~. n4 Z8 M$ t 4 F a' _6 g: h; p) G6 JhInstance HINSTANCE ?( x: {) ^. V M9 d CommandLine LPSTR ?3 e+ P0 x. E! Q3 G. _ hwndname HWND ?- v) q) k Y# p, o4 _ \" B hFile HANDLE ?9 z9 A1 L4 x2 K& u5 P1 I/ g( g# J) b Numb dd ? % K9 M% C" @; ?: N2 Z8 r3 ^" kBuffer db 2 dup(?) , t* [" @2 c; ?5 M8 @ L2 F/ f+ C. S$ ^6 Z ( F6 S3 P" S/ J4 F6 u( T$ ^" j.const' J8 ?5 d+ g' U* u& Y, |5 y ' X3 Y# h- L, ]5 c7 N* @0 h.code- ]) J |- V2 l+ u start:# J( S# r" k4 t8 L; [0 U7 | 1 g' D( G! s* ~" k* L: j# U invoke GetModuleHandleA, NULL8 J F$ w4 |) e* M mov hInstance,eax * ~! s% X9 N. H! p5 E 2 V% W+ @4 r% Q2 u& Ninvoke CreateFile,ADDR FileName, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL & u+ ^9 v+ h0 L2 {$ A( t) x 6 a* l9 G, N4 L+ n .IF eax!=INVALID_HANDLE_VALUE 9 [. `+ j v) z8 x5 w, j+ Y( u & S/ e5 @2 S' L; Bmov hFile, eax ; 存储文件句柄 7 p; m: i! }: b2 |. A2 i% ZInvoke ReadFile, hFile, ADDR Buffer, 2, ADDR Numb, ADDR OffsetPos ; 读取要修改的2个字节 ( R& Q, b4 @. o( \mov ax, word ptr [Buffer] # e7 u9 f$ H0 w J* w.IF ax == word ptr [RBuffer] ; 如果判断正确 (75h,15h) 就覆盖他们 :-)6 }7 Q4 c! e9 Y Invoke WriteFile, hFile, ADDR WBuffer, 2, ADDR Numb, ADDR OffsetPos ;写入新的代码(90h 90h)& X' f0 H' l5 {; m) t6 t; M .IF Numb == 2 ; 如果返回值为 2, 弹出成功信息 8 C* _ K+ g3 j, {7 l) B+ ?push MB_OK ; O+ Z+ M# J$ f: Z2 N8 zpush OFFSET AppName $ ^ n' G: A# H& g6 E$ n% @push OFFSET Done ; 弹出信息地址入栈 ( j. C5 p7 k1 |3 ?" a.ELSE ;如果返回值不是2,那么弹出错误信息 1 h9 J: U. k) H/ n5 Q5 l# p* r- dpush MB_OK OR MB_ICONINFORMATION0 _" N- ~2 z6 O4 ~ R: u push OFFSET AppName 1 T5 A# O# L5 [* L2 ~$ S, epush OFFSET WrFile/ y; R1 d# u, C8 w# Y) h' s- \ .ENDIF ( n7 O, m# [# u d4 {: t4 l .ELSE ; 如果读取的2个字节不正确,弹出文件选择错误信息 + @5 t7 B! b4 W) l- Lpush MB_OK OR MB_ICONINFORMATION+ m( n# I% [4 e' f+ o- K A8 o push OFFSET AppName ! w+ u0 m1 k/ h! F9 ?push OFFSET ReFile * }' k. K- h2 U; b .ENDIF ! f' K% J: u$ j: f% p- J2 l; K* I: ?/ O4 [- L1 o, R% I6 d T. x .ELSE ; 如果未获得文件句柄,弹出文件不存在信息8 W3 W% A P) K! r8 \: A+ o push MB_OK OR MB_ICONINFORMATION # s$ W5 ~3 a7 Y& o/ x! npush OFFSET AppName- {5 h6 c. G" c5 P) I4 J push OFFSET NoFile 4 f' ?& |+ @3 @5 u .ENDIF, ^7 a8 Y7 K$ A2 i 9 X3 J$ t! U# i0 ]2 |% Lpush NULL + D4 F. g# u7 E5 f% ZCall MessageBox ) J' d1 B2 }$ w4 `; V* H( W- t2 jinvoke CloseHandle, hFile ; 关闭文件' X$ U3 n3 `/ ?- p# F/ J invoke ExitProcess,eax ; 退出 8 g3 d. A, Y7 I$ E8 w& j 4 M. W1 H3 B" v1 t9 Kend start: E, K, z; G ~ , J" P2 l1 W" k 如果你看懂了上面的代码,就可以制作自己的文件补丁。当然也可以编写的更人性化一些,比如添加上选择文件路径的对话框,但那就是另外一个题目了。 / h2 `8 e+ }6 v# F2 W 0 N0 m5 V% h8 E$ X% V6 [var currentpos,timer;1 c; [$ s3 k# g4 w2 L/ M W$ R# j( C1 v9 ]function initialize() 2 i. u* d) W1 `9 o, Y, H4 ?( ]{. G7 n8 K+ t( D, M% } timer=setInterval("scrollwindow()",10);/ ?5 |- j+ ` P& z0 w } * h7 D3 m1 y3 h6 P9 sfunction sc(){0 d! w, H+ c# d( X& H1 e n( e( r clearInterval(timer);9 T% O5 d! x: [2 y0 t6 z% O } 5 V& H! `$ q* W8 Bfunction scrollwindow()% g" A/ d; r' B% {' l {! d5 V7 o; v8 |; X+ L. @! q( c" f1 R currentpos=document.body.scrollTop;: d! B3 R* q0 M window.scroll(0,++currentpos); 1 {/ G# h+ E+ }6 V* q% q7 K) t8 bif (currentpos != document.body.scrollTop) ; h6 ^5 M5 S( I6 k5 `" D# u% Lsc(); ! d( d! \) o$ L m) a2 \4 F}4 P( _) s- L+ g# g7 N9 y document.onmousedown=sc0 t/ s8 V4 p1 Y5 b, I document.ondblclick=initialize. K; F& ?* B1 Y5 [. s 6 V ]5 g6 ^) N! P7 M* P8 Y8 s8 y

1 r( {* @' e# [! d2 C

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-4-19 20:00 , Processed in 0.415175 second(s), 51 queries .

回顶部