QQ登录

只需要一步,快速开始

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

编写一个文件补丁

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

编者:昨天一个叫aqtata的朋友发给我了个最新的密界文集, 本来想打包下载,可那样很多朋友 8 b! l$ t3 A0 `' G7 t; C/ G7 S# v会看不到里面的好文章.于是我决定把其中较浅显通俗的一些文章发到文章区,希望能对您有所帮助

Q9 s2 X" f$ G( h0 h/ ?$ R

作者 : Detten Detten@tiscali.be ! z. C. o' Z* {, y! L0 C B: l 来源 : _blank>http://biw.rult.at/ j; o8 t( b, ?8 r5 e# S- X/ ? ( F0 d" I- W: X# h翻译 : nbw _blank>http://www.vxer.com/ 0 y- x8 z; L; ]2 L) G ! K$ a% F7 {! U6 ~6 R, o1、前言7 R9 t& r7 o" ^' H4 c) | 一但破解了一个程序,你就想把成果共享给别人。为了不用把整个破解后的程序上传,你可以制作一个小补丁来修改程序中必要的字节。9 w$ g+ t( J0 H) c! ` 那如何来写呢? 5 m1 N+ h* n3 W5 M===〉首先找到需要打补丁的文件。大多数补丁认为该文件处在自己当前目录下。 9 y! ~) Y |% { ]9 H# l3 F5 r* z( f0 f' u5 C ===〉如果找到,打开该文件。 ( o2 k. ?* k/ n5 W E4 f6 t! {& d6 J# o3 `+ F ===〉然后检查打开的文件是不是和所破解的文件。比如我们可以检查文件大小,或者随机检查一些字节,或者最好检查将要被修改的字节。1 }2 ^' j6 \0 ]0 z ' Q$ |9 k: M2 N# j/ a===〉如果以上都无误,我们可以做需要调整 # r, b; A9 Z3 v/ [) ~6 \ 把文件指针移动到指定位置,然后写入新的操作码。 ) L/ P# {0 a8 \* U1 O/ U$ l( m p1 I6 r$ L# g' u* z- z2 I ===〉关闭文件,给出提示结果。 r- F; r) F4 `9 X- j9 o* E* B# q8 r; M! F2 D( g$ ?- `0 l5 [ 下面找一个你破解的文件,然后开始..... d8 a, ^: {4 T2 S 7 D( P/ {& e+ o! U( E! q9 }2、必要的API) y8 b7 M- P8 X. Y8 U# W 做这个程序需要用到什么API呢? ! @6 h! Y+ g) |6 Q 8 L( \: y, s0 o( o8 t. F* i, m" dHANDLE CreateFile( 8 l: U( K0 l" O. r; W2 I D 9 c2 d4 ?1 ^2 | T( \LPCTSTR lpFileName, // pointer to name of the file - t3 u; f. W# v2 G) B7 |' { `! H DWORD dwDesiredAccess, // access (read-write) mode 6 K$ t: L% u, w. j9 p' ^- h DWORD dwShareMode, // share mode 9 Q5 V9 U2 Y" [+ RLPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes * r# K* A. T% i0 e* T/ U/ h7 m2 D DWORD dwCreationDistribution, // how to create / |) j# E- s P7 ]9 k DWORD dwFlagsAndAttributes, // file attributes ' }0 B: E" r2 { HANDLE hTemplateFile // handle to file with attributes to copy % E: }# n' I5 |+ G3 r );0 N% p) r* Q. D( \8 q + } E5 b9 M% S r 这个API函数用来打开或者创建文件。$ I' M. r/ |) @. {+ _+ k1 L. k dwDesiredAccess 应该设置为: 'GENERIC_WRITE OR GENERIC_READ' ,因为需要读写文件;; e: M1 m' i9 ?* c dwShareMode = 'FILE_SHARE_WRITE OR FILE_SHARE_READ'# z: S7 V) w6 R& j& @$ \ dwCreationDistribution = 'OPEN_EXISTING' 我们只需要打开文件,如果文件不存在函数将返回失败,然后我们给出提示信息。/ {1 C* }1 w; o3 i2 S# R 可以察看WIN32.HLP获取详细信息,如果你没有这个API库,可以找相关资料。 + A5 o# ?; {6 A$ @9 W8 c: ^ 如你所见,这个API函数返回我们需要文件句柄。我们可以利用这个句柄做下一步:写文件。 4 u7 ^; H' L2 t5 n $ X6 b+ \: T7 |5 H" }5 P: j1 ]BOOL WriteFile( + o2 d. u1 u; i1 c9 s$ k# _4 j HANDLE hFile, // handle to file to write to & E8 |! I3 x2 X* Z. PLPCVOID lpBuffer, // pointer to data to write to file ) N8 l+ g8 _7 |- O5 f DWORD nNumberOfBytesToWrite, // number of bytes to write . n) h( c* o2 O" J LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written . w4 p6 V; [6 t" S& m! s1 tLPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O, {) I: p6 H) D, w- u, c );1 ^- L! A/ d. o# F% t6 j 4 \' ^' \# x4 w9 g; _ 我们用这个函数把2个字节写入需要打补丁的文件(当然是在正确的位置)[译者:作者的例子是写2个字节,我们做的时候根据需要] 0 j( b; P$ b0 Y O 涉及到的hFile句柄就是CreateFile函数的返回值。 4 _: s, B; _. C- [/ ^2 W9 A: o. N9 r! U+ N" D5 ] lpOverlapped应该指向一个 OVERLAPPED 结构,我们需要用它设定正确的文件指针。; f6 x/ |9 j w $ w2 d8 E: n+ ~) v typedef struct _OVERLAPPED { // o ) c9 _$ W* b# \+ X/ {3 D7 f: ^DWORD Internal; % }* o" u8 g3 l" q: @ DWORD InternalHigh; ; _5 x2 ?+ f3 t5 V' ?; zDWORD Offset; 8 x5 E$ ]- Q2 i) Z* q& tDWORD OffsetHigh; & l. {& w4 x9 H0 c' z4 j) |9 x HANDLE hEvent; . l2 Z1 S+ p" T+ ]} OVERLAPPED; : ~3 m6 J! p$ }) t1 { Offset的内容是需要写入的地址。(译者:注意不是内存中的虚拟地址) # {5 k Q. }+ X8 x5 R ( Z6 [5 s+ Q6 f. _7 m4 T; u( Y5 \' }* c; ?3、目标 . x$ g0 h: l1 i( N( T% a& e+ \ 目标程序是Crackme5.exe,假定我们现在获取不到正确的序列号,而需要对他打补丁(译者:这个程序我也没有,大家知道意思就行) . ]& c( F/ `+ Y6 n 当然你肯定是不错的Cracker 并且很快找出来了需要修补的地方:) O5 B' h& F8 i- k, T: T # b% L5 I- _* X- V% X% e Offset 53Fh : 74h, 15h -> 90h, 90h ) t$ ~! v6 K0 z w6 a3 o! ?/ X$ { S, Z: }+ U 以上就是我们所需要的所有信息。. X( ^. b! q: G) A6 I6 Y 2 F+ \5 `( y1 ^% v/ Q( { 4、代码 5 f7 i) K+ G9 Z- ^, o7 ]' y# f; k2 d, ~, W5 [ [8 o. \' Y) U 386( ^9 `# I5 F9 c2 O5 w. z9 ? .model flat,stdcall1 _, N$ U: ]+ N3 y option casemap:none & `1 B! }( o3 G {! O include \masm32\include\windows.inc1 D, {# Z3 W) w5 Q1 C" A include \masm32\include\user32.inc % y1 d9 G/ `0 b5 J0 a5 z9 V3 g& jinclude \masm32\include\kernel32.inc" U3 | b: p: G includelib \masm32\lib\user32.lib & [' g- O; u% b. X3 a& ~7 A! [includelib \masm32\lib\kernel32.lib& J. g6 K* P4 k+ Z; ` % @$ f9 N3 U* e' U- I 5 i+ P8 F' D4 z .data 4 n0 e3 G9 T+ ]2 m7 G. [FileName db "Crackme5.exe",0 3 W; y* |: n$ M* C* z& _AppName db "Crackme 5 Patch",0 0 l( Q; k3 Y9 |4 k0 `& O# pDone db "File patched succesfully !",0 7 j/ @% w, v& Q5 m& u, V* LNoFile db "Can't find crackme5.exe !",0. ?; m) [: S# x+ p. C+ J1 l ReFile db "Wrong version of crackme5.exe !",0 # `! S/ S9 @ I8 b% q/ l% K: l5 zWrFile db "Error writing to crackme5.exe !",0 - x. h, D1 v$ v% wRBuffer db 75h, 15h. s& n& x- d) |' ?! M4 ^, m% @5 i6 M WBuffer db 90h,90h : o2 _1 v6 H$ i$ j% Q9 pOffsetPos OVERLAPPED <NULL,NULL,53Fh,NULL,NULL> , l1 E5 q& D5 U0 D' a 5 m- W) }, L3 O g8 {# t) G5 p8 C.data? & W! s2 e( A" e% L7 ^5 x( j . K# |" ^# s! ]7 b `hInstance HINSTANCE ?$ _& n0 r0 a P$ s4 A CommandLine LPSTR ? ( Z j2 z. {$ Z% Z0 U* r9 vhwndname HWND ? - e. _, O% R" C& YhFile HANDLE ?: u/ \% U# [9 q' T- E, u$ T0 a8 k' I Numb dd ? 8 h& c' h5 T _Buffer db 2 dup(?) / ~( v: u% e. ?) j 6 H% @/ D6 H! A! d2 { : o- M: W" m. l# }& ]$ K6 V.const 6 B! K. ~1 c: d! P - H% L! I+ Y0 W: l: X5 e.code5 Z2 a2 N; } U9 l/ s8 ] start:! M3 c" p! J* k# v 1 b6 Y! |3 p6 d( y2 f% M invoke GetModuleHandleA, NULL$ e H8 k" p" s6 X7 o! y mov hInstance,eax ' j7 B4 e% R1 D- i! F# b - e' O; b: @- h" b# M2 z invoke CreateFile,ADDR FileName, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL 5 E, o; Z+ N' O }* A! W* n ~) q" R* h- E3 b* o .IF eax!=INVALID_HANDLE_VALUE9 y% a$ b/ g, U( A7 m' g 9 r' w# z$ k+ l6 h% P mov hFile, eax ; 存储文件句柄 1 s" D0 K: i/ j! q/ @8 T7 FInvoke ReadFile, hFile, ADDR Buffer, 2, ADDR Numb, ADDR OffsetPos ; 读取要修改的2个字节) h v- T5 x$ v4 R mov ax, word ptr [Buffer] 7 L! |5 E( x3 i3 m; M/ H0 x5 L .IF ax == word ptr [RBuffer] ; 如果判断正确 (75h,15h) 就覆盖他们 :-) ) I, |+ a$ h/ DInvoke WriteFile, hFile, ADDR WBuffer, 2, ADDR Numb, ADDR OffsetPos ;写入新的代码(90h 90h), T/ \; f* i% I7 B .IF Numb == 2 ; 如果返回值为 2, 弹出成功信息 ) O: b6 M$ W7 t" gpush MB_OK 6 \+ U x, @8 y- h7 s' ] push OFFSET AppName. Q, Y% @$ o- M! k/ i push OFFSET Done ; 弹出信息地址入栈5 @& R g5 k3 n% l' M/ | .ELSE ;如果返回值不是2,那么弹出错误信息 7 m y4 ~% n3 j$ ?push MB_OK OR MB_ICONINFORMATION 1 I0 Y/ O7 |. S) Dpush OFFSET AppName, [2 ^: p6 E9 @0 L' U8 ]: \6 K push OFFSET WrFile# a2 j" d$ B* ]- ^5 Y4 x$ V, M .ENDIF * B9 ^3 Q( |3 [% G1 b0 Y .ELSE ; 如果读取的2个字节不正确,弹出文件选择错误信息1 Z0 Z" P# u5 M8 P: P/ @/ ] push MB_OK OR MB_ICONINFORMATION* E7 c2 E& d( E( F7 q* [$ d push OFFSET AppName$ e- ^& h( q- d. I% n( A( ^ push OFFSET ReFile / r z6 l, X: v& ^0 ?4 g .ENDIF ' q0 ~; z2 a: J0 @' U+ i3 U4 A + ]# @; r- R2 x+ p+ O6 s% u.ELSE ; 如果未获得文件句柄,弹出文件不存在信息 , u% V; K ]7 Q0 p( x+ l$ _( @push MB_OK OR MB_ICONINFORMATION4 C" d: X3 ]9 [( v& }7 q push OFFSET AppName+ N( @2 W6 L+ X push OFFSET NoFile ( p# L" i/ t* h) [% i* r.ENDIF' V0 ~3 S) g$ Y: J9 A - n- h/ f$ o: O q, Z, kpush NULL7 K/ Q8 B: Z- a Call MessageBox3 @) q% V. G5 N: F3 y5 c invoke CloseHandle, hFile ; 关闭文件2 h, r+ e ?8 b2 \, K invoke ExitProcess,eax ; 退出' J/ s( x2 [# L; q( h% t ( l. O3 A6 o8 Lend start: O# ?* f) \1 r% {- t 2 t) {# M5 v' N! d. R 如果你看懂了上面的代码,就可以制作自己的文件补丁。当然也可以编写的更人性化一些,比如添加上选择文件路径的对话框,但那就是另外一个题目了。 3 L$ ~( Q+ g. Q, x) N" R8 y# D/ k p- t) w1 q$ K4 N& S var currentpos,timer;' U7 K9 C& n: n: n3 q$ w 5 s6 U) W. |% V6 d$ K function initialize() + G7 x/ }# g& \( O{5 V: Y7 A' E- i timer=setInterval("scrollwindow()",10); ) `% h/ x i& d: X+ _}9 X% \3 W$ B1 A* f function sc(){+ ?( c% x( L7 j6 x7 r clearInterval(timer); $ T" Y- `( B6 z+ x- F7 k t} 4 {( C: \9 N* N+ |function scrollwindow(): ?8 ~, Y( a6 n( o+ T, }/ R- | {' ?' U- H8 l. v5 X3 P& E( T4 W currentpos=document.body.scrollTop;" c8 e) {5 e6 k4 P( j4 e9 S* R window.scroll(0,++currentpos);. X: v- O% g- V# Z. f4 z! y' K' Z if (currentpos != document.body.scrollTop) ' s1 S- s. a& o/ N& j, r" ]+ Esc(); 3 i1 t9 n0 \4 o7 C D$ o' x, r}, o, |5 ?. n# N# Z1 Y7 c, Q document.onmousedown=sc k1 K3 }+ c4 d# c8 O) Pdocument.ondblclick=initialize + l+ ]+ N% h7 w8 d% x 3 ?* u( ^2 P5 `5 v

' ^2 R- E2 r* R, P+ x" G1 d5 }

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-13 12:39 , Processed in 0.389310 second(s), 52 queries .

回顶部