本帖最后由 shane007 于 2023-8-25 17:31 编辑
4 _% L9 i2 _; S; `7 c9 M1 m, w0 V3 s8 k" I
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,, V: D- Q1 w! T$ ]; l. P Z
游戏应该实际只用了其中1个,暂时作下记录。
' q+ y! f7 d% p5 f. h. t* o9 F9 h$ y( |* l4 \! Y5 [& A
DirectDraw是由bin目录下的ddraw2d.dll来完成的。
0 m7 S) ~! m2 N; ]" ~) f以下是一处的初始化代码
$ y: p% E, U% F( a0 G- CSpace:10015015$ I1 _, i3 s' g- W o
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j9 _( V, \. o1 V
- CSpace:10015015 mov [ebp+lpGUID], 0
( j; q+ l( l! r& K) G$ {( w - CSpace:1001501C mov eax, [ebp+dwNewLong]
' ?* k* P3 P+ Y( X - CSpace:1001501F mov ecx, [eax+230h]/ o1 n# ]+ H' {3 {
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah] g$ J; X$ _2 a
- CSpace:10015029 test edx, edx
6 n3 L. x! o4 `$ u* s3 j - CSpace:1001502B jnz short loc_1001503C" z9 k, ~8 h6 N0 t2 O5 G5 b
- CSpace:1001502D mov eax, [ebp+dwNewLong]9 u' ?( E6 \3 J; W/ s$ B& U" C
- CSpace:10015030 mov ecx, [eax+230h]
; @7 X5 Q5 z5 Y9 M - CSpace:10015036 add ecx, 8" `# k. G7 m( u& V& h* \1 X: a3 p
- CSpace:10015039 mov [ebp+lpGUID], ecx
' z' }% F8 @! C: I - CSpace:1001503C
a: O7 f: o: z. c - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
+ C: I, O7 `) Y: a% t+ J1 f - CSpace:1001503C mov eax, [ebp+dwNewLong]
+ r; R" v% P4 p+ z - CSpace:1001503F mov ecx, [eax+230h]5 B5 s4 U! X3 u6 M5 g, U% O; \% s! J
- CSpace:10015045 mov edx, [ecx+1Ch]' I) z D/ x1 k' I0 O1 x/ }4 U
- CSpace:10015048 push edx/ z. y& ?) E( S0 a
- CSpace:10015049 mov eax, [ebp+dwNewLong]* B* g; ?: w M
- CSpace:1001504C mov ecx, [eax+230h]# m3 l" ]8 _; t2 M% ]. \
- CSpace:10015052 mov edx, [ecx+20h]
. t T* b. l9 @2 B, a8 Z5 Y - CSpace:10015055 push edx
4 h# }# X. @& [" X9 W' x6 t5 @ - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"* r4 u! e3 a/ h [3 D
- CSpace:1001505B push 3% Q& G1 d" D- ]2 A
- CSpace:1001505D mov eax, [ebp+dwNewLong]
: r9 T/ W, ~: a% F - CSpace:10015060 push eax$ F; ~9 _& }% C) L W$ y0 n" a# X
- CSpace:10015061 call sub_1003882A+ X' l; Z5 s5 ^! e/ P6 m
- CSpace:10015066 add esp, 14h
% o6 g( W+ u( A5 L' O8 X' a - CSpace:10015069 push 0 ; pUnkOuter) s) B9 H: |) Y* p/ L; Z
- CSpace:1001506B mov eax, [ebp+dwNewLong]4 b4 i6 g% E" E B5 @8 H
- CSpace:1001506E add eax, 1DCh
4 A, ^1 o+ M1 N2 M0 q* v/ o - CSpace:10015073 push eax ; lplpDD+ v+ K6 f+ y, [' }6 _5 {
- CSpace:10015074 mov ecx, [ebp+lpGUID]# Y. @- y5 O! }, c
- CSpace:10015077 push ecx ; lpGUID
+ E! e5 b( ^3 x3 c/ D; U - CSpace:10015078 call j_DirectDrawCreate
0 W: k9 K1 k. P$ [5 R l" o5 w - CSpace:1001507D mov [ebp+var_14], eax) i6 y1 E% h- k5 ^& D
- CSpace:10015080 cmp [ebp+var_14], 01 R$ W# L+ D* i- u
- CSpace:10015084 jz short loc_1001509E: J# z; U! O8 }8 [6 ~
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
; [- P; L) B+ {/ y( _' X% k - CSpace:1001508B mov eax, [ebp+var_14]; x, q6 ]$ @8 ?- q0 {0 ^
- CSpace:1001508E push eax7 |+ v7 C; G6 A! M% y1 X5 v
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
5 Q; P# w! J. f4 I7 u5 a9 D% l - CSpace:10015092 call sub_10038F3C3 i* i& W0 g; O0 \1 J
- CSpace:10015097 xor al, al, `9 @) |! j. I" y
- CSpace:10015099 jmp loc_10015173
复制代码 6 u. }' N& i8 V: _+ D1 f, j
5 [3 P3 x4 Q% ^: ~! K1 l
' W# }% O7 ^- E3 Q/ `
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
" K4 l# j* k6 [* Z) H0 I记录到log_GL.out文件中。以下是摘录的一段。! N1 z. D$ D% t- y/ w
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
; r' c% H' j- |8 m; ?( O以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
4 [3 ~4 ?% x" @4 P+ p9 q- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>0 o$ d+ i" E- k4 j( {! i& A! G
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
, t" {$ _# u1 V7 v0 o - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>; ~# ?& t& ^, B% @5 W0 q% i
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>/ E4 q2 b' k q
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
1 [+ I# G0 t" y% j! b/ {( d* c$ d - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
( \! d7 R; H# [0 S- `; G5 U; G S - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
6 D% Y" q1 ^0 Z! l - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
4 ^1 u7 u# @8 w. d$ V; z - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>% \" b8 m1 _8 P U2 q- k% h- M& m
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>: ~$ ~1 ]0 [4 J9 V4 J0 M
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
& x" k2 q# h3 @9 k6 Q8 s9 f - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
- A* ]4 K! D) d5 Z( F8 p, Q - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216> L9 Q# N, G' z
- glClear, GLbitfield<256>" ^* B) \( C# k* d4 z% v
- glShadeModel, GLenum<7424>/ I3 s; e' v/ I
- glDisable, GLenum<2929>
& m- M9 ]/ v1 ^% `% T. V3 [ - glDisable, GLenum<3008>8 u" W# t! w. b8 y2 F# B2 e- h
- glDisable, GLenum<2896>
* j$ l5 w: @' X, O) b' j9 ~ - glEnable, GLenum<3042>
& Y/ q8 m9 @) z4 F' M- b: H - glDisable, GLenum<3553>
, M( P% w' J) j2 f* Q - glBindTexture, GLenum<3553>, GLuint<631>0 N8 t+ Y3 J, J0 t* `5 F( W
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>( c* a2 W3 j& S7 n( P J3 Z
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>9 g% L; q+ {2 d w
- glClear, GLbitfield<16384>" \" X' M9 g$ n, x/ v6 B
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608> m. [2 g! P2 K8 u) X9 M% ]
- glEnable, GLenum<3553>
! U! R: Z: d1 y5 V" j ?2 N. d - glBegin, GLenum<7>, V J. e/ |* T" J6 a; c4 Z- E+ F
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
+ V+ [" |. c& c1 b/ u - glTexCoord2f, GLfloat<0>, GLfloat<0>6 w+ l! @. j& X
- glVertex2i, GLint<0>, GLint<768>
* N$ X7 y1 ^4 y4 E! @3 g+ B1 ] - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>5 |2 Z: E; m3 e+ e; J
- glVertex2i, GLint<1024>, GLint<768>. M6 @8 L8 ~4 w u8 V
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
* f& @, X" J: L U2 Y c/ ?) P - glVertex2i, GLint<1024>, GLint<-256>
5 P+ P/ a8 D/ ]5 p6 M1 T* w4 I0 e - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>/ R0 [4 l6 i/ Q2 d' Y* M, S
- glVertex2i, GLint<0>, GLint<-256>1 W: H5 c/ e: M0 x/ J. @; W
- glEnd
. B5 ?' `: a- b; i( V - glShadeModel, GLenum<7424>
* m% L+ d1 {+ s' Q1 K! {( |: ]$ k - glGetError
" ]# \' Y7 U c' N4 g/ F - glDisable, GLenum<2929>; W/ p% g- K/ E' s6 i0 C, N
- glGetError
2 q' Q. ^3 N) K* \6 d/ W* N - glBlendFunc, GLenum<770>, GLenum<771>
. d5 q5 y0 s* [+ y9 h! P - glGetError
. A8 F* N' ~8 U7 D. h& w9 ] - glEnable, GLenum<3042>* c: X$ V! H# f5 X0 c/ D) u
- glGetError
9 [# H/ p% ?9 P9 i2 @ - glDisable, GLenum<3553>( k5 d8 [3 g& P, t& M
- glGetError+ x6 h5 C/ G' R8 h2 j
- glBegin, GLenum<7>/ b7 Y, W9 ]8 S# x9 H" J# ?
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
: L: o+ r G. y8 J4 b9 J# |. F - glTexCoord2f, GLfloat<0>, GLfloat<0>
3 O) S _* T: P# O5 r2 G0 z7 | - glVertex2i, GLint<0>, GLint<768>
0 U8 R& \8 X# Q j4 a1 u" V - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>. m5 u7 Z" a M4 i+ ?% Q
- glVertex2i, GLint<1024>, GLint<768>
. A1 [) H, N; F0 h5 C* n( @- Z - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>1 S4 @- i/ r3 b/ B6 b
- glVertex2i, GLint<1024>, GLint<0>
( n' H% L9 j" V: A - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>: _- M5 Y3 {8 E3 S) K2 o
- glVertex2i, GLint<0>, GLint<0>
" ?4 \" h8 ^3 ?4 p7 z4 _1 c0 E+ E8 @$ o: o - glEnd
" i' X# u5 [+ y# d - glGetError
+ n/ d7 z. u% Z, y. p" l: l0 N - glEnable, GLenum<3553>
' j- ~9 x4 ^8 \, T - glGetError- h5 y1 l: H3 ] g
- glFlush
; e* z$ z" S9 F P1 f - wglSwapBuffers+ {4 H9 t ^! q g
- ---------------------------
+ M- H; R3 h P5 g6 p& F: @% [$ N - , HDC<-33484711>
$ A( `! u1 H# \ - wglGetPixelFormat, HDC<-33484711>
+ T- M9 z' Q) o2 x# @( o5 b - glMatrixMode, GLenum<5889>- P: g' ?8 G+ v
- glLoadIdentity6 a3 j, r+ e1 q* ?* t
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>5 O" {( ]$ Z; x9 I' n" k
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
' @1 B+ }$ O& O - glMatrixMode, GLenum<5888>- G' l0 L4 M3 ?+ t8 T+ y. D O
- glLoadIdentity
" z) y" v# F/ S( c( L" h( K! U - glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>- e1 I8 W& |% M, k1 t8 a; l
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>* e9 Q/ Y! }! j
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
# J) q9 S/ G( T5 {" B9 ~; ]' ` - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>/ \9 C9 r; f R! E. O$ G; ^
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
2 [! `1 o& m8 F0 ]" Y) ?% E) A% D - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
/ E+ M3 A0 S3 A7 [, t - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>' M1 e$ e& G. q8 R7 W
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>8 l- N8 @% ]% x- m/ R
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>% T% {# G- M0 N$ g* h
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>5 g1 b7 P( K9 O1 C3 L k( m
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>; O2 ^' m. ]2 Y" ^
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770> F4 f& ]- R; n. M n
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
7 O; @! ?5 J L' Y5 o - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>) B; h# s3 Z% C3 ^3 T6 R" ~
- glClear, GLbitfield<256>
6 q, [, N- p" l+ h+ W" f - glShadeModel, GLenum<7424>
& ]# }5 ]: H- j$ T5 @ - glDisable, GLenum<2929>
$ b. N0 G2 j: `, [- w1 r6 B - glDisable, GLenum<3008>
. F; L3 f7 [1 g3 Y - glDisable, GLenum<2896>
; M I7 A+ A7 a9 P1 J8 A _& @ - glEnable, GLenum<3042>
7 ] }9 ^+ Y, G/ h0 O1 t - glDisable, GLenum<3553>) W; k9 V- c h. V# S
- glBindTexture, GLenum<3553>, GLuint<631>
1 c% |: K P& I$ f - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>8 T+ A* S2 K' w# H! v/ o
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
7 i- L0 [! K( Z+ ^6 s2 r2 K! X; D6 h - glClear, GLbitfield<16384>4 F$ w4 D2 Y& ?6 U$ x
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
4 f4 C9 W& W: e( g' e - glEnable, GLenum<3553>
* i+ Z- B& s' h5 A5 ]; e - glBegin, GLenum<7>9 u# Z$ X" b" e
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>5 j" `+ ~7 k3 z" l1 W& M
- glTexCoord2f, GLfloat<0>, GLfloat<0>
- a1 f5 T T/ F# ?5 U - glVertex2i, GLint<0>, GLint<768>. K, W& e6 U; X. Y
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
& @9 Q) |- G+ Z. ?4 W+ J: G - glVertex2i, GLint<1024>, GLint<768>
0 | ^, K0 O; M6 @8 M5 G8 W - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>" \) {7 p7 r6 N& Y. T
- glVertex2i, GLint<1024>, GLint<-256>* c; q4 Q k) z: N
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>( S! u4 t0 |# I6 F
- glVertex2i, GLint<0>, GLint<-256>/ v/ d# S" R3 m" ]
复制代码
/ i1 Y: `: s) k% V$ J5 U T5 H
2 K x$ X. K# V; X. b$ [* z |