本帖最后由 shane007 于 2023-8-25 17:31 编辑 8 t+ E& P# b; d4 P ]2 u
k: l# S: c# x* `4 J, R本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
2 W# T7 @' k9 a% U j游戏应该实际只用了其中1个,暂时作下记录。! G1 j, v& d; c/ e
3 B# I' d9 _* e" g0 [+ P, ?
DirectDraw是由bin目录下的ddraw2d.dll来完成的。/ n# a0 k4 L1 |" f- L5 N
以下是一处的初始化代码
$ X1 J m+ S) }. i* U* x% e' D- CSpace:100150154 z4 P8 G" u* M6 _5 M7 V0 Q6 N1 T! b
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
2 w& x* `# D# b7 p; o3 N - CSpace:10015015 mov [ebp+lpGUID], 0
* l0 O4 h8 e6 I. m$ [* C - CSpace:1001501C mov eax, [ebp+dwNewLong]
( F2 H* Y! ^+ A3 ?: H3 E - CSpace:1001501F mov ecx, [eax+230h]
2 n! X4 Y) O/ q9 F* _) V - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]6 w1 }; P$ i. V7 K7 P
- CSpace:10015029 test edx, edx
3 X# V2 y0 l* t+ U) L. H - CSpace:1001502B jnz short loc_1001503C
$ E+ m" V, r8 F - CSpace:1001502D mov eax, [ebp+dwNewLong]& h1 g5 W- U! \4 [
- CSpace:10015030 mov ecx, [eax+230h]# E) g2 C2 H( Q& p- p) W
- CSpace:10015036 add ecx, 8
6 @/ {) W: u. ?; p# I - CSpace:10015039 mov [ebp+lpGUID], ecx) s% z. i, E2 s, f
- CSpace:1001503C0 M h' q' k% l+ d) d
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
; t& X2 } F! v! w% e2 o+ f - CSpace:1001503C mov eax, [ebp+dwNewLong]
% O* U& S- `! N" Q$ n - CSpace:1001503F mov ecx, [eax+230h]
5 W- k! Y. i% P+ u# J7 h: V2 e - CSpace:10015045 mov edx, [ecx+1Ch]
9 s; Y1 U$ D7 i( H) g8 } - CSpace:10015048 push edx2 R0 w% C( U3 |/ J: `* e
- CSpace:10015049 mov eax, [ebp+dwNewLong]/ K, u! O6 A9 V% @
- CSpace:1001504C mov ecx, [eax+230h]& o* J2 ?( D, r, L0 O0 E5 m
- CSpace:10015052 mov edx, [ecx+20h]
1 F+ J; }; M! I3 A5 I4 n$ I - CSpace:10015055 push edx
* y& K# l$ w3 { - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"( M, f. F" R: J; [; X1 F& D" p' X
- CSpace:1001505B push 3( D& _; c6 F3 U
- CSpace:1001505D mov eax, [ebp+dwNewLong], f; l- A2 j% c/ s l2 c- X
- CSpace:10015060 push eax" L# N! d: J# C1 U# H8 Q
- CSpace:10015061 call sub_1003882A
; h; i0 p ~4 h! Y' O - CSpace:10015066 add esp, 14h8 ?8 S. z: t" n* G6 l' w
- CSpace:10015069 push 0 ; pUnkOuter$ T* X$ T+ l( u
- CSpace:1001506B mov eax, [ebp+dwNewLong]. O8 B0 ~4 J0 u: Z4 Q- u! j
- CSpace:1001506E add eax, 1DCh6 L1 |9 H9 j+ T, I
- CSpace:10015073 push eax ; lplpDD
) a8 G& o& v/ J" E k- r - CSpace:10015074 mov ecx, [ebp+lpGUID]
! N3 m, f. i* h" J. ^ - CSpace:10015077 push ecx ; lpGUID1 ` _- h- ~) t4 W
- CSpace:10015078 call j_DirectDrawCreate, G7 z/ {, R7 X& s, u
- CSpace:1001507D mov [ebp+var_14], eax
6 E& j' x/ c9 k3 L6 z/ s" i S - CSpace:10015080 cmp [ebp+var_14], 0" e# l- H0 P% d
- CSpace:10015084 jz short loc_1001509E" x( x J+ \" [! o* p
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"* ^; R9 I! y. p5 T5 M
- CSpace:1001508B mov eax, [ebp+var_14]5 o$ M0 w- t+ E5 A7 ?9 L( `& X
- CSpace:1001508E push eax7 G; Y k# J- P% l/ h
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
9 q# `6 |5 T1 Q6 F6 V, K - CSpace:10015092 call sub_10038F3C
# S' [5 {1 D5 j - CSpace:10015097 xor al, al7 k, }1 ?3 K7 ~5 j5 S" r
- CSpace:10015099 jmp loc_10015173
复制代码
, R7 d. h- X& F7 U; u% o
2 Y5 r4 k, Z' w' F
/ X5 ^/ r- ^+ H# E5 `9 c0 H8 T4 [我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.! b$ e% p( N+ C
记录到log_GL.out文件中。以下是摘录的一段。/ y( L9 K) [% b% z; |6 I
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。0 m* v7 m9 E: h3 L4 l, R0 `
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?. }8 D( Q* N/ i8 _+ [6 b; W& N- c
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>4 d7 d& `) d2 m: S8 e, @; \
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>2 [. j1 m. H9 W
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>) Z4 b. u6 \0 o: T0 w, L
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
+ K$ L2 d0 {( J* t/ g - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
0 D* F9 m" B8 T# W; L) J6 f - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>6 P2 c& O ~) _
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
% h6 K: V6 b5 L$ t, I - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>, i- n% d9 x0 O; G5 G" }! Z
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>: S. [ O( y; r, U' c" q8 @
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>; B' p# `6 ^% p5 U) r! j. q I
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
5 \* G: N0 P, |' q r - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
$ q0 t/ h" C+ M9 S8 n3 ? - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>$ _. ~- [' h$ Z3 J" K4 P
- glClear, GLbitfield<256>
& U3 Z3 y- ]2 ~+ s. m7 B: w0 I - glShadeModel, GLenum<7424># `5 {% h$ A! I) h
- glDisable, GLenum<2929>7 o1 A; ?& o* i) m$ U
- glDisable, GLenum<3008>$ `6 ^6 @9 I* U% P1 O$ k8 g
- glDisable, GLenum<2896>
, q$ }. G) q Z- G' o - glEnable, GLenum<3042>
2 V! ~6 `$ q. l9 E" z, c, F( C6 P - glDisable, GLenum<3553>
0 e4 ~1 V9 Z; T9 o& K - glBindTexture, GLenum<3553>, GLuint<631>' ^4 ~+ ~- _' [2 {; h
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
& q* i7 a( r0 a/ E& i) h - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
L7 {' L p5 X - glClear, GLbitfield<16384>+ R, l, }6 ]& }' @0 d
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>$ K4 y3 H) w) e* g) i2 q
- glEnable, GLenum<3553>
( ^! I5 Q5 x' H# Z* f+ D - glBegin, GLenum<7>
|6 ^# F" T& D6 U! o) C - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>! b# k9 {& p. w+ v- y$ H" a& U7 t$ U
- glTexCoord2f, GLfloat<0>, GLfloat<0>
: {( T2 c6 d7 u$ \7 _+ D, V - glVertex2i, GLint<0>, GLint<768>% f: _# Z( Z# ?' i7 {
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
' L, S% v: ?/ S) H) e& ]/ ` - glVertex2i, GLint<1024>, GLint<768>
9 H' o$ f' l! H% E5 ]- L - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>; o2 ~/ m7 |1 k; e4 @, \8 s' M8 F
- glVertex2i, GLint<1024>, GLint<-256>8 M7 ]- y, Q0 }3 l# Z
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
9 I3 {$ f; X2 G; G2 J - glVertex2i, GLint<0>, GLint<-256>
5 O, }. ?& e: y - glEnd6 a, k9 N9 V# T9 ~0 B" u: R: g
- glShadeModel, GLenum<7424>, ~4 R1 M' K/ ?5 ]+ e, V
- glGetError
) D1 K2 s4 @3 v - glDisable, GLenum<2929>
; t6 v3 H# g, D' [ - glGetError2 w( F# @* j2 t# R; E W- I* r
- glBlendFunc, GLenum<770>, GLenum<771>. \$ b( {! J2 l/ n5 f0 \
- glGetError
9 o9 a$ W; ]6 M6 a3 z, A - glEnable, GLenum<3042>/ A( ?; V, ?. R
- glGetError
0 a$ j. B) ]% {3 j* w - glDisable, GLenum<3553># o6 ~7 p7 x- D! H* H6 \) G0 d9 E% j
- glGetError
' N) o3 W( p) p3 Z1 i2 ^$ l6 J - glBegin, GLenum<7>; m# }$ F( g9 \: }- e9 _
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>/ F8 N- U! x7 X7 A& ]2 h! r9 y4 t0 z
- glTexCoord2f, GLfloat<0>, GLfloat<0>
3 ?' [' }: J# E! A+ l0 d l' j& r - glVertex2i, GLint<0>, GLint<768>: y" l7 |+ S+ U9 T$ |
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
# }, K# E I$ P3 v ?* X - glVertex2i, GLint<1024>, GLint<768>
- c$ K) G J3 o9 ] - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
0 l! p" o; D; Y; p' @ - glVertex2i, GLint<1024>, GLint<0>1 C$ }$ E+ M7 s$ C8 ~
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>. H( V4 C2 L2 I& g; y
- glVertex2i, GLint<0>, GLint<0>% A" ?- b! t( V7 t' _" N
- glEnd
( u1 J) y8 y& V9 R - glGetError- ], c$ v# |! j7 m# o4 C
- glEnable, GLenum<3553>
6 F" g' \" Y: J( z' A5 i - glGetError" V r( m! _8 [
- glFlush
* x" Z) h1 p- P5 U - wglSwapBuffers$ t1 e, w, ~ C+ j
- ---------------------------3 n9 T- n' J" z1 W) y6 m
- , HDC<-33484711>; {5 U% a" i8 v
- wglGetPixelFormat, HDC<-33484711>9 l, R* x, r6 f$ Q
- glMatrixMode, GLenum<5889>
0 h( [9 H0 {9 z L - glLoadIdentity7 z* G) x8 N. b7 H8 V+ {/ C
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
' w! p; I9 |- _0 i, A - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>5 M" f6 A! J+ N" m6 l8 f; n2 t
- glMatrixMode, GLenum<5888>
; L3 c5 g4 y, _ - glLoadIdentity2 D) ^, w D% q, Q8 X
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0> t1 v6 m% H+ B! N9 F: y+ i
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>" i0 D/ V6 Q3 V q+ h( c& x: |
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890># b. M% Q( {5 W/ [& H" Y3 B
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>& \" p: L% C4 M9 Z) z
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>8 I: i3 U% d4 A
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
! W/ g* i1 g8 }3 S. ^4 c - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
7 U2 w. i9 \' C - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>% g- i3 G2 }) H8 Q& L* j
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
6 ^( a2 n4 T6 ? - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
* O$ C, x' c, U3 F! W* Z - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
?& `' X# d, j - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>2 \# H5 T3 P M7 Y. X- E+ y
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>; |: _8 P! z& h) m' x% O# _
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
' v' ^% f, Z# I2 L: k - glClear, GLbitfield<256>$ b: a. C% t; `
- glShadeModel, GLenum<7424>
/ u) T! N2 O3 N2 _ - glDisable, GLenum<2929>
) ^8 T Z% n( w" \3 i. P - glDisable, GLenum<3008>9 b9 P5 }# t' y" |: ?# E; w
- glDisable, GLenum<2896>* l. W( h/ | W1 g. J% Q) F
- glEnable, GLenum<3042>
6 g9 q9 n5 b' G! L- E7 a$ l$ F1 k2 N - glDisable, GLenum<3553>- F$ s3 L1 [: {( p& b' d" G( l: U% g
- glBindTexture, GLenum<3553>, GLuint<631>
! n0 O6 D- |8 n - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>9 \ a; i% _7 n3 l
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
( u$ t, `: Q' l6 H, L - glClear, GLbitfield<16384>
# m6 _8 E: ~# B$ W0 E - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>3 `+ Q" p4 f; E. o& M1 l9 W2 D
- glEnable, GLenum<3553>! Z: x& D6 {4 V
- glBegin, GLenum<7>0 o' b4 C5 F1 V/ `% _
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
7 f1 {* b8 D" k" S3 k* O9 L - glTexCoord2f, GLfloat<0>, GLfloat<0> |. W; A1 d; h6 h- B3 N3 J. B
- glVertex2i, GLint<0>, GLint<768>
4 @! k, }% j+ O8 M - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>- L( w# t& [4 O. }+ n
- glVertex2i, GLint<1024>, GLint<768>
) Z [# Y( M" }$ o- \ - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
* m" @/ o1 o) S- n - glVertex2i, GLint<1024>, GLint<-256>
6 k2 ~' _: Y. `! y - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
5 J5 C" e+ U9 C4 s. t* m - glVertex2i, GLint<0>, GLint<-256>( m+ Z8 ?6 `: V* C3 e
复制代码 - V$ U4 W' Y1 E$ R4 T7 Y; G
, d+ I% E1 n0 a |