本帖最后由 shane007 于 2023-8-25 17:31 编辑
3 @5 F9 I: K6 F% Z' B
- p; n# g0 _& ~本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,. s* m% F1 [, o( `
游戏应该实际只用了其中1个,暂时作下记录。2 d S1 p2 O$ l5 X8 f8 j, P' H
2 j# T9 c1 {* z
DirectDraw是由bin目录下的ddraw2d.dll来完成的。
. C6 K- ^; Z+ M$ i& n以下是一处的初始化代码
$ G! T/ M) c A# G& L# G- CSpace:10015015
3 j( n: u) h& ^- e; _8 B- m - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j D4 j# J& y, `
- CSpace:10015015 mov [ebp+lpGUID], 0! A9 ~7 l0 m+ i+ L% q( M( n3 a! L* p
- CSpace:1001501C mov eax, [ebp+dwNewLong]
7 f0 F' V# `! Y5 o6 M- } - CSpace:1001501F mov ecx, [eax+230h]1 K/ N$ E* y) e# }' |3 @
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
' H- X* ?. m$ ^* c. a4 _4 l2 \ - CSpace:10015029 test edx, edx
6 N7 e b8 d7 W+ D4 Y - CSpace:1001502B jnz short loc_1001503C
8 k) h+ D+ s& m" j' C9 z - CSpace:1001502D mov eax, [ebp+dwNewLong]; Q7 X- K0 M( K6 o
- CSpace:10015030 mov ecx, [eax+230h]! R* |* q1 \; e/ Y o$ u$ q- p' l
- CSpace:10015036 add ecx, 8. @! | `$ p# {+ K9 J+ `2 O5 k) J
- CSpace:10015039 mov [ebp+lpGUID], ecx7 l! s9 H, L2 j4 B+ ~
- CSpace:1001503C+ C- \9 n$ ^5 T- @2 E
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j7 R2 v t% e$ w5 E8 ~: m
- CSpace:1001503C mov eax, [ebp+dwNewLong]- D$ y- O! l, Z$ Z
- CSpace:1001503F mov ecx, [eax+230h]
; j1 f8 S( s: r! R9 f. O: d7 Y m - CSpace:10015045 mov edx, [ecx+1Ch]
: C7 c4 p% b, v! I - CSpace:10015048 push edx5 d$ l8 ?4 K& f. |2 P; G" p/ T
- CSpace:10015049 mov eax, [ebp+dwNewLong]
, Z/ Q' @5 d/ k6 n7 L! X - CSpace:1001504C mov ecx, [eax+230h]; ~4 D! l* w, _: P
- CSpace:10015052 mov edx, [ecx+20h]- y/ Y' A) k" T* p% l' q
- CSpace:10015055 push edx. e1 }5 C% l' r2 n0 Y( y- k
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
' \7 k6 W- j: j9 \; J/ j - CSpace:1001505B push 3
% V3 t! c- i, j2 _5 q, x( u" | - CSpace:1001505D mov eax, [ebp+dwNewLong]
% M) _5 k: [- H" u y" M2 q - CSpace:10015060 push eax
; E3 h9 Y) t b8 X - CSpace:10015061 call sub_1003882A
5 S ?; H9 n( x/ Q: | o - CSpace:10015066 add esp, 14h
) ? \- J+ g6 N - CSpace:10015069 push 0 ; pUnkOuter/ z6 N! l/ a/ H; a9 r2 a# K
- CSpace:1001506B mov eax, [ebp+dwNewLong]
% U* H1 ]5 B" C - CSpace:1001506E add eax, 1DCh7 }% d$ m7 {! k
- CSpace:10015073 push eax ; lplpDD
0 J& S# o" q N F; v - CSpace:10015074 mov ecx, [ebp+lpGUID] k1 i# U# T0 R1 a! w n* z( |
- CSpace:10015077 push ecx ; lpGUID7 d& W4 x+ m) `) s! B! W
- CSpace:10015078 call j_DirectDrawCreate
! R5 |& l! P. _1 m8 a% R; N) F% T - CSpace:1001507D mov [ebp+var_14], eax
) v' z$ R- d# P& F! H1 P - CSpace:10015080 cmp [ebp+var_14], 0, V9 F( g, h4 `5 G( g
- CSpace:10015084 jz short loc_1001509E4 B! {* Y1 w0 o2 H8 a9 K$ Q
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
: j3 I g) B+ x/ r - CSpace:1001508B mov eax, [ebp+var_14]( `$ U& Y' h6 _6 ^0 `- @
- CSpace:1001508E push eax
q; ~5 ]9 H$ n: z! ~ h% E& [ - CSpace:1001508F mov ecx, [ebp+dwNewLong]% b m- p8 X. h
- CSpace:10015092 call sub_10038F3C
4 z/ _" |4 r: f9 Z - CSpace:10015097 xor al, al" }6 e0 x7 @& w- ]- R. M7 V
- CSpace:10015099 jmp loc_10015173
复制代码 + T" k" h2 }1 ~5 Q( T5 n( W* A
- H* ^4 t, X$ u6 p
- K/ U9 A3 i8 i
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.; @* b5 t7 K& S+ A. U
记录到log_GL.out文件中。以下是摘录的一段。9 S4 o- M, @; x+ K8 E
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。- R2 p$ X! p4 ]) ?4 c6 g
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?* c( c! {2 s! Y0 U$ ]
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
; C# z7 i5 e9 K# c9 e - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>, h5 _) O" l; a
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>* l' J6 }8 X5 O6 S' f
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
8 M, D6 F9 K1 C% O4 v, }* j - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>/ c) ?0 T, u1 N6 C% v& T0 @
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>- l& o( U- L% |+ |, j* i" e2 _+ G
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>) ]6 |8 F" Z" _* L8 w* H7 h
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>2 k2 I# V+ i6 Y* b- V' q
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>+ V5 F4 b, e( p. M
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
9 ~7 N& \. ?( M - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
T' O" m6 {2 z, k8 c% R; S - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
2 d# ^* P" _7 p4 i. S" w - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
3 Q3 w! ]1 f2 A' {7 ^ - glClear, GLbitfield<256>
8 m: _1 h, _3 B - glShadeModel, GLenum<7424>
6 H) I; M/ N6 T# N8 N - glDisable, GLenum<2929>
7 t! m0 q) n1 F+ ~8 Z% ~ - glDisable, GLenum<3008>
: q5 ~0 o* U* t1 B9 Z. A - glDisable, GLenum<2896>
0 M) g. F, A+ f: K# P$ Z - glEnable, GLenum<3042>
; k- I) p) d- P3 G/ J - glDisable, GLenum<3553>
k( P! s' x; Z, t4 y4 { - glBindTexture, GLenum<3553>, GLuint<631>( K9 e+ d( F! T, q6 A3 u( D
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>3 r- |" o3 j1 p2 O3 @; j
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
& g1 N: @3 e w: B8 n+ Y: J4 u - glClear, GLbitfield<16384>4 `& T, ]' J* {/ l7 Q+ }$ O
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>- ^) n5 |. n+ f) ]( d) P
- glEnable, GLenum<3553>
3 W Y! b0 m+ `6 _9 J) V7 A5 C - glBegin, GLenum<7>4 i: D1 Z! w( W
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
Q& C" D- U" }6 Z2 j - glTexCoord2f, GLfloat<0>, GLfloat<0>
( c. r3 n# ]! E4 Z - glVertex2i, GLint<0>, GLint<768>* ]5 [3 C, x3 a$ G4 t9 ~- B
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
# p; G z6 r8 w. J - glVertex2i, GLint<1024>, GLint<768>4 k4 y& E% U6 K- t2 o# k0 p
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>' o/ {. {; m* p$ [0 N2 V. |# y
- glVertex2i, GLint<1024>, GLint<-256>5 n! h9 J. B( o, p) N
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>4 @. G# X. g& n1 X D
- glVertex2i, GLint<0>, GLint<-256># H7 b) g: A( G) H( {7 h# Y
- glEnd% l! T( X3 H: r4 x
- glShadeModel, GLenum<7424>4 a$ v. Z( P% R
- glGetError
& w( I: L: N$ i2 Y" ^ m: @5 b - glDisable, GLenum<2929>
" B/ J# B) b1 u3 Y8 @ - glGetError& J' o7 g4 Z- j+ q: n
- glBlendFunc, GLenum<770>, GLenum<771>
$ q3 w3 t6 G: f, S1 C5 x - glGetError
2 j7 u- P u! a: D' i9 z - glEnable, GLenum<3042>" E! M0 z, Z* I [( X) j
- glGetError7 N( t7 j; J# H* g p4 X& i8 a
- glDisable, GLenum<3553>* q8 d, q2 d. E7 e' z
- glGetError0 v. ^* o+ ]3 ]* d( C
- glBegin, GLenum<7>
+ s, N- a [8 S/ J0 |$ R - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
: U) |+ @6 M8 K9 W - glTexCoord2f, GLfloat<0>, GLfloat<0>, q5 f% u- E4 [% }7 g
- glVertex2i, GLint<0>, GLint<768>4 [$ c+ W: ^1 S. H. O1 B* S" q6 b
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
) U' @! I. Y W2 u - glVertex2i, GLint<1024>, GLint<768>. X/ i" `& E; k* S, [( C' n
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>/ v# A2 o; t, I2 d, [3 _/ E; L
- glVertex2i, GLint<1024>, GLint<0>) D- t( C. j6 e$ E" p+ f
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>4 s2 n! R: T \& C" I
- glVertex2i, GLint<0>, GLint<0>
: c( V6 t. Y# W% Q9 @7 K - glEnd
- Y/ }4 X! a% a7 i- H4 t! S - glGetError
0 o, Y- M. n- r# \# A - glEnable, GLenum<3553>6 J! W8 Y7 e8 q
- glGetError; y9 s: b$ O5 r- r
- glFlush
, u; `* U1 C) c' Y5 w9 M! d& S2 i( i - wglSwapBuffers, B! v( Z3 h+ A" \2 p; G) `
- ---------------------------
* P9 p+ F, P+ U+ f! ` - , HDC<-33484711>
5 n' z; B4 C! Z, Z- } - wglGetPixelFormat, HDC<-33484711>; M5 _+ n! q; H2 ~: Z. Q
- glMatrixMode, GLenum<5889>
' z M% a$ ~( B0 L% N3 W% g0 \ - glLoadIdentity
7 @0 k- u' F7 _, V1 g - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
1 E, {( T7 X0 N" D$ R - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>: e! ^0 M9 W3 P! R$ F+ w/ G" ^
- glMatrixMode, GLenum<5888>
" \$ Z0 c3 c& ]6 f8 g - glLoadIdentity& H6 Y t: [# V5 m2 n4 [4 g8 w
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
. b% X/ V, X- k+ t; ~ - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
' o# p% m/ V/ q) d4 g: {; Q, v5 _ - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
6 t1 F" o9 T) c8 g5 z - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768> N$ B# f' k- _, w7 j
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>" d! J- k3 ~" h/ j. \0 Q# E U
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>" B$ W; E$ A; j( p. b
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
) T7 D9 [& H( k0 g/ A# d7 I+ w - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>9 F ^2 T0 E1 ?- }
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>2 o* H( `7 K. R7 O5 R0 A3 j. ~
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>8 M( o/ m3 v9 A+ A; A5 b
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
- f3 {+ d) K3 w+ K2 v; } - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
* N. Y# s: b( F/ G - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>& [% X! Q Z7 D( ]
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
% }; K7 v: P2 o9 s+ T - glClear, GLbitfield<256>
" R- P6 }5 Y) {4 _- \* U0 ? - glShadeModel, GLenum<7424>
: P, x( S/ j0 U4 Z3 l - glDisable, GLenum<2929>8 I& R! ^' C! w* n8 w" N$ P
- glDisable, GLenum<3008>
. j$ G5 K* R' l5 Q7 W h - glDisable, GLenum<2896>! j! M1 V# {. g; s# Q T
- glEnable, GLenum<3042>6 a2 M, Y. N0 B7 O) H
- glDisable, GLenum<3553>) @0 ?7 [6 I2 W9 ~8 _1 G' ^
- glBindTexture, GLenum<3553>, GLuint<631>
. S: r' z# s! X; K) }% J4 T& Q - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
0 z6 Y! R- R6 x0 c9 E' q - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
! \# P. G3 @: Q - glClear, GLbitfield<16384> t5 L& J- J7 l/ K
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
. C5 S; U" K* x s2 U& Q' B - glEnable, GLenum<3553>0 M0 y2 c) Y6 l! g2 L# [# ]
- glBegin, GLenum<7>
! e1 I+ Y+ ?7 k3 H) i3 g% M; f - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
* W1 T3 @. d. z, c - glTexCoord2f, GLfloat<0>, GLfloat<0>
6 }/ [, |7 H" }5 S1 K - glVertex2i, GLint<0>, GLint<768>
1 j& Q0 P6 z& I* u: X - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
+ S; Z; t$ O6 ^, J" }0 s - glVertex2i, GLint<1024>, GLint<768>; H' s: l6 B6 V2 O8 L
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
+ _) q0 v" z1 {6 ?( l - glVertex2i, GLint<1024>, GLint<-256>' j/ e) d: C+ j" a& U* Q
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216> ]. \2 I. A0 X6 k$ C5 s
- glVertex2i, GLint<0>, GLint<-256>
6 L/ p) r. d: D6 r
复制代码
2 A! r+ K2 T4 w" ~/ l" k2 f4 i) \
6 d( o- b- L* Q# { y4 E |