本帖最后由 shane007 于 2023-8-25 17:31 编辑 ; F2 L: [: S' m0 b- F
# @- S- N' t5 v( Q1 E x" Z; l
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
5 }) [. N& u4 @2 O3 r% H# t游戏应该实际只用了其中1个,暂时作下记录。
! p( A7 D6 R. H/ B: x
! m& }7 ^: p+ I- r* `DirectDraw是由bin目录下的ddraw2d.dll来完成的。5 x& D4 \: G ~( g7 E1 ?
以下是一处的初始化代码$ h; ~, V5 H6 I5 y9 ^$ G# @
- CSpace:10015015
+ y0 x9 H _6 u - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
% ^; K# X1 j+ N3 c, G1 b5 x - CSpace:10015015 mov [ebp+lpGUID], 0
8 |& r, K3 g9 m6 J @3 R - CSpace:1001501C mov eax, [ebp+dwNewLong]4 ?0 ~) j& `% X+ J) d; n8 ^# g
- CSpace:1001501F mov ecx, [eax+230h]0 K& f5 S$ q9 @/ {+ i+ v9 e8 A
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
7 K* {$ u" C; T" [7 W X" ^1 z - CSpace:10015029 test edx, edx
* N" t, l1 D+ k# i5 k/ w* w - CSpace:1001502B jnz short loc_1001503C, ^9 h2 ^# v/ d
- CSpace:1001502D mov eax, [ebp+dwNewLong] `3 }* v1 @ E! n I; a+ z6 f; i
- CSpace:10015030 mov ecx, [eax+230h]2 y7 C6 M6 v! w' L5 x
- CSpace:10015036 add ecx, 8' _2 l5 O- d9 f0 N; w* t
- CSpace:10015039 mov [ebp+lpGUID], ecx
3 Y1 p$ w! n6 }( f3 r; W0 R" Y3 Y - CSpace:1001503C, {2 @+ ]% T% k5 b! e; [4 D
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j8 K$ S* G/ [0 ?5 V" P3 N
- CSpace:1001503C mov eax, [ebp+dwNewLong]3 Z* T. G! M: L: D
- CSpace:1001503F mov ecx, [eax+230h]7 s2 x- u4 d. U N
- CSpace:10015045 mov edx, [ecx+1Ch]. _( _# D& T: @4 E6 P+ x' l
- CSpace:10015048 push edx- o8 ]5 m3 S x5 i( [! H5 S
- CSpace:10015049 mov eax, [ebp+dwNewLong]% T9 h# _0 |- R' C; n
- CSpace:1001504C mov ecx, [eax+230h]" r/ W4 l& b. E/ p# F# }. u7 w3 j
- CSpace:10015052 mov edx, [ecx+20h]% y% g. ~3 R9 J
- CSpace:10015055 push edx! X) Q1 b0 n& ^2 R. S
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
* n' B* o# j9 `) D' T; p. r - CSpace:1001505B push 3
. C$ y# O8 n1 ]! ?9 H, y) w - CSpace:1001505D mov eax, [ebp+dwNewLong]- h7 ?; D# I1 r# l8 I
- CSpace:10015060 push eax
6 R+ I% y/ V0 H. X( ^4 @! x4 A - CSpace:10015061 call sub_1003882A
8 H, v/ E- _, {3 e - CSpace:10015066 add esp, 14h
/ T3 U+ U+ ], W8 r) Q - CSpace:10015069 push 0 ; pUnkOuter9 `7 A! Q; W7 M, b Y) K+ p
- CSpace:1001506B mov eax, [ebp+dwNewLong]
$ p* y& Q2 D, p+ W2 j1 }7 k& O - CSpace:1001506E add eax, 1DCh
Y$ f _; m/ S+ r+ T8 `: b - CSpace:10015073 push eax ; lplpDD
; m& V* p. u6 ?& c: \% s7 S - CSpace:10015074 mov ecx, [ebp+lpGUID]
2 g# A" r( [+ t P5 o) N - CSpace:10015077 push ecx ; lpGUID0 x }2 h4 O8 ~5 D {
- CSpace:10015078 call j_DirectDrawCreate* p3 D; f2 y7 I! L5 |! |
- CSpace:1001507D mov [ebp+var_14], eax
5 l! f* v! S4 ~% |- d4 y3 [: T - CSpace:10015080 cmp [ebp+var_14], 0% c( P2 B. [2 M; J' F7 s3 ]
- CSpace:10015084 jz short loc_1001509E G1 [+ A% I1 K$ d
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"5 y" ~, X. n4 [( t4 U$ k8 d# s
- CSpace:1001508B mov eax, [ebp+var_14]; x0 M7 r9 q, o- ^& [
- CSpace:1001508E push eax1 m* Q5 m3 B% M* H8 F. l
- CSpace:1001508F mov ecx, [ebp+dwNewLong]: q" F' J6 Y7 i# l. V
- CSpace:10015092 call sub_10038F3C, `: d- p& a2 N4 R7 }
- CSpace:10015097 xor al, al& A* @/ J- ]+ h9 _
- CSpace:10015099 jmp loc_10015173
复制代码 . s# ]! ^" m4 R: J7 w3 s6 h' d3 p6 ]
/ r* q% Q3 z" s& _' R8 v
9 B- l9 \6 ~4 G我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
! \- n" b2 {5 [# j记录到log_GL.out文件中。以下是摘录的一段。0 n9 [& u4 v+ P) b& L
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
! I1 f* B4 r$ `) E" h以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?3 H2 B+ K$ o6 `9 W" f% c
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
) u U& h% ?1 L7 Q7 y - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>$ {: O! d! s5 y; g5 ~) G. c4 R
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>" y0 c& {' Z3 U0 s
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>; M$ x0 H: R% ~6 ^( v
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>' c5 P& q0 r4 z7 e
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
8 m2 \- i; U# B - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>) L0 c, ?" I7 Q) h
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>- R7 s6 p# s4 P f. \1 R
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>9 W- T. k0 ^0 d) h
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
8 |9 V$ v" A, d. m% t' X* S5 T0 R+ \ - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>" {; W8 p2 k9 Z" p
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>7 Z# W7 j9 j7 o4 s4 j0 a
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>5 ?3 E% X7 A5 r/ W4 o3 d
- glClear, GLbitfield<256>0 E- r. Q, M! D% l
- glShadeModel, GLenum<7424>; \7 n% |1 v+ F
- glDisable, GLenum<2929>3 M( y" |# ~+ g# @/ g+ D# U7 p
- glDisable, GLenum<3008>; \8 K* R, ?8 l' k( [
- glDisable, GLenum<2896>
& i# w0 {; {, w - glEnable, GLenum<3042>+ h C: l1 Y7 ]) G
- glDisable, GLenum<3553>
+ P5 x& i9 L9 M' o - glBindTexture, GLenum<3553>, GLuint<631>& ]- o' B- B. g- y$ s3 J
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>1 O* g" D- O* B9 @
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! F" o6 a+ { G+ }
- glClear, GLbitfield<16384>0 k. `6 P) M2 W" x3 [2 X
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>1 R0 I/ v2 D) o' M" k9 F% D
- glEnable, GLenum<3553>
( L: G/ g+ }: @ - glBegin, GLenum<7>' v& c, R, W; p& N
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
" V8 ?1 X$ V& _5 f6 f2 @3 F - glTexCoord2f, GLfloat<0>, GLfloat<0>0 I# F7 J1 }3 I" B/ B
- glVertex2i, GLint<0>, GLint<768>1 q8 k- t7 U+ u/ u$ Q s
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
+ d( h# P$ Y& U2 D; y5 S - glVertex2i, GLint<1024>, GLint<768>
9 j/ C/ L: m X/ z- J5 ]- Q - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>7 e; u0 P, ^" M+ [# O W L% k
- glVertex2i, GLint<1024>, GLint<-256>
" E- }- P! q8 ?; d- ~0 Q - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>1 D% s1 h/ m9 y, O5 h' j# e9 a6 R
- glVertex2i, GLint<0>, GLint<-256>
8 L" ?( N' j/ v4 R* z - glEnd
) y/ S5 J2 n# c% y% O+ w H - glShadeModel, GLenum<7424>6 q. u( y A1 p+ H/ d, W! k$ A
- glGetError
& B7 V5 B2 s8 c1 G+ G" j - glDisable, GLenum<2929> ]6 j3 m$ `) b. o
- glGetError
( }0 Q0 \' h1 }4 P - glBlendFunc, GLenum<770>, GLenum<771>
& l5 k, F# P) h, d3 X0 P0 d: B - glGetError0 D. t' o/ O/ \
- glEnable, GLenum<3042>! [& z# \- _: a! C2 |; b, m
- glGetError
! b. r! X, s7 o" F; }+ q7 O, P - glDisable, GLenum<3553>7 w% x- E, z3 W
- glGetError
; }$ ^8 E3 z+ T, s& T: x - glBegin, GLenum<7>
+ l5 A( {9 X8 ` - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
, H; z5 ~9 T' e2 ~4 c - glTexCoord2f, GLfloat<0>, GLfloat<0>9 B- k/ ~) v* N$ m# z7 z: s7 |
- glVertex2i, GLint<0>, GLint<768>. H4 }$ c; L/ ?6 L; ?
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
5 d0 p+ K$ N8 t J - glVertex2i, GLint<1024>, GLint<768>3 G- F L+ s2 l& e" a
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
7 G ^4 Y/ B/ n' c. o+ ~ - glVertex2i, GLint<1024>, GLint<0>0 @6 `) U# @6 a2 @5 o" b
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>3 k* p' y+ d9 ` y
- glVertex2i, GLint<0>, GLint<0>4 B7 d; ~0 h7 c; ]
- glEnd6 d7 ^) Y+ `" C O% q9 P, s
- glGetError
! } f1 @, A/ a- f( u& a: ^ - glEnable, GLenum<3553>4 I. i3 c4 E9 r2 B" C0 Z0 H7 t# Z
- glGetError
* ]4 F+ q* ^4 O# N - glFlush
) v6 T! q' e0 i% S' j - wglSwapBuffers; t- y4 x2 I/ B2 K6 }
- ---------------------------
, m/ m# ]8 ]% J0 b( U" H - , HDC<-33484711>
) | r5 L7 e8 x. V( y$ A5 E - wglGetPixelFormat, HDC<-33484711>
$ w# a. @' J4 _0 y - glMatrixMode, GLenum<5889>
2 B! z" O9 ?/ v( p - glLoadIdentity8 b+ E( e3 o( t- p- o
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>0 o3 b: F/ T9 \/ I
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768> A# `5 ~; U6 C) t/ |
- glMatrixMode, GLenum<5888>$ e! H* M+ q, x/ G
- glLoadIdentity; Z1 y7 x$ G$ k, [% u
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
. ^3 n% {2 f- ]1 F+ C - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
! i( o! o" C3 [1 k, V7 G, h0 l( z - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
# I7 l9 K# i$ n2 ]1 c - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>2 @& J" ] h( I2 v
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>0 s T/ L w: u- S' w# [0 `2 |% B
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>" l7 V% ~# G9 d3 y; X
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
5 m' W( E( S0 }9 @ - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>0 u" Y/ v+ E3 E, j! W
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
1 x f9 e9 |0 @: ]) u; h - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
( |: a( s: K2 T p8 }/ U ] - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
0 ]( p7 K+ m" c; |, ] J, z& Y9 e - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>: b0 u9 V$ l% _
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>& j/ n1 o' O: z. j
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
4 q8 ?( a: f8 h0 t - glClear, GLbitfield<256>
! \/ Y3 s* ~0 ^7 j! ^$ P# g - glShadeModel, GLenum<7424>
5 B% V* y+ F+ ]+ B, b! b - glDisable, GLenum<2929>/ M( F& W! f8 o. k; n
- glDisable, GLenum<3008>' \8 X, Y, R* {" m. i
- glDisable, GLenum<2896>) \# j, b/ R( m: n, P- v
- glEnable, GLenum<3042>
# g& ~9 F" |. b, q0 O - glDisable, GLenum<3553>+ R5 w7 r1 e7 D. Q( {( L9 k
- glBindTexture, GLenum<3553>, GLuint<631>
! W5 ^+ U7 @ V s8 r - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
# U& X% J% d1 R$ a) C& | - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>/ @2 R0 ?9 J# B+ n
- glClear, GLbitfield<16384>
9 o' o# O4 i0 ^. e) H8 N; t - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>% E3 }! l8 U6 U
- glEnable, GLenum<3553>
! j" i& R/ H- d1 g/ y - glBegin, GLenum<7>
1 O# A6 |8 [1 B- J - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
& K; ?7 S+ n6 ~$ E3 h - glTexCoord2f, GLfloat<0>, GLfloat<0>
% \+ Z$ m ]/ [: v - glVertex2i, GLint<0>, GLint<768>
# k/ Q4 |) D& Z1 ^# \2 r - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
2 S5 r/ F' ~ {; x6 V - glVertex2i, GLint<1024>, GLint<768>6 ^; G0 }( D+ }- [3 L K9 B- o
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216># D! x# I* H" X$ Y) j1 o8 x. } g9 p
- glVertex2i, GLint<1024>, GLint<-256>) s/ l/ j' O# W0 F7 ]4 T
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
# ~& W! Z! O; z: N6 P5 N2 O6 \% q - glVertex2i, GLint<0>, GLint<-256>. v5 Z. `7 o- b- U' @
复制代码
" {+ U1 }- B7 A3 S: J0 a. Y3 s7 y1 f( Z3 p+ _2 ^
|