本帖最后由 shane007 于 2023-8-25 17:31 编辑
8 j4 C, U6 T3 A3 Z: P
$ ?: u# O) V3 a7 T本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
4 d6 h' e5 ], X# w* h$ o游戏应该实际只用了其中1个,暂时作下记录。
" k4 }9 a1 r+ B6 ] J- ] V7 [3 e& l' q7 X* w
DirectDraw是由bin目录下的ddraw2d.dll来完成的。. L# @, c; m% K
以下是一处的初始化代码9 b( y0 m; _" Q9 x; g# G
- CSpace:10015015$ H3 y9 ]3 k) `
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j. s% v7 A+ \7 H6 m2 W: S) k( p
- CSpace:10015015 mov [ebp+lpGUID], 0
: ^+ u* |* @2 w$ I8 p - CSpace:1001501C mov eax, [ebp+dwNewLong]
: w" T3 a% U6 Z! R: F0 U2 U+ f, M - CSpace:1001501F mov ecx, [eax+230h]
1 M" h' O8 q0 |" D* P - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
9 @; c# S2 i) P. U( h - CSpace:10015029 test edx, edx
A0 k" ]" U D7 o1 S! i - CSpace:1001502B jnz short loc_1001503C3 v/ y& b; b' E$ [/ r' T% r
- CSpace:1001502D mov eax, [ebp+dwNewLong]
8 `4 d% x' w; t( E/ W - CSpace:10015030 mov ecx, [eax+230h]
9 h4 z$ N. e+ N$ [ - CSpace:10015036 add ecx, 8# ]) c) W4 `' l. v
- CSpace:10015039 mov [ebp+lpGUID], ecx
* J3 d4 V0 n2 w1 y4 S {) R - CSpace:1001503C
- L" i( }2 l: j% N3 ~- _ - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
, ~" [5 R1 b1 n# g z7 n* _( S - CSpace:1001503C mov eax, [ebp+dwNewLong]* B3 m( j# O6 N6 \! ~
- CSpace:1001503F mov ecx, [eax+230h]! f2 s( U' L; ~
- CSpace:10015045 mov edx, [ecx+1Ch]
+ A7 a1 R0 p4 @ - CSpace:10015048 push edx
- B& [% k# r0 k6 g. J - CSpace:10015049 mov eax, [ebp+dwNewLong]
# y- f5 l' ^9 Q+ J3 I, ] - CSpace:1001504C mov ecx, [eax+230h]" i9 O2 \ r& X( P" Y3 ^0 f6 J
- CSpace:10015052 mov edx, [ecx+20h]9 R( I/ U8 f6 Y! m2 [) F
- CSpace:10015055 push edx
& I; G1 ]- r* Z( ~5 t% j - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)". _: N0 c" r/ C" z
- CSpace:1001505B push 33 d7 L( o/ e5 |, k1 l6 E+ \2 r
- CSpace:1001505D mov eax, [ebp+dwNewLong]( p T- `, Z( o' w7 e
- CSpace:10015060 push eax$ Q9 C" k: y A& _! C6 \! R
- CSpace:10015061 call sub_1003882A* m% T1 ^5 S$ Z2 I$ Y3 X0 @
- CSpace:10015066 add esp, 14h$ P9 v: {! J$ m, Z6 R$ G% T
- CSpace:10015069 push 0 ; pUnkOuter
3 j% F4 s4 f) S% w - CSpace:1001506B mov eax, [ebp+dwNewLong]
3 w; i5 y7 Y/ w: [; \" K# R( I - CSpace:1001506E add eax, 1DCh
9 K+ W8 W3 B5 {5 d# g/ [! ]0 ` - CSpace:10015073 push eax ; lplpDD
0 L: y- n* P! Z+ d; }! R - CSpace:10015074 mov ecx, [ebp+lpGUID]
) y/ l+ C+ [- M7 E5 u - CSpace:10015077 push ecx ; lpGUID
7 u& n" P$ d& a3 v - CSpace:10015078 call j_DirectDrawCreate6 S+ Y7 S( Z( ?# {% \6 v: A
- CSpace:1001507D mov [ebp+var_14], eax% t+ g! [- d: q
- CSpace:10015080 cmp [ebp+var_14], 0
. L2 u* @& P5 ]% I! e: |+ V- r - CSpace:10015084 jz short loc_1001509E, B; W1 @, |/ F% C% ^8 w1 t
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
0 ?7 N5 `& _" K+ |2 k) w - CSpace:1001508B mov eax, [ebp+var_14]
6 F% {" c: | A$ W% g4 q( r - CSpace:1001508E push eax
. Z; d. V @- o - CSpace:1001508F mov ecx, [ebp+dwNewLong]9 I% S, \ ]# n5 V. ?' Z
- CSpace:10015092 call sub_10038F3C
7 [3 s0 ~, T" w; z - CSpace:10015097 xor al, al" l5 Z: B( F0 Z& k1 s
- CSpace:10015099 jmp loc_10015173
复制代码 & L2 }( ]) r0 R& J$ r" ]4 c0 }* w0 m( v
3 | l) R; V5 f" C* |6 W
. g* j H4 O/ n: `9 a我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
* e. q0 J1 L6 D5 m ^/ u Z记录到log_GL.out文件中。以下是摘录的一段。' x$ J' H6 H* A, ~& M# Q) ~+ n
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
1 o/ B7 G/ } Z/ q以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
# N8 X, ~* p: @5 ]* T z- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>4 J, |: ?# ?; z8 ]2 o5 ]' J! t
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>. g7 j$ B+ K( _/ h c* T2 ^! o
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>$ V2 f2 l0 {7 ? E! L2 [" Z' L+ ?
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>* C2 p3 Z2 Q! n0 |/ Y7 o
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
) I4 ?. }0 Z+ ^5 j8 |; Y - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>* S+ W, r; _4 r* H) T2 E% c/ I
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>5 p& J0 R0 V2 h: \# p9 i
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>1 d- G0 l6 F9 t7 U9 W8 Y0 c% w! a
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
; x6 E7 [1 x( V o - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>% b4 H, G; G+ P1 ^3 T8 }% H
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
( X8 ^2 A9 H# Q1 Z, ^ - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
1 a2 a' I: E& e# U# g! v - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
& j3 \1 W& Y7 H9 p: h8 S - glClear, GLbitfield<256>
2 Q M; K N5 H% b - glShadeModel, GLenum<7424>; ?3 n9 z3 X9 N7 g6 f3 m* j
- glDisable, GLenum<2929>
- p0 z" O; _; s- a - glDisable, GLenum<3008>
. x/ B4 f' ?- M# K$ n* d' j - glDisable, GLenum<2896>
5 V; S c( r, y! s& U4 @ - glEnable, GLenum<3042>: e' u5 O$ \( f5 V0 z
- glDisable, GLenum<3553># W* O7 p) J3 l2 R8 l% S
- glBindTexture, GLenum<3553>, GLuint<631>
" {6 U5 z5 n: [ - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
7 A& k3 {4 I6 k0 K: _( J; O - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>( {5 {' I, @7 ]
- glClear, GLbitfield<16384>) Y& m# |/ }/ M4 s
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>( V1 Y0 _3 ~/ s# x
- glEnable, GLenum<3553>
0 b |2 H# t% L4 H: a8 Q - glBegin, GLenum<7>. X* M0 ^( Z3 f% U
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
% V$ \* A/ W/ t' p - glTexCoord2f, GLfloat<0>, GLfloat<0>
, ]- w! D6 s% W1 \5 _ - glVertex2i, GLint<0>, GLint<768>+ O3 }5 B5 Y" T
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>; @# h: k" [0 `3 [5 P0 n6 ~5 E
- glVertex2i, GLint<1024>, GLint<768>
" Q! f+ U @; x% c8 b - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
& c. H7 X/ \0 G( T - glVertex2i, GLint<1024>, GLint<-256>
! r3 M7 Z. \9 [/ I) M - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
: ^( b, D6 a" i. z( N - glVertex2i, GLint<0>, GLint<-256>
( b4 A9 ~8 S/ S6 M7 W - glEnd$ _" p" c) X2 L2 H5 P3 n8 N+ U
- glShadeModel, GLenum<7424># h2 z3 n$ A. r
- glGetError
% a5 K( e K' d0 i1 S) S - glDisable, GLenum<2929>
1 O+ P L0 u) `; P - glGetError, L- r$ q f! f0 P4 [
- glBlendFunc, GLenum<770>, GLenum<771>
/ D) u4 W0 Q! W - glGetError% a; J) Y8 M' h, g* P' U2 b! E. a
- glEnable, GLenum<3042>
6 F7 X0 @% u0 V% O- Z7 B/ P9 ? - glGetError; J& I3 r& s5 ^8 K8 r+ V
- glDisable, GLenum<3553>
% u. t$ }, c4 B7 Y, t - glGetError
- }1 o$ m5 B* e - glBegin, GLenum<7>
8 p+ O$ ^1 f3 e$ G( ~ - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
! H3 t8 C0 M- |: O9 y2 E0 q - glTexCoord2f, GLfloat<0>, GLfloat<0>& @2 l4 d) C' Q E/ ^
- glVertex2i, GLint<0>, GLint<768>
; s* K9 Q' Q9 t! x h - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>4 Q, h; n. i- `6 z7 p
- glVertex2i, GLint<1024>, GLint<768>
; e& ]0 G i" k3 p( A) x4 H - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
' Y2 d v( X7 C j+ ` - glVertex2i, GLint<1024>, GLint<0>
# f8 Z7 C: p3 \! u G - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
8 g! ?' ^1 f; h - glVertex2i, GLint<0>, GLint<0>+ d/ H2 ?% C8 o. g0 d1 ?! o9 a
- glEnd
/ O6 u O* \! h& j z w8 W - glGetError* }* Y. h$ u+ O% B. \9 S Z
- glEnable, GLenum<3553>
5 S; K5 u& Y# a5 t; ~; Q - glGetError
" |/ o5 v2 i h5 n - glFlush- k+ X. a- D: W& s9 l( @
- wglSwapBuffers! x: _# u b( a0 g
- ---------------------------$ N S+ a( _3 O* {- T( O
- , HDC<-33484711>7 l0 H5 V4 m* r- k u) y
- wglGetPixelFormat, HDC<-33484711>
7 o4 C2 q# H/ d ?, `7 V+ ~$ @ - glMatrixMode, GLenum<5889>" S" D& Z" B6 Y! F
- glLoadIdentity
" ?, z4 [* _: F2 I) V7 k' M - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>1 n, J* u% v* v( k
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>3 O o1 T0 g9 _7 a
- glMatrixMode, GLenum<5888>; F- s- }" o: L# C
- glLoadIdentity
( U. W+ O8 t. o/ x1 U" O - glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
l; h1 R9 n" g; N3 T6 s+ n - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0># i$ h4 g9 p2 L$ [
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>" ^8 y6 m0 v6 S( {5 I
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>& ^4 h! u2 @6 U, w2 r
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>0 f& I6 w) s6 F& H# x. r
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768> y9 b8 e9 U" N% ^9 O. h% q+ H2 J
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
( ^1 a$ t8 c# B - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>+ q4 x" x' q4 J
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>, ]& W8 }4 W8 v& n- k& u* `
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>5 n1 ?3 Q, w4 _2 R" {
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
+ G. N: w/ I% G9 d0 \5 u: _' j - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
- r4 I6 W* { b2 W( q# J - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
3 I4 F; F' ~: b, \ - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
2 D+ h( p4 K' v - glClear, GLbitfield<256>
. g, Q: g- |2 ?& D" J - glShadeModel, GLenum<7424>
7 l% @, B) X7 t% r! F( u, { - glDisable, GLenum<2929>! T* i3 x0 D2 V ?
- glDisable, GLenum<3008>
1 @: b; X6 l) t1 @ - glDisable, GLenum<2896>
: P+ }" P5 w F$ y( M& X8 P - glEnable, GLenum<3042>
6 Y3 g& p. g# Z9 E4 h+ j* e - glDisable, GLenum<3553>
! l' n% x# `6 H% {5 v L: h - glBindTexture, GLenum<3553>, GLuint<631>
/ A. u# K/ H3 V/ _; t - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>+ i) H5 U8 ]! E0 ], T: \# }
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>, w1 R3 `( v3 f$ l+ F9 {
- glClear, GLbitfield<16384>% W5 N% [$ Y9 w! ]
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>% a# X( B1 d* M
- glEnable, GLenum<3553>
4 }/ N( {2 g* a. K. q, p z9 h - glBegin, GLenum<7>6 z+ b$ C# y+ \1 |) X
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
0 Q; g& J( f b$ b( q& J" h6 r3 T - glTexCoord2f, GLfloat<0>, GLfloat<0>2 [) @% C# G! j; |" T2 h( F
- glVertex2i, GLint<0>, GLint<768>+ ?& r- B& M* J L" e" E/ B
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
. C! w% ~6 w* y) K1 h5 D8 F7 r - glVertex2i, GLint<1024>, GLint<768>
6 q. `6 c- I/ E - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>. m( O3 o# ^& r0 d3 G0 O
- glVertex2i, GLint<1024>, GLint<-256>7 C, S0 _- |, B' G
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
: A* Z, ?9 M7 ^ B& r - glVertex2i, GLint<0>, GLint<-256>
5 \8 l- T# G8 T& Q' }! W% \' o# m
复制代码 - |" X( o/ Z7 b2 _
6 m2 }3 f b% ^% K+ ~ |