本帖最后由 shane007 于 2023-8-25 17:31 编辑 8 t8 ]. ?+ u) }: V7 Z) [
7 y. l! B% z2 X0 b6 \0 o$ p本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
: B3 ^; c- \, B游戏应该实际只用了其中1个,暂时作下记录。/ K# p& `* i8 C+ o. X
6 g) s; I- A9 T# O1 t8 @# h! z
DirectDraw是由bin目录下的ddraw2d.dll来完成的。6 e6 u( l- @' P# D% |2 B1 K
以下是一处的初始化代码
9 L* p7 H5 G% u% U- CSpace:10015015
1 V0 j/ }) R1 m - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
* z5 w- f( B% V- Q0 Z0 X& X1 I - CSpace:10015015 mov [ebp+lpGUID], 0
6 \5 w' V) b. y6 | - CSpace:1001501C mov eax, [ebp+dwNewLong]/ M/ D$ o# ~5 g& J5 {
- CSpace:1001501F mov ecx, [eax+230h]4 U3 Q& N' Y0 u. I/ a# Y) h; I# ]
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]0 N5 O: E7 A( B0 y5 D X
- CSpace:10015029 test edx, edx
( r+ K- R w; H) l3 L - CSpace:1001502B jnz short loc_1001503C
; g/ B+ g+ J) W1 H - CSpace:1001502D mov eax, [ebp+dwNewLong]& H- a" x/ m2 `* n B; y1 A# r
- CSpace:10015030 mov ecx, [eax+230h]* m# ^$ i$ ^3 Y( G. F
- CSpace:10015036 add ecx, 8- j% r S9 O5 R# W! M7 }% M* X v
- CSpace:10015039 mov [ebp+lpGUID], ecx
8 b# A5 d- x' E# D( Y - CSpace:1001503C- d0 S7 H m; T- T
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
" k3 x9 K/ [2 o+ A" ~% S4 [: W - CSpace:1001503C mov eax, [ebp+dwNewLong]
5 X; {: W9 u; N, G5 V - CSpace:1001503F mov ecx, [eax+230h]0 D5 _) {: W2 i, x) j
- CSpace:10015045 mov edx, [ecx+1Ch]3 ?$ x! B1 X' `/ b) k1 i" d4 x. i
- CSpace:10015048 push edx
; U+ V/ D( w. u. O - CSpace:10015049 mov eax, [ebp+dwNewLong]
+ @% ]6 P5 _% t& C& I5 m - CSpace:1001504C mov ecx, [eax+230h]
, |( }* k6 U/ e7 e) @7 n - CSpace:10015052 mov edx, [ecx+20h]
: H: ~# M Q* l5 i" _7 W/ N! S - CSpace:10015055 push edx
/ I/ V% e9 _, J - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"# x3 e; z6 F5 h9 s
- CSpace:1001505B push 31 a, X( b% @5 K# e/ e; X1 S
- CSpace:1001505D mov eax, [ebp+dwNewLong]& Y4 E- J- y; }, M
- CSpace:10015060 push eax
; a! w: r* E8 L. f - CSpace:10015061 call sub_1003882A
! } _1 W" T) t ^0 ~" R+ O- H - CSpace:10015066 add esp, 14h( i9 t' c2 l; Y/ M! Y
- CSpace:10015069 push 0 ; pUnkOuter
4 x2 G; X; k2 v$ [' J0 [/ @5 V# ^$ { y - CSpace:1001506B mov eax, [ebp+dwNewLong]
9 Z# l, u5 m- a - CSpace:1001506E add eax, 1DCh
`* A7 N0 y" X - CSpace:10015073 push eax ; lplpDD
- ? e- M Z$ O, q$ S- I$ O R - CSpace:10015074 mov ecx, [ebp+lpGUID]3 p( g3 o2 G, `, t
- CSpace:10015077 push ecx ; lpGUID9 |/ l @/ i q3 T' I
- CSpace:10015078 call j_DirectDrawCreate
9 A {8 u% Q5 n. _ - CSpace:1001507D mov [ebp+var_14], eax
$ i: J h8 F8 ~( z - CSpace:10015080 cmp [ebp+var_14], 0
# q# j0 n2 }8 s, w4 Y7 s - CSpace:10015084 jz short loc_1001509E
3 C" d1 N4 k9 J" j, H - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
; \& A/ ]/ L5 ?% _ - CSpace:1001508B mov eax, [ebp+var_14]4 ~' L- v9 r& z3 N( q" `* @
- CSpace:1001508E push eax" C5 ]/ h) O* L3 ]8 X7 C7 t; S9 v& s- B
- CSpace:1001508F mov ecx, [ebp+dwNewLong]. l, v& L4 M4 a7 @7 ^( v2 A% i
- CSpace:10015092 call sub_10038F3C
! L1 Q' }4 \. G# u - CSpace:10015097 xor al, al
! h: y: @; N. x# C8 ~+ | - CSpace:10015099 jmp loc_10015173
复制代码 " w3 V; j0 o4 P- n$ _( C7 F
; M$ ]/ Y/ {5 i8 y8 h% d9 Y
6 m! [7 Q- L. r' W4 t2 {
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
0 }0 p; S$ }' G2 T- s" q$ @记录到log_GL.out文件中。以下是摘录的一段。! s2 u$ h( D) E/ G# H4 `. W
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。1 V' f2 N6 H( P: \7 Z* a
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?& ]( k/ J4 s7 X% Y& ]! \, N" ~
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>% i) V- c% @8 R3 D+ T. _
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>! m* U* }2 U) d3 J
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
9 I& F" B; R/ R - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
7 c) F! I H( l - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
: J+ p3 I+ B" @% `/ N9 U; }4 I - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
6 b0 V R; B( Z9 N - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
( I" a! {# b5 j# T- | g4 I - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890># x4 i5 y# m* ]7 t
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
+ |, o% o p/ {% J ~" S* q z/ V" C - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167># u) A( ?3 P2 W6 I |- m
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
6 g5 u$ Q+ o7 m0 ~8 Y! ~ - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
& E3 J. f/ e0 u r# s - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>% G; |, K; w7 {2 r) n; S; n
- glClear, GLbitfield<256> l; l% z6 d, X) G) D* e
- glShadeModel, GLenum<7424>5 N$ d3 I ^) @6 v" h
- glDisable, GLenum<2929>
$ i; h$ J/ e! c* n - glDisable, GLenum<3008>
& Z1 t3 X0 A+ y6 w" l' U9 u - glDisable, GLenum<2896>
' L+ }' I6 J z9 u5 A - glEnable, GLenum<3042>
2 e. G y9 U4 }" l7 W' ^) k - glDisable, GLenum<3553>2 Z* O7 w) Y, o& ]* B6 z* o
- glBindTexture, GLenum<3553>, GLuint<631>
. N6 r, F( p4 n - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>. P9 g3 `9 g* A3 i* j, v$ W9 F
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>$ Y6 H& C& f# v# Y
- glClear, GLbitfield<16384>7 w$ X( I" I0 L3 N) b( C0 t2 P
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
# f, H" o0 W! r7 M4 n - glEnable, GLenum<3553>
- l) ]" v9 p& X. \' h# I - glBegin, GLenum<7>
4 a4 p9 R* u8 p/ W! c - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
4 N1 S( z5 |4 j! J& X* u - glTexCoord2f, GLfloat<0>, GLfloat<0>, J/ F8 e* B: g& }2 ^
- glVertex2i, GLint<0>, GLint<768>- E, @/ ~; v3 Z6 s" Z' s1 T/ P
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>/ C4 R8 I+ a( n; q; H/ F+ z
- glVertex2i, GLint<1024>, GLint<768>
" S% A$ C, w) G7 w+ G) C* U0 W0 T% G - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>; o }: i0 M$ r$ `# a+ p4 D
- glVertex2i, GLint<1024>, GLint<-256>
) U. P5 [! O2 E* i L - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>( h" I3 t$ `( J$ W9 B
- glVertex2i, GLint<0>, GLint<-256>
: Q3 ?2 M; k7 u, h* Y - glEnd j9 H3 l$ C. y: z/ m
- glShadeModel, GLenum<7424>
o. V- @2 X' g* Z. K" {+ \+ R/ P, a - glGetError
5 ~2 n: y; |+ [) a - glDisable, GLenum<2929>% ^) s4 |1 u+ J2 V
- glGetError3 z3 Y9 a/ f" Y( D; W4 x
- glBlendFunc, GLenum<770>, GLenum<771>
( P1 o3 ?* j! L1 A - glGetError
) n# o# y# {5 ~% X) }+ v M3 I - glEnable, GLenum<3042>% |; C$ [+ l$ S' m3 `- ^/ {
- glGetError
6 _8 k1 A8 y+ j, a8 X# E - glDisable, GLenum<3553>+ @1 A, @% C: A* \ o6 U
- glGetError
! z# y! b$ `% T - glBegin, GLenum<7>
2 U" W. m9 M9 v5 E6 o3 H - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>6 A6 B4 h5 N, E2 o
- glTexCoord2f, GLfloat<0>, GLfloat<0>+ P" i( C& s4 [& }) z
- glVertex2i, GLint<0>, GLint<768>$ Y7 z/ C6 F7 |; M: o: Y# C- M( a
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
8 H8 i6 {+ \$ K: b; b - glVertex2i, GLint<1024>, GLint<768> U) u: n; d- x% n
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
; j# |. B7 S$ |, P0 H. n1 I - glVertex2i, GLint<1024>, GLint<0>
4 r) |" W" B0 L- p8 {. ?7 _ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
0 x. D+ S6 D( E+ u) k* b$ O; S3 u6 j - glVertex2i, GLint<0>, GLint<0>
% h; b% i6 x: m - glEnd
5 h& _* K) U5 G2 A/ K7 n - glGetError/ b0 ^; T) l* t6 r- D
- glEnable, GLenum<3553>( h5 k5 f* V; m$ K4 P
- glGetError4 ]! x# h+ a0 ~( V- Z' B) S9 S
- glFlush
1 Q" ~7 E/ c6 r- y - wglSwapBuffers
9 ^$ b9 u, P4 g2 D/ C& \ - --------------------------- Q }* J! b% R' j9 U2 Y3 k
- , HDC<-33484711>" M* t( j+ Y9 x. _; c% K
- wglGetPixelFormat, HDC<-33484711>
- L2 n# r9 Z' R, {5 ~* R( ~ - glMatrixMode, GLenum<5889>
- Q6 Q" W" t$ M8 Q8 B( y; K- |" G - glLoadIdentity; y" d9 [ S, ^4 [
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
: {- {- U4 a! G - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>7 f$ y. @6 }* S+ N7 e3 J8 H& b
- glMatrixMode, GLenum<5888>! u- ^6 `; p+ n" `3 A4 ]% f. D9 y
- glLoadIdentity/ R5 g% o3 T) f
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
) a( U* @& X: r4 {! k - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
& ]% O2 o0 L# t8 `+ x+ A - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
7 ^- P& Y0 y0 W m$ B - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
3 V( m7 t9 j8 ]$ ?6 k" W - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
( D7 r2 W6 i$ W! T - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
# N V* D3 }& F# Z - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>8 D4 {! v. z9 a m
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
; M7 }4 n2 v3 K5 r% ~. j. L - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
! y. A) ~3 W3 @' N' Z+ X+ q - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
1 L* i$ h! r& P - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>7 K G1 k1 ?0 G. l5 z. i
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
) [7 P; I: V9 Q - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>$ p" D0 B: _1 |) F; j) v
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
1 }7 ~8 |. V+ p% r: F - glClear, GLbitfield<256>
2 _5 i4 ~9 s1 U1 Y - glShadeModel, GLenum<7424>
; n' C* x+ l. `7 w - glDisable, GLenum<2929>% B* f0 x9 L. @6 y& U. r# J
- glDisable, GLenum<3008>/ x0 p s! q& k& O2 g4 i
- glDisable, GLenum<2896>
1 j4 i. `1 z/ Z' U% [ - glEnable, GLenum<3042>" }. ^# m3 l/ |8 q, k
- glDisable, GLenum<3553># ?: o$ v) _% x
- glBindTexture, GLenum<3553>, GLuint<631>
+ R! a" D7 h/ E4 R8 N - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
- ]& s; `7 ]' ?: j9 D8 B# @ - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
2 @: _! G5 T+ I* x" v- j6 r c - glClear, GLbitfield<16384>& B3 q5 w0 t f, w, p. b
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608> {. J" O( Q7 Y# K
- glEnable, GLenum<3553>
0 t3 B5 w" H5 B - glBegin, GLenum<7>
`: j& x; \' {$ ?8 f - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>; M3 T" b# d+ D1 ~
- glTexCoord2f, GLfloat<0>, GLfloat<0>
2 }1 D2 t9 W7 J: Z. [+ B" n - glVertex2i, GLint<0>, GLint<768>2 a$ Q b8 a5 V. G
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
! ~8 V7 W$ z2 G; r& g: H6 U - glVertex2i, GLint<1024>, GLint<768>
% q* _2 g" `5 `. ~# X2 U - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>3 _: `/ b- T2 r; J) ]$ z ]! U1 e* I
- glVertex2i, GLint<1024>, GLint<-256>% @1 H0 x( E9 m' ?$ G* k
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>+ n% w0 g$ r4 h h
- glVertex2i, GLint<0>, GLint<-256>! P b6 n% S. _* z
复制代码
. L' x/ v- h) t! Q, ?+ S. x8 ] i
& U' h, z& F3 a2 `. f+ c |