本帖最后由 shane007 于 2023-8-25 17:31 编辑 # P7 m* S3 N. f5 s% y
0 x* q' j, l0 b6 s8 A6 }% e本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
' ?! q+ T: O7 K: d9 g8 z游戏应该实际只用了其中1个,暂时作下记录。* r7 w5 g3 Q5 L: {
. s$ N m3 u% t K2 j
DirectDraw是由bin目录下的ddraw2d.dll来完成的。
# b) c% _. {3 `) G) M以下是一处的初始化代码
3 P1 @3 T# i: Z( p- CSpace:100150153 n7 C* G# [7 i* F; \0 I! d1 _
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j' k3 ]2 P( [1 F
- CSpace:10015015 mov [ebp+lpGUID], 0, D$ L1 y) j$ a8 X+ p2 W* L: [2 d
- CSpace:1001501C mov eax, [ebp+dwNewLong]5 a7 s8 f) I+ I1 J% t, C0 D& z
- CSpace:1001501F mov ecx, [eax+230h]
* S! P m) I, R/ Q/ s - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
$ z( |7 o' r9 E* I, k - CSpace:10015029 test edx, edx
- M* B: m r& W2 e6 N: l# w - CSpace:1001502B jnz short loc_1001503C' W' [: A2 `3 I d
- CSpace:1001502D mov eax, [ebp+dwNewLong]
. q, B2 z; j l - CSpace:10015030 mov ecx, [eax+230h]& I. V# e+ J- y8 S3 u N! @7 E( L7 a
- CSpace:10015036 add ecx, 8
/ X# E# P9 m, I - CSpace:10015039 mov [ebp+lpGUID], ecx/ Z! |8 f, d5 Z8 Y/ E6 O
- CSpace:1001503C
- L5 F( @! E7 E" f$ Z. z% A% x - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j) E" s% T7 w) v" v! h! T, K F
- CSpace:1001503C mov eax, [ebp+dwNewLong]
) N1 u$ g0 g) K: |* p4 X& F& o2 A - CSpace:1001503F mov ecx, [eax+230h]2 o7 Y0 |8 j6 @7 P7 V+ c5 G0 L
- CSpace:10015045 mov edx, [ecx+1Ch]6 i& L2 W6 _4 ]2 x, X
- CSpace:10015048 push edx
8 J4 {/ x) o' O$ C - CSpace:10015049 mov eax, [ebp+dwNewLong]
& v% t. s7 n: K+ i9 P) J8 Z - CSpace:1001504C mov ecx, [eax+230h]
$ b* S$ P" }# G - CSpace:10015052 mov edx, [ecx+20h]
5 W) m; S$ E3 Z, n; H - CSpace:10015055 push edx B. |1 |: d6 ^2 I4 p9 L
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
4 ~4 B }/ L* ^' H! d - CSpace:1001505B push 3
% M( U' V5 Q4 X2 l1 g6 `! z - CSpace:1001505D mov eax, [ebp+dwNewLong]- S' i0 r( K; L& G9 f
- CSpace:10015060 push eax
+ `: ~0 C1 _( n, ] - CSpace:10015061 call sub_1003882A
7 x9 F' d; K6 C; d0 b - CSpace:10015066 add esp, 14h
, H/ y5 ~/ f% ^3 f0 l9 _2 q7 U& x - CSpace:10015069 push 0 ; pUnkOuter
, @, \; s( f' Y) Q1 l - CSpace:1001506B mov eax, [ebp+dwNewLong]: }! K) a$ ]+ g. [' v& S* C$ Q( q! F
- CSpace:1001506E add eax, 1DCh
( o- j; X G7 ]% H( T) m - CSpace:10015073 push eax ; lplpDD9 d9 y3 g. f1 }) T) {) f. d5 l5 z
- CSpace:10015074 mov ecx, [ebp+lpGUID]
2 O6 f! y8 d4 p+ v6 z* Z8 e) [ - CSpace:10015077 push ecx ; lpGUID4 b# M5 D1 ]% t- ]/ c$ s/ ?
- CSpace:10015078 call j_DirectDrawCreate
! D. k3 U; G8 G f - CSpace:1001507D mov [ebp+var_14], eax
% w; t! s5 v5 {2 X" J0 y - CSpace:10015080 cmp [ebp+var_14], 0& L9 }5 B- @; i2 ?+ C) c! T
- CSpace:10015084 jz short loc_1001509E
' y0 R6 |% \# v% T6 j h3 i - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
, J. ?+ _ O: N) F6 X- j, d - CSpace:1001508B mov eax, [ebp+var_14]2 a* C' {, L% D4 |: G( C: x
- CSpace:1001508E push eax E+ S, Q/ b2 a% j+ ~
- CSpace:1001508F mov ecx, [ebp+dwNewLong]+ @) F$ r+ P( C
- CSpace:10015092 call sub_10038F3C0 j" b+ n! j6 i4 L- t
- CSpace:10015097 xor al, al3 W" n$ Q+ s: S# S. K1 b9 \& x0 W
- CSpace:10015099 jmp loc_10015173
复制代码
/ F: f n9 Z1 f. J0 u* d3 l# e) w3 n9 h R+ h- V
# s& A7 j3 |* O7 r我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log." l5 {2 P0 Z- O/ x) H6 K
记录到log_GL.out文件中。以下是摘录的一段。
# k n# n$ j$ @9 r6 S$ g* `/ u. y2 {我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
. h) [! n3 [7 T# t3 u( \以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
' E, ?+ }* c4 b. q* C5 g& ~- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! y1 X; g6 F6 \* j
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
- ~( s( L% X! H3 f - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
( [+ r' Z2 I' @" Z - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>% d2 s! U6 G$ p
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
' b& p4 s. T+ s4 c - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>, C" h9 o) v# w3 G1 I7 ~& S
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>8 L+ d: G5 @3 Q. R& j- x
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
, M( H" _: m( U7 S/ l" n - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
7 B8 d2 y+ j. ]3 h9 \& W- j# } - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
+ f l4 S6 A% Q/ y, b( y - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770> k9 H" T0 [# D7 `
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>" S1 B2 a+ Q( e* _7 b
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>) y. {& Y% d1 ^3 f k
- glClear, GLbitfield<256>
7 T8 Y: ~7 l% E2 ]+ `$ ^$ M - glShadeModel, GLenum<7424>
5 v Z5 j5 C8 w) B- E* x - glDisable, GLenum<2929>' e% F" j( D4 u
- glDisable, GLenum<3008>/ ^3 `6 T6 q6 h+ H3 b( c
- glDisable, GLenum<2896>3 E3 U/ W6 W& t3 Q/ R! U [. p
- glEnable, GLenum<3042>8 N' P6 @) a2 ^* E- k, Q
- glDisable, GLenum<3553>
- ~+ f$ n) c( B- K - glBindTexture, GLenum<3553>, GLuint<631>
) v1 e; p0 I: H6 w - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
* I) i8 n2 r: }+ W - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
C- ?9 Q. s! a. @: q% X9 Y - glClear, GLbitfield<16384>
3 Y( x) E6 J! b1 L- L2 ~ - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>4 [6 \! B a+ D& D
- glEnable, GLenum<3553>
' n8 j0 f0 U1 l - glBegin, GLenum<7>
2 V {& K$ T1 \% ]3 u9 l - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>9 x( v2 p* _* J0 e! s5 V
- glTexCoord2f, GLfloat<0>, GLfloat<0>
! F% P1 Z6 a, C( x, Q - glVertex2i, GLint<0>, GLint<768>. n" _3 x) ^7 G9 X( F. v
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
% B; u2 M+ H) ?3 s% G - glVertex2i, GLint<1024>, GLint<768>& c0 G0 q# n, C9 o1 M
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>0 d0 G" O5 A# M( s
- glVertex2i, GLint<1024>, GLint<-256>7 b# M- H2 R" Y7 \% W- [* b' T
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
E1 L' B" {& L2 | - glVertex2i, GLint<0>, GLint<-256>5 x# t& p, F5 n. U" C
- glEnd
3 ?: q5 m$ c* g4 [$ x9 i. }& w8 ^9 ` - glShadeModel, GLenum<7424>
7 X. @8 k: B5 d - glGetError4 A, ?4 q2 U) j$ B: [: K" S
- glDisable, GLenum<2929>( N9 L% @7 ~9 W" x. f8 `1 j* D
- glGetError* s! ^/ G% n; c$ S2 `
- glBlendFunc, GLenum<770>, GLenum<771>
/ i' K# Z" w& F( \, c9 z, R - glGetError
. g5 _/ @: a8 r1 Z& ~ - glEnable, GLenum<3042>
5 p' R R2 |' h1 z. k - glGetError* m% y6 m" u* M3 g- L
- glDisable, GLenum<3553>( @7 V- _* h9 Y1 x4 O
- glGetError+ j/ v. H4 C- L, m
- glBegin, GLenum<7>
; B( N9 A& j G) n - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>) \3 A4 z# G9 C8 {
- glTexCoord2f, GLfloat<0>, GLfloat<0># c6 X/ `# ^. } Y3 z+ S
- glVertex2i, GLint<0>, GLint<768>
% w: g ^4 f7 W8 I - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
& l0 c' m+ [/ V( z0 @5 @0 _ - glVertex2i, GLint<1024>, GLint<768>3 u M! z- _, l, V6 s
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
' B" T: h J, R6 B" y - glVertex2i, GLint<1024>, GLint<0>7 h E# E: a( H+ B6 J) Y& b
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>1 y1 T* W0 {. g% e
- glVertex2i, GLint<0>, GLint<0>
& r, @/ U6 N8 ^3 H& w7 Z# w - glEnd
]5 n7 `' B8 @ - glGetError c a; x9 w9 T9 T6 J
- glEnable, GLenum<3553>
4 X: r1 u% `+ o$ K - glGetError6 f2 e F { E4 f
- glFlush+ ^- {- ^5 u) p$ {9 ]5 \
- wglSwapBuffers
. e3 j }# t) u$ f) i. z - ---------------------------
2 W5 O( y; y# \& {7 u# P$ o! Y; F - , HDC<-33484711> s: G: S4 d" W
- wglGetPixelFormat, HDC<-33484711>
. V6 z: |! r$ E; T K - glMatrixMode, GLenum<5889>6 o0 d6 z& V$ z& Z0 G! A0 X. g! ]5 w
- glLoadIdentity' S8 ^" ~4 k" U) Y5 w% l
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
, h3 \: Z- x* |' o, o - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
) x5 N9 u8 _' M; E1 H. { - glMatrixMode, GLenum<5888>3 Q' n; J- M+ P4 E% B: b @1 _
- glLoadIdentity9 `$ J9 A5 B; S/ t8 s s
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
: ?* I" U" V4 ?: T! `1 o1 t* X - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>) F& T' Y. ~* t# n4 p! L* M
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>1 A. p3 U+ S' I4 C4 O* _
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>4 L# R' O/ @8 v: V5 q
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>% ^ ]" z& T' ^. G5 [
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
3 o' C: A# Z; Q: S8 w1 e - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
! a' j* l% T4 B - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
+ N* w8 s, G; B' S, l' C8 ` - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
! G& W8 o3 [. `5 ~8 b. t% H6 [" W% L - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
. g5 e. R0 B9 b/ Y: E+ I - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
3 j, D- ~. i, U; @; ?0 e5 ^% b - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
+ T7 x. ^) N. i# t7 n - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>* D; K0 m" b1 F) j1 i' u0 ~: T) c
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
$ d3 H- N( h* U! t0 \ - glClear, GLbitfield<256>
$ Q2 _: {7 b, `4 z6 v& h& h - glShadeModel, GLenum<7424>% B6 M9 r2 X. W5 m
- glDisable, GLenum<2929>
3 F; }0 [8 H5 {6 A( V - glDisable, GLenum<3008>
, T8 i2 \4 L) \' A4 p - glDisable, GLenum<2896>0 O2 v, n# ]6 `( P9 ?
- glEnable, GLenum<3042>
4 ]' ~/ c, |% a! Y& c! R9 p4 J+ [ - glDisable, GLenum<3553>
0 p9 y j. C2 A, P: t - glBindTexture, GLenum<3553>, GLuint<631>6 P. t, G/ |4 \7 i, a
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
8 g4 R+ f# G5 y3 x9 ^. X; B - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>. C' b/ e8 Z: d- O2 y
- glClear, GLbitfield<16384>& d( n# s/ M4 g" C0 T" n9 \6 ~8 w
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
2 H# N5 ~! |( G' h% g - glEnable, GLenum<3553>7 _1 n7 @9 M6 y8 e9 H- O
- glBegin, GLenum<7>& R2 [7 n9 ?; k/ p* ~1 @6 y
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
U& ?+ [, h7 O6 }. f - glTexCoord2f, GLfloat<0>, GLfloat<0>8 ^" K) h1 y- V: [. J
- glVertex2i, GLint<0>, GLint<768>2 V- @$ I+ M9 H- h7 G
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>7 |5 z4 c9 I6 Z
- glVertex2i, GLint<1024>, GLint<768>
- j9 P$ B M0 }0 ?) G& G" @ - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
& E; i% w, O4 `8 p" u: B* z A+ b - glVertex2i, GLint<1024>, GLint<-256>
0 m! |1 O1 N& c; ^& } - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
' A* w, L2 a& Q J2 K - glVertex2i, GLint<0>, GLint<-256>
- y" c- B+ a! a% S9 ?4 Y
复制代码
% |( b. X' y) G# ^
4 ~: Y& |/ x8 h0 z8 Z3 L$ u; g: G |