本帖最后由 shane007 于 2023-8-25 17:31 编辑 $ f) n" Q0 \* e" D
4 F* h# a; b) _7 J' h3 _4 ]0 O
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,3 d, `7 t" t$ M4 K; @, G( P
游戏应该实际只用了其中1个,暂时作下记录。
* J( I( A% I+ D3 u5 Q( a, n9 ~7 M! b F( C" x* Y
DirectDraw是由bin目录下的ddraw2d.dll来完成的。) F6 e* m: J+ y
以下是一处的初始化代码8 b) u* c- q8 k6 u
- CSpace:10015015
, d3 J7 C+ e: x$ o* D" { - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j5 {8 t* K b: t2 W* `
- CSpace:10015015 mov [ebp+lpGUID], 07 C7 T$ g) G& D0 V) }
- CSpace:1001501C mov eax, [ebp+dwNewLong]+ s6 F- L' e9 B2 _! y
- CSpace:1001501F mov ecx, [eax+230h]' M6 ^; g+ \. Y9 Z7 D$ h3 N0 B
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
0 ^1 n7 e* q& D4 l; \/ s2 x' F - CSpace:10015029 test edx, edx
! s5 W( h. f9 N" p' ~- f A; o# A( j5 Z - CSpace:1001502B jnz short loc_1001503C [7 E8 i% b5 k! v0 k C1 o
- CSpace:1001502D mov eax, [ebp+dwNewLong]% X/ W' ]) Q# n( ^7 @# y. S: W0 o
- CSpace:10015030 mov ecx, [eax+230h]
( d3 ^4 ], f4 o" @ - CSpace:10015036 add ecx, 8
) f# c6 T, [3 K6 p8 n) \ - CSpace:10015039 mov [ebp+lpGUID], ecx3 h, [7 x) Q# e: H# D1 \$ J
- CSpace:1001503C% x) @8 w" t+ p4 A: L
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
; d- _* D$ L# F- ]5 U - CSpace:1001503C mov eax, [ebp+dwNewLong]0 K1 L! P' c8 r* ?: ]$ `2 I
- CSpace:1001503F mov ecx, [eax+230h]
1 ^9 g3 R! p1 d1 m9 y/ n( ? - CSpace:10015045 mov edx, [ecx+1Ch]
, [) b5 d Y# H7 A0 o U) A - CSpace:10015048 push edx7 o; a4 ?2 f% F" G
- CSpace:10015049 mov eax, [ebp+dwNewLong]
3 O, U7 _. P* y! |% b - CSpace:1001504C mov ecx, [eax+230h]
! V( k9 B1 s0 ~/ v7 [, T - CSpace:10015052 mov edx, [ecx+20h]
- }1 o: I T% k9 T t C - CSpace:10015055 push edx
' {5 m9 M1 y7 H M- r, e& g B; R - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
; j d( U, z; G! B/ g - CSpace:1001505B push 3; w/ {. F5 j) N7 q2 |6 |1 d- O
- CSpace:1001505D mov eax, [ebp+dwNewLong]. D& A, _0 N, T T+ A
- CSpace:10015060 push eax1 U2 l; `! l" h" S' ~8 w3 U
- CSpace:10015061 call sub_1003882A `9 b7 g g) L8 T% c- L) W$ e
- CSpace:10015066 add esp, 14h
0 D) e8 p- T y* l. F - CSpace:10015069 push 0 ; pUnkOuter
3 q+ j! Y: N( F1 X) } - CSpace:1001506B mov eax, [ebp+dwNewLong]' G* A2 w: _& o, \- O
- CSpace:1001506E add eax, 1DCh: j, g1 ~7 b2 X1 { d/ D6 C6 q
- CSpace:10015073 push eax ; lplpDD& G1 j: B; X' n( b: ^; Q
- CSpace:10015074 mov ecx, [ebp+lpGUID]6 @1 T2 s% A8 `* ^5 }
- CSpace:10015077 push ecx ; lpGUID
x/ i/ M4 O. y - CSpace:10015078 call j_DirectDrawCreate
1 F" J3 ]" g) V' a* `/ R - CSpace:1001507D mov [ebp+var_14], eax# H" a% \# z# S' K3 N a
- CSpace:10015080 cmp [ebp+var_14], 0
5 X& D) n" x0 G3 N8 e. Y# ~ - CSpace:10015084 jz short loc_1001509E0 }3 H9 L) K3 G2 M, \* f/ K
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"2 }+ E) V' z# b! j
- CSpace:1001508B mov eax, [ebp+var_14]9 U. x; O K( J
- CSpace:1001508E push eax0 x" T7 e! X$ ^. R" ~2 U- V
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
: J+ I( H: z/ y' `" A4 ^7 k8 w - CSpace:10015092 call sub_10038F3C
2 z; r2 ?2 ^/ O# i$ l - CSpace:10015097 xor al, al7 v9 P. ^8 N- J* \3 K$ U! ]4 Y4 s
- CSpace:10015099 jmp loc_10015173
复制代码
8 v4 i& a$ c. A# u# t0 L2 q" }- H
3 v9 q1 y0 I+ b* s
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
+ D i( L5 l8 k, D1 i/ m记录到log_GL.out文件中。以下是摘录的一段。7 P" J! Y3 ]* |0 w; |6 Z
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。+ z0 o7 P. M, \" G- m: g4 l
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
! e8 O1 f- D `- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>, o) F( i" O( G! {. i# {
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
% N6 r9 `' u! `. f - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>! a9 P9 T3 u1 C4 l+ C0 j: ~
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
, A. f" K5 q2 ?8 m - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>) o5 [* t# g& i7 {6 ?0 w
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
! ]! x. f8 B; \' | - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>8 ~) I3 i7 h0 e
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
9 o) W( A, c/ I - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>- l6 R1 u& U2 w( F9 I5 p
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>$ H7 s+ q$ n$ r/ e
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
4 [! f& u7 E- p! @ - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>9 D4 k) g/ y o W1 l- u3 O Y
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>( Q& n, T7 ~8 `' Y% c
- glClear, GLbitfield<256>
/ G$ K5 T' a% D* d - glShadeModel, GLenum<7424>- U+ ~6 ]. L# K
- glDisable, GLenum<2929>
8 M) z4 [3 f% H! A u" M1 A% c - glDisable, GLenum<3008>
( n! Z$ U6 o2 F% v$ }! J) `& w - glDisable, GLenum<2896>/ I, [% `4 [# `$ s2 R! Y
- glEnable, GLenum<3042>
. q/ K$ L/ A# K, I - glDisable, GLenum<3553>( g# ?% ~* q7 I9 z# X
- glBindTexture, GLenum<3553>, GLuint<631>( Q3 A+ ^" N2 B
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>1 X1 l" L# K& _& B- W5 K" a$ v) B1 \. T& i
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
$ ~2 o8 G, [& A' V8 H- W) d* _& s - glClear, GLbitfield<16384>% i5 X5 y# Y! ?# i
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
9 ~$ J, e/ e! C( u - glEnable, GLenum<3553>
6 D2 _/ j& T- B- T( V% I0 i% R - glBegin, GLenum<7>
/ m- f' ^1 B+ r. q( s7 d) C - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>& b! o3 @: s2 H" Z- U/ O
- glTexCoord2f, GLfloat<0>, GLfloat<0>
( e/ b/ Z5 A C6 C; b - glVertex2i, GLint<0>, GLint<768> M" b7 a0 }+ O" h/ I5 ^9 U( n' n
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>" M$ E& e# O% C. |
- glVertex2i, GLint<1024>, GLint<768>( Z+ d6 e+ F$ S' J) _
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
1 n' L2 j8 P7 A1 K9 ]7 k ] - glVertex2i, GLint<1024>, GLint<-256>! [3 m8 \! {. Q/ ^# p% d. F5 W
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
+ J/ F! r) z. R y( g# q - glVertex2i, GLint<0>, GLint<-256>
% N$ A& j* [7 [% M3 \; t! P, h - glEnd
& z- b% A" L: r9 h) x+ a8 a( t7 ^; V7 u - glShadeModel, GLenum<7424>
, T3 F# Y7 w) g) m3 h5 U - glGetError: ~( Y7 ~! \& x9 @$ v0 P
- glDisable, GLenum<2929>" c2 l5 \! ~1 W# ]2 ]0 ?3 y
- glGetError/ A& B# D! \$ T
- glBlendFunc, GLenum<770>, GLenum<771>4 N, l; l$ Z# w+ @% N( x
- glGetError
' ?% a6 d& }5 ?& H - glEnable, GLenum<3042>
+ A1 f, Z" s8 ?2 o - glGetError
+ E4 A# n' Q: r1 X# i9 e - glDisable, GLenum<3553>
1 J( l4 c) ~8 z - glGetError8 G( s+ i' _7 y; t+ \; S
- glBegin, GLenum<7>& J' s5 |" i2 X4 i
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>9 s" \. Q1 x* e) ~2 A
- glTexCoord2f, GLfloat<0>, GLfloat<0>
9 Y0 O5 g! m6 O1 C - glVertex2i, GLint<0>, GLint<768>' P* ^, {+ J$ v3 n1 C- B, n
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>' d: }4 `- ] h7 J2 Q. x/ C1 {, c
- glVertex2i, GLint<1024>, GLint<768>% }: [( V" A3 ^9 |
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
4 H, E8 i6 _6 g/ h: G - glVertex2i, GLint<1024>, GLint<0>
2 i7 E! o; e; H8 D4 \6 G - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
, }, f% E9 v X; n. I - glVertex2i, GLint<0>, GLint<0>0 H4 ~# {0 Q, u' \
- glEnd
) d- V1 ~, e0 z, ` - glGetError
6 E, F8 R+ X4 f+ V- N$ D - glEnable, GLenum<3553>
1 Z1 S( l, E ?# ^ - glGetError
9 b8 i8 X) S: B - glFlush
7 j, G2 `2 G9 M o& A7 Z2 n0 o - wglSwapBuffers& Z1 G/ H1 G+ {% u2 K
- ---------------------------, N5 y i( n" U) j3 u' B
- , HDC<-33484711>
$ h( ~% [5 d3 [3 z# T - wglGetPixelFormat, HDC<-33484711>/ D- `& P2 I0 x" D
- glMatrixMode, GLenum<5889>
+ j. [1 Q) t, u5 u - glLoadIdentity
! Q& |, d0 k6 E/ B! t - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>5 [8 p6 ` \% N6 K3 W$ }
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
1 @- [1 T) q6 L0 r g# M - glMatrixMode, GLenum<5888>0 h; v# D9 [& Y# m& d( b$ [& Z
- glLoadIdentity
, V) e* V- F9 P/ y6 Q - glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
( [" D; N* P# K1 w& ]) ?3 V - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
, _+ c) U+ S }" [+ y+ b& D - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
# ]9 a$ I! h9 r2 R. [2 V - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
6 J( N" B+ Z- O% } C - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>2 D: N$ I4 k, n/ I
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
/ G- W3 |8 j F; W* U% t% n - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>5 J1 m; p0 L3 }/ \8 `5 v s
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
* V' j' y+ M0 Q! y# F4 U - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>4 O N; t. k. }* |
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>4 ]- n1 s2 P& A% A* M. @( N
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>8 V, d. [. E5 S+ Z
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>$ u6 X# h+ `% W- t# e0 O$ B% w
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>% c9 p6 [' \! C0 W
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>' P6 c2 D& f6 v$ ]2 t
- glClear, GLbitfield<256>
4 Y$ V3 ]; a% g( X2 F" F - glShadeModel, GLenum<7424>" y$ S" o; y y9 T
- glDisable, GLenum<2929>+ K/ d' {* k8 z- c: i4 o- H
- glDisable, GLenum<3008>
; {% G! t, V ^+ A% S0 o9 M% d' j - glDisable, GLenum<2896>6 V: q5 L3 J+ i/ F! ?. r
- glEnable, GLenum<3042>% Z" [/ A: U8 F8 n7 i e C
- glDisable, GLenum<3553>7 H; \# f! O0 p$ ]1 A* s. G9 U
- glBindTexture, GLenum<3553>, GLuint<631># i O$ c: Y+ A" h' q8 P
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
) n4 F1 l8 l. y, j! s - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>. I8 B4 m+ y/ o" B
- glClear, GLbitfield<16384>! ]2 K. N' r3 `6 Z% @/ g# Z
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
, V' G8 c2 \! U+ B - glEnable, GLenum<3553>
8 l% |: n! ?( Z2 @ A; @+ J+ @ { - glBegin, GLenum<7>
; Y5 d9 T6 g7 I" h - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
' z( U7 E8 R2 N( d - glTexCoord2f, GLfloat<0>, GLfloat<0>
& {8 L s7 [6 B) p - glVertex2i, GLint<0>, GLint<768>
" [! ]$ [7 }& y - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
: O4 ^9 R5 W: Y. L4 s - glVertex2i, GLint<1024>, GLint<768>: b& n$ J* s% \# @
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
4 I7 N6 M4 m$ S5 W - glVertex2i, GLint<1024>, GLint<-256>0 a1 [6 f4 f' w; X+ u
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
p7 q$ j" ~2 u3 p; u - glVertex2i, GLint<0>, GLint<-256>' {; c2 e" B% s Z; `+ c
复制代码
; J+ i6 b* I3 q( `, t
" j& _& @# v" s" r V |