本帖最后由 shane007 于 2023-8-25 17:31 编辑 # C" L2 b* |: x3 A* l# O; v
+ }1 H; {' Q0 w0 A+ |0 I本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
6 ]% E: c( P3 c. c5 {2 K游戏应该实际只用了其中1个,暂时作下记录。6 v+ P& e, s n) o. `& [$ G
0 Z& \" g6 J4 b" V' qDirectDraw是由bin目录下的ddraw2d.dll来完成的。
" }. R. j- a6 Q1 `" ~9 ^+ B以下是一处的初始化代码: l; y: n1 Y4 k9 ^
- CSpace:10015015$ |9 x; |* N/ D" z5 ~' [( T
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j/ G! I8 r: T: e+ G- y+ c6 v
- CSpace:10015015 mov [ebp+lpGUID], 0
9 a, e( e# i9 W S1 P - CSpace:1001501C mov eax, [ebp+dwNewLong]* y4 h. w* X9 m s
- CSpace:1001501F mov ecx, [eax+230h]6 \% C1 D v- q7 M0 [' }
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
3 y8 u% P% R' K* `& Q* X - CSpace:10015029 test edx, edx W. b$ C' U5 j. y* A1 H* K
- CSpace:1001502B jnz short loc_1001503C! x6 r$ s! S& _* v d6 B
- CSpace:1001502D mov eax, [ebp+dwNewLong]
]/ z$ j2 o+ Q# Y9 u! @6 Y - CSpace:10015030 mov ecx, [eax+230h]
6 w* Z. Z$ Z! U+ r - CSpace:10015036 add ecx, 8
% N" b8 h, v6 y7 L+ M: Z& F - CSpace:10015039 mov [ebp+lpGUID], ecx% P. y+ w) Z$ @
- CSpace:1001503C( K4 `$ k/ d, F) G; _7 C, K
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
( N7 v. j; S* v" d1 V" x - CSpace:1001503C mov eax, [ebp+dwNewLong]
/ c5 G4 G }5 G! R1 { - CSpace:1001503F mov ecx, [eax+230h]4 O1 v6 G# e$ L( Z2 C( h
- CSpace:10015045 mov edx, [ecx+1Ch]* \$ L/ D6 K! j5 B
- CSpace:10015048 push edx
, g" p& n* S, D1 r. x* F1 t - CSpace:10015049 mov eax, [ebp+dwNewLong]
9 u7 v# b. X3 V( s - CSpace:1001504C mov ecx, [eax+230h]
; i: F$ f& D. G8 f; q: [) F4 w - CSpace:10015052 mov edx, [ecx+20h]
. `# r R0 x6 ^" s - CSpace:10015055 push edx
9 P5 ]1 o2 `: T& A - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"* p2 D7 ^+ v: w( Z6 p0 q
- CSpace:1001505B push 3" ]$ P- s2 h- a; P& g2 L
- CSpace:1001505D mov eax, [ebp+dwNewLong]
6 J# B. F" j/ c+ J7 u+ G8 Q, p - CSpace:10015060 push eax
$ ?( P" _/ b! W) B: l9 b - CSpace:10015061 call sub_1003882A
$ M+ R9 u) a4 V - CSpace:10015066 add esp, 14h: W7 P4 o$ V2 X* |. Y& |, R
- CSpace:10015069 push 0 ; pUnkOuter9 n/ K }+ ]0 b' y- P: M
- CSpace:1001506B mov eax, [ebp+dwNewLong]
( |# ^& `- o% w1 t" ~ - CSpace:1001506E add eax, 1DCh/ B+ W6 L0 B" a% g3 G# U. a+ }% P
- CSpace:10015073 push eax ; lplpDD
! e {/ R4 z- y' @: i# x. \ - CSpace:10015074 mov ecx, [ebp+lpGUID]
, z0 \+ e/ P% u% M; y: B7 H - CSpace:10015077 push ecx ; lpGUID
) C2 h0 A5 E1 `: [+ I9 r0 e1 @ _. | - CSpace:10015078 call j_DirectDrawCreate& u% {9 q. W D6 s4 K. L4 ?
- CSpace:1001507D mov [ebp+var_14], eax3 C9 s( T8 J: Q7 D1 [& G
- CSpace:10015080 cmp [ebp+var_14], 0
- F j# F3 R8 R" S* G - CSpace:10015084 jz short loc_1001509E
) p" l" ], ~3 Y' v- Y7 n& P( r' c) H - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"% c/ ^7 r3 R2 S6 X
- CSpace:1001508B mov eax, [ebp+var_14]
0 ]( p9 g j$ W. S - CSpace:1001508E push eax! [9 Q1 e" E; s7 v
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
" \3 ^( @5 }. i- v+ _# F* e - CSpace:10015092 call sub_10038F3C
- Q u; {* s9 [1 v9 ~4 N1 e6 W# M - CSpace:10015097 xor al, al
/ |) [$ C0 _+ r% A: v% e - CSpace:10015099 jmp loc_10015173
复制代码
& v1 p% F/ e( c2 [4 E6 r4 o! v% ~/ A- D+ b6 w, K
/ I7 q! U/ U# u$ J+ h# `" `; \我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
+ n& y' D6 D) c3 _; N( z记录到log_GL.out文件中。以下是摘录的一段。
9 t7 A+ u( u4 B9 U1 Z1 @, F我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
4 z5 ?2 |# m/ g# t1 M, M以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
; k9 _4 {/ L }& u0 R7 V- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>3 q. T6 U* x8 _! g+ ^. U- c7 t
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
5 @- U6 E7 O1 u3 V - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>2 T2 l7 R+ @5 h. V- U8 b
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
1 x9 V: X8 O* q& o4 X3 k - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>$ B; B9 P4 V" Y% u
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
: \% `' y8 Z- `% G9 M - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
0 L7 B* |, a1 @% |4 q6 @% `2 D# |* d - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>3 U# b1 l7 ]- L* }7 T
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
2 C! B9 f9 {9 [5 n - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
! B# l5 q; l9 h+ [0 W - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>$ V m3 w; j' s% r. n, N5 [
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
8 ?& g. J0 w+ T) H* D1 T3 c - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>) {# K( u# X1 z q- B, r3 f1 @( f
- glClear, GLbitfield<256>9 _7 h- o/ |' u6 j; B4 H' w
- glShadeModel, GLenum<7424>
7 I4 F V2 h) |0 x9 S - glDisable, GLenum<2929>/ g" U% O( `- N0 q% O a
- glDisable, GLenum<3008> `: Z, o6 Q1 `& K. |* `2 i8 J3 g
- glDisable, GLenum<2896>
/ p% e0 k* Y$ a8 T+ { - glEnable, GLenum<3042>" b7 T0 v4 ~$ D' \, d9 n; J
- glDisable, GLenum<3553>
6 h5 H+ J% e: |. W* Z2 l. `3 O - glBindTexture, GLenum<3553>, GLuint<631>
. A8 M, Z, x' H7 c - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>7 J6 v5 }' R* f9 t# |+ l
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
' g7 l/ y! {6 ]6 w: L" Y- f - glClear, GLbitfield<16384>- V& n* \6 J/ @5 p6 G8 @: e
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608> P7 l3 }8 a5 q" [' e2 m) A% s* Z8 ]; t
- glEnable, GLenum<3553>
" }% A& B. G5 ~3 u - glBegin, GLenum<7>
* e8 m1 V6 P/ E/ ?" ~' C) t - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
$ T- C# F% h: z; x3 ]( ^8 E - glTexCoord2f, GLfloat<0>, GLfloat<0>
& z# p" `! `9 a8 T) @ - glVertex2i, GLint<0>, GLint<768>! y: `7 t3 S7 l
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
/ c R. o( s7 K! o- o3 x. \ - glVertex2i, GLint<1024>, GLint<768>
9 W" F# B7 z2 x4 A9 O - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
# v. |# _/ v* u6 w# `- | - glVertex2i, GLint<1024>, GLint<-256>' `* B9 `0 Y& k7 R) a" I
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>$ B) p! t$ w" [& @2 v+ S
- glVertex2i, GLint<0>, GLint<-256>' ~+ l4 O& h1 [0 \$ K
- glEnd1 y4 N/ P6 [ q. P* {- o) c9 |
- glShadeModel, GLenum<7424>& c: X: a: S+ V7 X
- glGetError N/ l a5 s& g# A& N4 Q/ S! j; Q# i* t7 l q
- glDisable, GLenum<2929>
$ {% l1 t0 P# Q1 j, A - glGetError
& k8 H* g: e+ A, o3 R9 N5 k5 Z2 } - glBlendFunc, GLenum<770>, GLenum<771>
; M! i2 s7 O/ Z! J9 l - glGetError
' w! R: m" t$ ~- d3 \ - glEnable, GLenum<3042>7 w D1 R' d$ M# N/ a& I5 \
- glGetError/ B6 j5 C' ^. G- u
- glDisable, GLenum<3553>
6 d* A3 _7 [* l3 t8 h# i- R - glGetError* [. E' f6 w1 N+ B0 T
- glBegin, GLenum<7>! U, {7 B; p; D; A0 ~2 D
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>4 ~! P/ m9 ^# h* j* l$ d
- glTexCoord2f, GLfloat<0>, GLfloat<0>
% z, r; D( m/ p% J* t- r - glVertex2i, GLint<0>, GLint<768>
$ ?+ x) I& S& C4 @4 Y: D' O - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>( Y+ P2 |' C, K' A7 f6 A3 d1 H5 U
- glVertex2i, GLint<1024>, GLint<768>
8 ?( W. F+ |4 H+ R" F2 T - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
2 z Z5 R# E. A- p$ C5 W- Q- Q - glVertex2i, GLint<1024>, GLint<0>
e) w( k) r" b$ c - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>7 X7 a1 a- `, M' I* Q; x; [% B
- glVertex2i, GLint<0>, GLint<0>
8 S+ _* h$ Z( k - glEnd X4 I% ?" L9 o( u
- glGetError
( R* P! u& B& W" {3 n8 O1 o4 Y; J+ u: w - glEnable, GLenum<3553>
0 W0 S5 f6 Q- G" T3 i# w. F) h - glGetError: q! ]1 {0 y7 e
- glFlush v" t& V' l. `& A' o
- wglSwapBuffers
* d$ s7 {3 M9 ] - ---------------------------
: ]0 f, f4 N1 ^" V1 s: z - , HDC<-33484711>1 B. ^( e* l' Q
- wglGetPixelFormat, HDC<-33484711>! Y0 ^2 a; z, h7 N. R# S
- glMatrixMode, GLenum<5889>" P+ x: j# m2 A, W
- glLoadIdentity
- h" c9 U7 x7 A9 ]; n3 V - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>: W9 o8 |* {+ a+ @
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>' @6 K) w9 d, L( s9 H/ c# q' R) Z! O
- glMatrixMode, GLenum<5888>0 }" o( ?. C# D; i
- glLoadIdentity% X$ b" ?. y( q8 B
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>7 P( e) ~4 P( f0 t% D$ y+ A
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! `3 r0 O: \3 `' h
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>; g' ?# N0 I f8 f2 \
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>: Z0 N0 t6 ?; n" a. ]# J) z/ d9 q
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
$ A0 G, k O% G3 Z/ C2 p - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
, W1 D H8 b: D# n# E- f6 Y; {+ f - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
6 h0 L1 e4 R5 _7 G$ M - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
6 y( ~/ \9 T" t+ | - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
' X- ?6 T$ U5 k+ q+ V+ }/ W - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>! E' A0 V4 I0 b- n) f' j3 j6 {* N
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>4 x5 _: Q; C! m8 A3 N9 i% D
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
% b3 x4 I4 Y: Q: X; w - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>5 r: ~) \+ h) C& ?
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
/ k( j- H5 f9 p- F' _6 Q - glClear, GLbitfield<256>! f0 J- R% L& j$ i' L# |. M: z
- glShadeModel, GLenum<7424>
7 Z' R8 T* o& _1 v - glDisable, GLenum<2929>
" b G9 i" _/ G; Q. F - glDisable, GLenum<3008>
' I7 p4 i' g- r3 n7 l* ] - glDisable, GLenum<2896># o' t% [, J, k9 l$ u k8 D4 z: w+ l
- glEnable, GLenum<3042>5 G3 r& t1 r1 f, ?, V6 J
- glDisable, GLenum<3553>' _9 O* j* `* d" e- s( U2 R
- glBindTexture, GLenum<3553>, GLuint<631>" \0 M9 V! F4 H4 v$ R! Y
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>6 ]7 I8 D# z6 I# z% H
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
1 E# j" {+ [0 e: p7 G* X0 A; E+ `( T - glClear, GLbitfield<16384>9 \5 R& ~- v4 X) r
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>7 I0 I) P6 U6 ^% I) t; H E
- glEnable, GLenum<3553>
8 g7 \0 I6 n. d" E4 h7 R - glBegin, GLenum<7>- {3 H& k0 i* n$ w5 V4 }
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>; l4 m* P# `2 \* T6 E: j
- glTexCoord2f, GLfloat<0>, GLfloat<0>
& n- L3 K! X3 a - glVertex2i, GLint<0>, GLint<768>
' E( c# z3 u& Z( D4 P6 @ - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>! T4 h% G% R* E9 X+ n# m/ N$ m
- glVertex2i, GLint<1024>, GLint<768>
" Z) @7 K, C* J) v4 Z: f- q8 Q9 O$ k - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>' R* u2 _1 M' R7 l0 N6 P
- glVertex2i, GLint<1024>, GLint<-256>8 G0 s0 L. v# z8 b/ X' z
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>+ O. A3 K k4 Y2 S( w$ H& F
- glVertex2i, GLint<0>, GLint<-256>
* {: h+ E; I1 c2 B. r( o$ h$ o
复制代码
0 r1 W O( W* v! c( i
" s! W9 _, Q1 \8 s+ y! u9 I |