本帖最后由 shane007 于 2023-8-25 17:31 编辑 # K! |* f7 \/ s! E- {2 }
8 O1 R6 g. T5 w- s本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,: H, S! `+ d0 y0 _0 W
游戏应该实际只用了其中1个,暂时作下记录。# L9 e$ j8 b" I) W2 K8 t- E0 J' p
: [# w& P/ L+ }, V* G' a+ W* HDirectDraw是由bin目录下的ddraw2d.dll来完成的。2 y* y' r) n1 I( M) x( s" I
以下是一处的初始化代码
3 f9 G+ b, u) H- CSpace:100150157 x7 f) P9 M3 p; N( M% E
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j; E1 W' r* H: i* t
- CSpace:10015015 mov [ebp+lpGUID], 0
* q! ~. R8 L+ C3 E5 A - CSpace:1001501C mov eax, [ebp+dwNewLong]) B6 D" B {, ]3 K% \( ^
- CSpace:1001501F mov ecx, [eax+230h]
) o2 B1 q1 z/ Y - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
0 p! {) M% S+ H" L1 [' K - CSpace:10015029 test edx, edx
/ M: [, c' e" Z: I3 P - CSpace:1001502B jnz short loc_1001503C
. U; ?9 ^2 H6 R1 J+ Z8 U - CSpace:1001502D mov eax, [ebp+dwNewLong]
5 q+ L- i: Z4 l. Z! ^- h - CSpace:10015030 mov ecx, [eax+230h]
& E4 b, S& M" G4 ~; \4 j - CSpace:10015036 add ecx, 8
) {( q: Y+ ^3 j - CSpace:10015039 mov [ebp+lpGUID], ecx
5 d F( F* v/ G: l - CSpace:1001503C
2 J5 Y2 S" C' a& m3 c- G7 P - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j6 m9 b" C! F/ r. ]* L
- CSpace:1001503C mov eax, [ebp+dwNewLong]# Y. c: {* J7 f
- CSpace:1001503F mov ecx, [eax+230h]/ V2 S5 e1 B, z* _ `8 k# p% I
- CSpace:10015045 mov edx, [ecx+1Ch]
4 C: B; Q9 B# G% k$ d& O - CSpace:10015048 push edx
) }7 N) Y0 t2 x9 i1 \) D, ~' h9 }- L- R - CSpace:10015049 mov eax, [ebp+dwNewLong]
7 o* t6 u& I& ]: X0 H2 z9 _ - CSpace:1001504C mov ecx, [eax+230h]% K( _0 f" \5 \8 s [
- CSpace:10015052 mov edx, [ecx+20h]
/ G m7 h; c/ Y5 t+ `: q3 f - CSpace:10015055 push edx# _- g4 T$ W; i( H3 n5 N
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"3 \% E# z" Y4 b- p3 K/ _# w' Q
- CSpace:1001505B push 37 L+ O$ |: X# R; e; P# | }5 N
- CSpace:1001505D mov eax, [ebp+dwNewLong]8 w+ |8 ~1 F2 ?- e, ?* r
- CSpace:10015060 push eax
: j' z/ d& ~' ?7 @- a$ Q - CSpace:10015061 call sub_1003882A
0 c1 H& O, d. ]* q" E - CSpace:10015066 add esp, 14h
. E8 e) N. B1 c0 p! e- o - CSpace:10015069 push 0 ; pUnkOuter
# f8 `5 }1 |% B$ N% @ - CSpace:1001506B mov eax, [ebp+dwNewLong]
4 F4 r- D t1 D - CSpace:1001506E add eax, 1DCh
- O) R. W1 Y; W - CSpace:10015073 push eax ; lplpDD
; @5 G( M" q/ A% T - CSpace:10015074 mov ecx, [ebp+lpGUID]6 J1 |8 @' z2 a8 `& O1 T6 E$ c
- CSpace:10015077 push ecx ; lpGUID" [2 [+ x0 q. T! G7 g& v
- CSpace:10015078 call j_DirectDrawCreate& c/ c4 C4 W( g4 K! T8 ?
- CSpace:1001507D mov [ebp+var_14], eax
# E6 @7 {* O! k) h - CSpace:10015080 cmp [ebp+var_14], 0
5 d* [/ Q7 O% ^. m - CSpace:10015084 jz short loc_1001509E
/ s, o& S8 n- z2 S" C - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"3 J) j z/ e7 }; n+ v8 M+ N0 u
- CSpace:1001508B mov eax, [ebp+var_14]
. [0 W2 J/ e, c - CSpace:1001508E push eax
: a9 Z e4 g: l2 y: p5 S% x' f - CSpace:1001508F mov ecx, [ebp+dwNewLong]- J& X! f* u, ?
- CSpace:10015092 call sub_10038F3C2 Y3 @; b% H0 G2 [! z5 L3 t" y
- CSpace:10015097 xor al, al, B; U% E" }$ s( F$ x1 d, p( E p
- CSpace:10015099 jmp loc_10015173
复制代码
3 _$ m4 m6 y; O2 q
+ [& }* U4 c6 d3 O0 p% s+ J2 A; `9 }. P; [+ c# a
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.% l) n6 h$ g2 j. `" h0 E, c
记录到log_GL.out文件中。以下是摘录的一段。, d9 O1 c1 a& d
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
* W. Z: ?% a, }1 j3 z以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?. X" U1 s4 R3 A0 A
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>9 m K& N5 s% k' I) b r) j0 [
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>3 d" I% W& g# R
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
V) V; r7 t7 [& c# K - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
& Y% h$ u+ G B* D( x3 ` - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>8 X+ N, C% o" v2 p
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
' U! K+ [# ]& g& g - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
1 v0 \8 M0 G) F - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
! ?) }! n# d0 H! w- ?$ Q3 g& `0 J6 t - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
( N. H- P; i1 b - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>8 K' g0 o; p% D
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
1 G5 e4 s( O( g; K - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>+ o# s H3 A5 B2 s% X* }
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
% V2 s3 ^- s; l - glClear, GLbitfield<256>
0 k' q0 g( J2 O9 l- E - glShadeModel, GLenum<7424>
$ V8 t3 Z) x7 o5 ~ - glDisable, GLenum<2929>
4 p u. z& D" U0 l, V9 e' o& } - glDisable, GLenum<3008>3 v) [' V9 K, B1 U3 j9 G3 [
- glDisable, GLenum<2896>/ O1 ?# ?3 g# M
- glEnable, GLenum<3042>
, L6 p( q* K" @) V! c - glDisable, GLenum<3553>
( ~, b8 ?7 A1 P5 j& f2 T - glBindTexture, GLenum<3553>, GLuint<631>, }4 Y$ w4 q* y& K% x" d
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
/ N1 S; `& J" b$ z) T, e8 \ - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
) U" }2 b* ?' z6 n0 U/ ]1 ]% J - glClear, GLbitfield<16384>7 o0 h0 W' j/ R1 H: |
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
6 l' q4 V. k2 A- V! `% Z' o - glEnable, GLenum<3553>
" J2 t8 t6 n$ H6 ^* u - glBegin, GLenum<7>
( {: R) z9 S& e' P0 d - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
5 R! }! O, q' S' ~9 y - glTexCoord2f, GLfloat<0>, GLfloat<0>
5 W0 Z/ m, F: \* L6 T! h - glVertex2i, GLint<0>, GLint<768>& h6 g# l" B5 R
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
3 o5 `& R/ d+ Y) J. d( x - glVertex2i, GLint<1024>, GLint<768># ?- O9 S5 N! X7 Y% ?$ T, C+ m
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>1 t0 Y0 a% z* C# i1 R
- glVertex2i, GLint<1024>, GLint<-256> a1 z4 s" v* k2 G8 `; Y
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
! H: _' \; |7 B - glVertex2i, GLint<0>, GLint<-256>, u" I+ G6 |3 a5 v! p
- glEnd. }1 }+ G# D1 j' h ~5 g9 M
- glShadeModel, GLenum<7424>( u% P& v1 J+ _( T# ?% h$ J. o
- glGetError' ]1 z' x% N6 |+ ~% h, ?/ y0 k5 O
- glDisable, GLenum<2929>8 I- x& l; M; M; E2 t
- glGetError
" `6 q8 H: b5 _$ s - glBlendFunc, GLenum<770>, GLenum<771>
1 \; j3 v& s( [3 X& r - glGetError1 ~* e# F) r6 U4 m5 O3 G
- glEnable, GLenum<3042>
5 v9 x `3 d" Y, E- q - glGetError
l) f$ Z( [6 d3 S ` - glDisable, GLenum<3553>
' u& ?) K3 G4 }9 I( C5 v) @ - glGetError% f n" f4 S- o. S
- glBegin, GLenum<7>( u3 @% _% N# t) O2 F- Z
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>0 |9 Q7 P# j( \: e$ g9 Z
- glTexCoord2f, GLfloat<0>, GLfloat<0>+ K, j3 r* f3 ~2 R
- glVertex2i, GLint<0>, GLint<768>! ^" ?0 C5 X4 k8 D# D& E
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>) S e: E* V. O* x9 \# [) \: M
- glVertex2i, GLint<1024>, GLint<768>% w G5 Y1 `2 @6 `) y4 J$ R8 Z5 Q
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
" E, j! F# @3 N1 Q - glVertex2i, GLint<1024>, GLint<0>
! G* [/ V* x) T8 ]" N3 P$ I4 o - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
/ }. ^# P* v* D" K( B# |, O, Z - glVertex2i, GLint<0>, GLint<0>; S+ D* c# @8 m6 I0 U$ T
- glEnd! i% W8 _7 I( s2 q; m2 V
- glGetError
8 G! B5 O. W5 b4 z+ L2 c - glEnable, GLenum<3553>0 Q' |- P9 l3 Z+ y
- glGetError
: _# Z+ x. i. d. V4 L7 L# d - glFlush9 G. t# `! T- W5 n, k; G- x3 |6 y
- wglSwapBuffers7 L0 }% t2 h( B! r
- ---------------------------/ R/ y- t: s- p# F6 g
- , HDC<-33484711>+ H. g$ t" ~4 G l
- wglGetPixelFormat, HDC<-33484711>
b' P. s" I- t - glMatrixMode, GLenum<5889>1 l) p0 c7 W: ^: |! P* I0 d7 A
- glLoadIdentity T! s3 M: |5 ` R( T; J
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
. E9 y# X3 {! L% B/ } - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>+ Y* S4 ]+ ^. G% L5 a. d3 w6 r
- glMatrixMode, GLenum<5888>$ r0 M/ `& c8 `/ g/ x! w+ R3 ]
- glLoadIdentity
0 p" W( h5 E) `, P: J) _ - glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>& W3 {- L* k' x' K
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>- v' i: s v( g7 i
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890># r4 [/ v8 j% R+ [7 K
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
' N+ L3 G" {1 ~) G' y, i - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>+ w1 [/ @0 D- J* d
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
0 j( q: h* b1 i& k7 R2 G( }& t( d8 B - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
' [: j9 c# e& d& W - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
$ ?6 ?/ n9 Q/ p! Z: a - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>/ j G; V3 h- a* A( O
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
8 Y( b1 e. R7 q6 L' a - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>" _- S6 d- v3 ~1 n
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>+ d' a+ p1 E% ~0 e8 n
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448> `7 i6 ^% b, l$ x) \% B
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
* }- i: ]* ~6 |; g. }8 `$ r - glClear, GLbitfield<256>
. s) R( X0 G" v/ u - glShadeModel, GLenum<7424>$ o( Z( b1 t0 C0 S2 s
- glDisable, GLenum<2929>
) R/ Q U3 |8 g: K- d* V% C: W: {9 ^ - glDisable, GLenum<3008>
6 r3 n; F# r ~$ ]+ w - glDisable, GLenum<2896>" O# h5 L; o7 c i
- glEnable, GLenum<3042>3 r. v! P2 w. n* X+ G( ?
- glDisable, GLenum<3553>
6 A: J- d ?# { - glBindTexture, GLenum<3553>, GLuint<631>
) e. q: C' n+ E9 d - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
6 m+ I) ^( j+ @) U+ H$ l, s - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>1 r: w, F0 w5 e* O" C
- glClear, GLbitfield<16384>
" C/ F- o9 @# @# t( `/ T- A - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608># Z, \( u& X$ A, i- h6 Z& Q6 R
- glEnable, GLenum<3553>, S) l. k- e) `2 u( h& M
- glBegin, GLenum<7>
4 S' h7 c( M5 ^6 M, t - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, @3 n2 v2 z& [4 K8 v. O0 J
- glTexCoord2f, GLfloat<0>, GLfloat<0>
5 I3 t# H7 e' k$ B0 I - glVertex2i, GLint<0>, GLint<768>
* M0 j8 g& s, l# s" \3 s$ b - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>: B" H4 U# `5 F; R9 ?
- glVertex2i, GLint<1024>, GLint<768>
/ j. W% i( [4 `9 ?) K7 T. w" b* f# B - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>% d/ T% w8 I' h+ a
- glVertex2i, GLint<1024>, GLint<-256>8 g$ v9 s: u: }4 c3 w
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
7 M E1 p r# W6 A) o0 t4 s! m - glVertex2i, GLint<0>, GLint<-256>, e7 N# R9 E) s8 d" a- Z" ~: w
复制代码
- b% H T; W" M: ^7 G
5 s0 P! R- o: B, N8 S/ |2 v |