|
编者:昨天一个叫aqtata的朋友发给我了个最新的密界文集, 本来想打包下载,可那样很多朋友
/ R K3 N* y1 {会看不到里面的好文章.于是我决定把其中较浅显通俗的一些文章发到文章区,希望能对您有所帮助 ) S$ {0 I/ G- l4 z& N: n
作者 : Detten Detten@tiscali.be
' ^, g' P2 E( L! H5 Z! R来源 : _blank>http://biw.rult.at/7 M8 R: ?7 f2 _2 q
^: y6 L5 P. x7 J B2 }9 R- ?
翻译 : nbw _blank>http://www.vxer.com/
, t' v( Y, p% u* ~2 l; |
( D1 C0 x$ f- b7 Z1、前言
' l7 g: i( k/ F& F7 A 一但破解了一个程序,你就想把成果共享给别人。为了不用把整个破解后的程序上传,你可以制作一个小补丁来修改程序中必要的字节。3 @) ~; b$ W6 P0 N7 Q! v
那如何来写呢?8 ^ d! @0 n$ s
===〉首先找到需要打补丁的文件。大多数补丁认为该文件处在自己当前目录下。1 J: b1 @( M/ e. V, R9 @: E
' \0 C7 q {! Y W===〉如果找到,打开该文件。5 u: O! p0 t4 x& C* l
# n$ c1 U! v& d/ u5 g* |+ k===〉然后检查打开的文件是不是和所破解的文件。比如我们可以检查文件大小,或者随机检查一些字节,或者最好检查将要被修改的字节。
a" P, S8 m- A' J' N# [4 k6 g: D" C5 Z7 ]% [* {
===〉如果以上都无误,我们可以做需要调整 ; ~0 R% O0 \/ K8 \- e' Q
把文件指针移动到指定位置,然后写入新的操作码。5 Y' ~3 Q- S8 O
g" J# b ]: j3 O
===〉关闭文件,给出提示结果。
0 D, n3 u9 x* x
# p( t5 ^' k) G* y% I; m+ |* t下面找一个你破解的文件,然后开始....1 w( H/ f7 w# Y2 _5 k5 G6 j" @
" A- @' U: g( S# ^9 _2 y9 [6 C2、必要的API( @: [3 S7 S. ^2 Y8 U5 |
做这个程序需要用到什么API呢?
% k" O7 p" o6 G* Q; U2 v* F: @# q- f( M7 ?% _( X6 R4 X) o
HANDLE CreateFile(
8 m) C" {" S' A4 R0 T2 q3 N! R2 z1 J3 V- N, D
LPCTSTR lpFileName, // pointer to name of the file 4 U! ^7 D1 |' l! n3 `- r; h
DWORD dwDesiredAccess, // access (read-write) mode
! G/ h' g1 V* b+ N; u wDWORD dwShareMode, // share mode
9 \( @3 s r2 ^; i: pLPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes , ~1 M- [4 m5 M
DWORD dwCreationDistribution, // how to create
& f3 ]3 p; d$ \) VDWORD dwFlagsAndAttributes, // file attributes : e& Z& H5 b+ N0 B# t6 q9 @
HANDLE hTemplateFile // handle to file with attributes to copy ! A6 Q) ^( c' o1 _1 G/ }
);
$ ^/ N& ~. M! s( [& }" f5 c. t8 Y( A8 ?0 M/ n) t- I; F
这个API函数用来打开或者创建文件。( ^: `/ x8 J S* p% a, |
dwDesiredAccess 应该设置为: 'GENERIC_WRITE OR GENERIC_READ' ,因为需要读写文件;1 e' o, K8 n: f; v4 T4 J
dwShareMode = 'FILE_SHARE_WRITE OR FILE_SHARE_READ'
! L- B# i7 i% x4 [dwCreationDistribution = 'OPEN_EXISTING' 我们只需要打开文件,如果文件不存在函数将返回失败,然后我们给出提示信息。' V9 [# Q. v& H" {
可以察看WIN32.HLP获取详细信息,如果你没有这个API库,可以找相关资料。
8 w$ w7 v+ _; t/ S- _' U 如你所见,这个API函数返回我们需要文件句柄。我们可以利用这个句柄做下一步:写文件。
, F, t1 c& K" {% {8 s7 w9 y5 p( H. q9 E G- j
BOOL WriteFile(
7 H& S7 F$ s% U* @5 Y& R& p% h5 uHANDLE hFile, // handle to file to write to
, [6 |0 h6 X/ A4 `LPCVOID lpBuffer, // pointer to data to write to file / c! T' g+ `% D+ d# t/ D2 O8 x) w
DWORD nNumberOfBytesToWrite, // number of bytes to write # U- g7 s( H# I9 d
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
- t9 T& e) I: VLPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O
6 q. U8 J% r, N* A" z4 [+ v M);) S7 [' b! k. e, [: h t6 D
3 ^9 B7 P8 E5 u" f' u6 T 我们用这个函数把2个字节写入需要打补丁的文件(当然是在正确的位置)[译者:作者的例子是写2个字节,我们做的时候根据需要]7 D, E2 h, r; i2 m p: U
涉及到的hFile句柄就是CreateFile函数的返回值。4 v4 j8 [ X0 P; }" ]
$ n; `* O/ S( RlpOverlapped应该指向一个 OVERLAPPED 结构,我们需要用它设定正确的文件指针。
& g; C2 \" |' ^" g2 @! q7 F7 e1 E, R1 u) Z3 ? Y3 h$ k
typedef struct _OVERLAPPED { // o 3 ?6 _ Q) D" c" _# W" w
DWORD Internal;
9 | c6 {1 g/ O& n" n4 vDWORD InternalHigh;
* l* L) j8 Y8 b' B9 JDWORD Offset; $ O; Y: ]4 d( i9 b$ a% Z
DWORD OffsetHigh;
% E9 ]' {3 ~+ E6 J9 ]0 K1 vHANDLE hEvent; ' Z3 k+ X) t$ Q* s1 n. i5 t
} OVERLAPPED;
1 X4 ?' G0 F2 d/ J# P- T& D2 QOffset的内容是需要写入的地址。(译者:注意不是内存中的虚拟地址)
& U3 f1 Q$ Q0 b- T6 X6 L. J' h. m# G' Z* n
3、目标
0 l# v# w& E7 D- H 目标程序是Crackme5.exe,假定我们现在获取不到正确的序列号,而需要对他打补丁(译者:这个程序我也没有,大家知道意思就行)
0 ?9 k( P9 d# R2 k9 D+ {" c5 v- E) t 当然你肯定是不错的Cracker 并且很快找出来了需要修补的地方:5 l1 y& U+ x8 _1 b t
0 g( L9 w& }+ H6 T. S1 b: D- y9 |
Offset 53Fh : 74h, 15h -> 90h, 90h3 w. C, {7 E' x
+ a" s8 c" s U3 c$ u3 Y 以上就是我们所需要的所有信息。
6 o: Z7 m/ @6 @* n) Z" F. a% Y- j( Z( z
4、代码; F* K' d h) b7 p4 d; g! A
- d9 o8 D# e/ n- Q, I, f
3869 n( e; B: P/ L, L( O8 g
.model flat,stdcall
2 M- J" t) L/ M- o Yoption casemap:none % x5 A, m- ^# o
include \masm32\include\windows.inc) J. C2 B8 ~' R6 c
include \masm32\include\user32.inc# _ N k( P! N4 p- {! p
include \masm32\include\kernel32.inc6 ?7 Q& ~% R) `
includelib \masm32\lib\user32.lib
" V; q0 A; [' mincludelib \masm32\lib\kernel32.lib- X" N( c2 E2 ` k- {
" E; Z" D0 j1 l" G7 h; e7 g' Z1 r
.data / J0 f& ~; h" R( ]) U8 W
FileName db "Crackme5.exe",0
$ W3 w. Y0 I WAppName db "Crackme 5 Patch",0
K2 m8 v7 \ Z4 q M1 O4 ^Done db "File patched succesfully !",0
3 ^! s! ?/ D. }4 M% k/ D; ?) dNoFile db "Can't find crackme5.exe !",0
2 b5 n- J8 }' x6 X# \# cReFile db "Wrong version of crackme5.exe !",09 Q) X9 _6 _0 f$ M* l8 u0 k
WrFile db "Error writing to crackme5.exe !",0, h" g- G0 V1 @: Q* E
RBuffer db 75h, 15h2 N' u- K6 K% d+ N
WBuffer db 90h,90h
+ N# i9 s" M/ g" [6 G2 MOffsetPos OVERLAPPED <NULL,NULL,53Fh,NULL,NULL> * ?/ f1 y( A0 W% A5 e+ [8 Y
( B8 T& V5 N$ O+ Z3 i; _" t$ L.data?" Y7 z- @3 G0 W4 N. d7 ?1 P2 N9 |2 }
# ?/ l% c; V( h( ~+ ^. L& fhInstance HINSTANCE ?/ ~) Q5 l* E6 a: y9 d* P7 o
CommandLine LPSTR ?6 _+ f+ l, j3 i( `' u
hwndname HWND ?
- j; W. h; d+ h) C+ o3 Z' s. LhFile HANDLE ?, f, l/ K8 y- q/ j. E, p
Numb dd ?$ {7 ~5 V! U/ _) D5 @4 p/ n8 P, T; C
Buffer db 2 dup(?)
- \) ?5 p6 o: B+ y, g. _' J9 s0 x& a) A Z+ B- ]5 s
3 G7 P( v9 L# D- n: b, a) f.const
y& ?: b: Z: F- h: J3 t
8 Q" x5 }5 B+ m& _, R L4 J2 X/ G.code
$ @' K7 ]: U0 _2 O1 T( I- D8 wstart:
# U+ H8 _' D& Q" o1 G. Q' [$ P) Y- r: b( c3 z8 {" c
invoke GetModuleHandleA, NULL) y; ]- y, o# Y5 d6 o6 _6 H7 S* y
mov hInstance,eax
4 _, m0 X9 z+ |' M B2 `$ I. G- b1 ^7 u. a& i% T
invoke CreateFile,ADDR FileName, GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
7 P0 B( T( B& d6 I1 p: ]: h: b9 |, I/ J, U# L7 F4 h
.IF eax!=INVALID_HANDLE_VALUE
# [% H6 \5 ?$ ]. ^# }( A/ H$ g: C; ]$ k, Y
mov hFile, eax ; 存储文件句柄
( B% N! w" A2 D |( x1 [! KInvoke ReadFile, hFile, ADDR Buffer, 2, ADDR Numb, ADDR OffsetPos ; 读取要修改的2个字节+ ]% E; V2 L* G, F4 m" k* w
mov ax, word ptr [Buffer] 9 u6 k( c- E) G. W! X- Y0 R
.IF ax == word ptr [RBuffer] ; 如果判断正确 (75h,15h) 就覆盖他们 :-)0 B& [. {7 P0 j0 _+ o
Invoke WriteFile, hFile, ADDR WBuffer, 2, ADDR Numb, ADDR OffsetPos ;写入新的代码(90h 90h) b) Z# B) R# L
.IF Numb == 2 ; 如果返回值为 2, 弹出成功信息1 S& }, p, c: o/ R2 C9 e1 |* |$ B
push MB_OK ! R1 [7 L/ t4 T6 n0 x* l
push OFFSET AppName
+ _! y) g- l$ [7 J$ I. D9 qpush OFFSET Done ; 弹出信息地址入栈
4 q: n+ b1 y/ w0 g [0 H2 I.ELSE ;如果返回值不是2,那么弹出错误信息# t0 U5 H _; y0 M" c# c
push MB_OK OR MB_ICONINFORMATION* m- Y4 F+ O# l3 u4 v. m4 b1 X
push OFFSET AppName
g, |; A' O$ ]% a3 ~% H& ]' \push OFFSET WrFile7 S4 ~- B4 Z- ^
.ENDIF ' S B; ~% P8 g- m7 e3 i7 e
.ELSE ; 如果读取的2个字节不正确,弹出文件选择错误信息
* Y5 [2 ]: l' k' Ypush MB_OK OR MB_ICONINFORMATION& C# @6 K0 O, ^ w
push OFFSET AppName
$ e4 P# c( v9 e" d+ U. Y; B# ypush OFFSET ReFile 8 g7 v6 e3 h7 Z& Y" x
.ENDIF
1 L S* i' b/ S$ R& a. M/ e8 n0 N7 S. y# B# ?! y# D
.ELSE ; 如果未获得文件句柄,弹出文件不存在信息: n" u9 ~7 R6 [4 d0 ~
push MB_OK OR MB_ICONINFORMATION
. f/ e* S D) e! N7 opush OFFSET AppName, I) V* B7 u$ O! e8 s3 c8 t
push OFFSET NoFile
) t+ {2 \6 G7 a3 }% d) Q.ENDIF" U. h) p$ s3 D- s9 |1 S: B' y+ X
7 \- V! }1 |! ]; }* K2 Dpush NULL, R4 H6 p" k+ k% T6 s7 j
Call MessageBox8 x% z1 {+ w$ _7 |& I; n1 @
invoke CloseHandle, hFile ; 关闭文件
4 W8 y! k' j1 K% q) c4 D# F' B! Ninvoke ExitProcess,eax ; 退出
/ s4 T/ ~8 q4 x$ O: x: s. W
; \/ o/ `% } V. a# I' o$ Gend start
7 o1 x2 d/ X2 R; |5 X& w0 n+ T, N: L + P" J9 O2 {4 B- X
如果你看懂了上面的代码,就可以制作自己的文件补丁。当然也可以编写的更人性化一些,比如添加上选择文件路径的对话框,但那就是另外一个题目了。
4 q# I6 X% v y# @9 s$ q9 q
) n7 m9 o8 k7 D6 Svar currentpos,timer;: _* C& Y( \% s5 o+ l
2 i/ \: V) l8 a/ i; z3 ofunction initialize()' [# E. O; y0 q. j; |$ U- \
{
0 W: ~+ V5 r6 a: N( l& |# m- W$ E; {timer=setInterval("scrollwindow()",10);# }7 u7 u7 S2 ~* o
}
* g6 S a9 P+ M! E- r& ~) Ffunction sc(){- g$ r8 E2 L# U. F z( K6 M: R
clearInterval(timer);
2 R7 C3 ~" q: W6 P3 B! e _- B: d}
9 S4 P7 X7 Y1 | vfunction scrollwindow()( }8 ?( j% N9 V# `$ T$ B
{
2 \2 x% D% ^) |/ W% Tcurrentpos=document.body.scrollTop;
# X9 H0 B3 x5 ^3 ]1 wwindow.scroll(0,++currentpos);3 |# `- Z/ S$ ^% W2 x
if (currentpos != document.body.scrollTop)
! \( o; R9 d) L! x/ Z2 ~# m0 o1 tsc();
+ u/ v' \+ Q/ z. J- v}4 D' x+ D$ A' l0 w
document.onmousedown=sc
) Z" Y$ d- B0 ]" _+ vdocument.ondblclick=initialize
2 i4 T* A% Z7 C4 P* b
/ U( {: y( N& ?% X$ y
& \. `3 D5 S- i5 Z |