本帖最后由 shane007 于 2023-8-25 17:31 编辑 2 y3 l3 [2 q# y
3 X3 D: G+ \/ O本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,& b7 R' ?" j, O1 m# n: O
游戏应该实际只用了其中1个,暂时作下记录。
2 H9 J5 c8 Y1 B" @' ?+ r/ c
$ w5 E# W f9 v5 P, V9 \DirectDraw是由bin目录下的ddraw2d.dll来完成的。5 N+ D0 `2 M; K; D7 `
以下是一处的初始化代码1 d$ O! ]5 ~9 R) O% x
- CSpace:10015015
* P, p5 Y" ^% c s - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
/ c6 q1 R. g- I4 x$ m - CSpace:10015015 mov [ebp+lpGUID], 0
* F) [9 b' W: d7 U - CSpace:1001501C mov eax, [ebp+dwNewLong]
z# G2 k; f( E, s% `0 | - CSpace:1001501F mov ecx, [eax+230h]
- L6 T( w( X# e - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
, h; x H2 V4 A5 ~7 { - CSpace:10015029 test edx, edx9 h) o u. X/ ?3 g- j+ j9 N
- CSpace:1001502B jnz short loc_1001503C4 X \; w& G4 |9 `4 X
- CSpace:1001502D mov eax, [ebp+dwNewLong]
& S% y% }$ e; z6 z7 Q - CSpace:10015030 mov ecx, [eax+230h]
) n/ m8 i$ F7 N3 ]% f# b - CSpace:10015036 add ecx, 81 h) I! u4 G6 L* W( N4 r
- CSpace:10015039 mov [ebp+lpGUID], ecx- a% e) \" B0 C4 R! G: l
- CSpace:1001503C
' n2 l+ j. n( ~% u/ E* [( k8 } - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
) t; D6 J- S3 g/ y l - CSpace:1001503C mov eax, [ebp+dwNewLong]
$ {- i, e- Y$ N* y- c$ C4 p - CSpace:1001503F mov ecx, [eax+230h]' f# o- O, M* J( U2 L
- CSpace:10015045 mov edx, [ecx+1Ch]& Z; ?% J. r& _$ f
- CSpace:10015048 push edx4 f' \8 p- d% r7 r! P* N
- CSpace:10015049 mov eax, [ebp+dwNewLong]8 ^5 T4 W- [- p$ d
- CSpace:1001504C mov ecx, [eax+230h]
' g) r. I+ G1 p7 Q6 D& L - CSpace:10015052 mov edx, [ecx+20h]: N- r4 l6 X' o& F& m
- CSpace:10015055 push edx
% m. _1 _5 Z9 b3 m4 U2 k- W - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
5 f0 J/ g+ H) w& w. a/ B - CSpace:1001505B push 3" Y4 h6 w& L; [
- CSpace:1001505D mov eax, [ebp+dwNewLong]* i/ |, D9 S2 g* N! B' X
- CSpace:10015060 push eax- V. \& Z4 E" g, b, r0 B) X& M
- CSpace:10015061 call sub_1003882A1 V* {$ \# k* |' n
- CSpace:10015066 add esp, 14h0 M7 u6 \. P3 o8 M
- CSpace:10015069 push 0 ; pUnkOuter9 h) f& T# V) G7 \
- CSpace:1001506B mov eax, [ebp+dwNewLong]
: k9 T$ x! J2 z H! A - CSpace:1001506E add eax, 1DCh
4 q9 T4 w& s( y4 e6 i# e - CSpace:10015073 push eax ; lplpDD f9 Z2 k+ a8 y9 I
- CSpace:10015074 mov ecx, [ebp+lpGUID]
4 ~( a* b* i" m7 p: D1 y% ?; z - CSpace:10015077 push ecx ; lpGUID+ k8 s# x+ u* k7 {; A
- CSpace:10015078 call j_DirectDrawCreate( ]6 \& Z) m) W
- CSpace:1001507D mov [ebp+var_14], eax
7 j9 J2 b2 |) M, `, _* X - CSpace:10015080 cmp [ebp+var_14], 0
* Y, P- b+ v7 U6 W" { - CSpace:10015084 jz short loc_1001509E
* n+ C: C- Z9 w: b - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"$ ] o9 v/ _) I3 G4 W7 D x0 E
- CSpace:1001508B mov eax, [ebp+var_14]
$ C7 b5 K% o# z: M - CSpace:1001508E push eax) ^$ D4 W3 h, p2 a; V
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
) ^* n* J+ \. }- q, o& h - CSpace:10015092 call sub_10038F3C( v4 o+ s; u: F0 g! L
- CSpace:10015097 xor al, al
( m7 ]* ^( m2 g - CSpace:10015099 jmp loc_10015173
复制代码
/ b; u2 F& x6 w( A# ~4 k }/ x8 K% O5 B2 I" n8 `4 i
! O: x0 O" ~) {* N" ~9 r( L我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.& H1 d$ w/ @- n; U# i0 \. b2 b
记录到log_GL.out文件中。以下是摘录的一段。& [0 t6 C+ W% K$ N% v
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。. n0 n, ^9 d7 T
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
0 f# i$ Y' a3 }+ X! a% v- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0># |, U2 X/ _* N
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
# {8 d* R8 r$ [& ]0 K - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>& ?! E4 m, C7 o5 _
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
" \1 ]% d, f4 ]% c4 r2 \ - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768> I+ X/ E5 A: z
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
2 D2 P J, V; q% ~, a: d - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>- m4 o2 \4 P- c/ A4 a4 \
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>7 E! \$ Q; x" h8 H$ s; r
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>7 }7 P! h: p6 z- S v9 `
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
6 k! A' A- U! W- f5 ^ - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>! } {. G. P6 S* j
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>" v2 F. ~% `. j' D2 h
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>: A" o( A, W' p5 U) Y
- glClear, GLbitfield<256>- {0 F/ C" M9 j( F9 \! J
- glShadeModel, GLenum<7424>
- ^ S: m/ s3 |2 {$ G - glDisable, GLenum<2929>
5 G8 o' D- j7 y8 l6 L9 K - glDisable, GLenum<3008>; z: o$ e* s4 I A) b6 W# m u
- glDisable, GLenum<2896>9 i6 I3 w, [; J
- glEnable, GLenum<3042>' n% n! [7 f& L |
- glDisable, GLenum<3553>/ x: C$ g6 _; h+ ]% S5 |2 O
- glBindTexture, GLenum<3553>, GLuint<631>9 R2 q9 {* r. k
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>: d [- H# l- e+ z4 N9 q
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>* o) Z+ V/ E: O# _
- glClear, GLbitfield<16384>
# ~5 C1 t! l. M7 p5 r - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>, e( a: R; r; c7 f
- glEnable, GLenum<3553>
; R9 s' }8 C; F( }6 P3 E - glBegin, GLenum<7>
3 `* y& Y2 c0 z3 u' y$ w9 w - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>% N0 w* f' D Y: `2 d& E( n
- glTexCoord2f, GLfloat<0>, GLfloat<0>
9 v$ G6 V5 n4 J( p9 D7 A - glVertex2i, GLint<0>, GLint<768>
" x' {9 s) V" u/ k e - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
- Q4 g$ x; P6 q/ v" V' S1 ~5 o! v7 | - glVertex2i, GLint<1024>, GLint<768>
8 u" F5 M" y0 C - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
; C. I8 C |3 ` - glVertex2i, GLint<1024>, GLint<-256># M# x2 G3 O& X
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>) X, x7 ]1 U4 T1 w% x2 K
- glVertex2i, GLint<0>, GLint<-256>
% s" b' Y- y3 I* }. G - glEnd
5 J5 O8 n3 V; n - glShadeModel, GLenum<7424>$ P2 P- O7 [3 t4 L
- glGetError
% M' U/ r! s2 J# N1 O - glDisable, GLenum<2929>' O* v- Q4 K3 Y A1 s7 B$ |
- glGetError0 d1 @( z6 l, B9 j* C# h, D
- glBlendFunc, GLenum<770>, GLenum<771>+ [' Q$ }8 o' A1 k! W1 U
- glGetError2 W2 Q: W6 [5 `8 D4 p
- glEnable, GLenum<3042>
* @3 W+ G9 C2 } v+ B5 S5 L5 @ - glGetError0 h$ c+ X, q; c5 o( k
- glDisable, GLenum<3553>7 z. L, K' C9 C. s7 w n A
- glGetError% H8 q3 Q2 _$ i0 r; h/ v* e/ z
- glBegin, GLenum<7>
0 F2 A- f' W9 f) \; _) x: [& b - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>- {6 f% R* R1 P. u- R
- glTexCoord2f, GLfloat<0>, GLfloat<0>
+ f! j- G+ c+ L0 H! n+ Y7 \ - glVertex2i, GLint<0>, GLint<768>
5 b! J: r! U9 e# `* v8 P; | - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>5 W. I2 j' E& R6 S+ F! r
- glVertex2i, GLint<1024>, GLint<768>1 R- k9 K9 W' }. W$ W, |
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
7 A- P# y0 i( \6 F" U - glVertex2i, GLint<1024>, GLint<0> Z- v2 ?1 `9 n
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
- f$ V, c. \- O# C# Q - glVertex2i, GLint<0>, GLint<0>. Q# {- R. R# }) u
- glEnd% a( \8 N ?% j* O. e
- glGetError) a* o& ~* K! p
- glEnable, GLenum<3553># d1 ]3 c& C' l& Z0 p
- glGetError' q- I: b- B ]) r5 b2 z' z4 W
- glFlush3 d y4 Z0 T; n9 h' V9 c
- wglSwapBuffers8 l, e u+ n4 `. O1 k2 h
- ---------------------------' U: K& ?; q% N2 j
- , HDC<-33484711>
, r. T4 M5 ~# { W4 a - wglGetPixelFormat, HDC<-33484711>3 W. P- d: v t6 j- `* x3 Z
- glMatrixMode, GLenum<5889>) J4 g+ P) C2 v6 a( V
- glLoadIdentity
( J' Y4 k4 h z1 v( ~ - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120> c1 J: G5 ?1 O: a- A3 S' r9 @7 C4 i
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
3 A2 y& D$ \ I+ k3 d - glMatrixMode, GLenum<5888>8 E& E" K; L& X& }5 C
- glLoadIdentity( G3 K! F7 ~4 d1 q
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
4 C& n; P8 n4 N - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
# }. R4 E' f) W7 I% W - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890># W9 `( U; i/ f5 M
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>: @4 T" E: M# K) i+ t6 J
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>9 n( n, Y$ u% S! ^4 e
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>& c/ A3 ?7 _* A4 e$ j- C# k
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
- ]. Q, |" _8 g( e8 l. v( X# v - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
6 a0 m5 {0 a! Y$ B8 u: W9 m r - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
( m7 E1 I- |" I1 A/ i - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>8 t1 ^; V# G3 P" u, b5 }& o1 o/ i
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>. T0 S& O* {6 `
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
7 K7 x w' r1 P+ S - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
7 D9 h: y) g! Q. K - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>8 l; O8 D+ f9 f! S2 u
- glClear, GLbitfield<256>9 I- l0 |) P- s
- glShadeModel, GLenum<7424>2 n1 e! K. v- p/ d# s
- glDisable, GLenum<2929>
- D: `6 g0 u8 `$ O - glDisable, GLenum<3008>+ K" i. C" B/ D* n: I8 {
- glDisable, GLenum<2896>, T/ L% R M# o% j/ f. X
- glEnable, GLenum<3042>
1 G4 M9 h; s$ D: H - glDisable, GLenum<3553>+ M$ Q, e7 Y( m; S% D+ ^, y
- glBindTexture, GLenum<3553>, GLuint<631>
0 {6 t* _/ M$ `- h9 X$ ~ | - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
/ r* Y! j7 M8 | - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>6 ]$ a4 q$ O' \9 J7 l1 n$ \
- glClear, GLbitfield<16384>
5 i3 ~3 z' E6 s9 f - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
) ~" I7 u9 j+ [" [/ ? - glEnable, GLenum<3553>1 T9 |% d w/ D3 y" X$ Z
- glBegin, GLenum<7>2 i6 G' U) U g* F6 X( d5 V( U9 C
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
q" K0 t0 j$ b - glTexCoord2f, GLfloat<0>, GLfloat<0>7 ^+ q4 Q; L1 ~: _
- glVertex2i, GLint<0>, GLint<768>% {. t2 a9 f2 v, C; L
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
+ @. Z+ i8 @( S0 }, w - glVertex2i, GLint<1024>, GLint<768>
/ l* B* k2 G1 A0 X/ R - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>2 q+ a- z4 J* o! I4 O k
- glVertex2i, GLint<1024>, GLint<-256>. [4 b0 @8 G# h. g
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
! ]. @6 W! b0 c" j - glVertex2i, GLint<0>, GLint<-256>
* c% X' d- _! c" h W
复制代码 4 c5 D% L* U2 I& p
$ H7 ?" D, c$ S- w
|