本帖最后由 shane007 于 2023-8-25 17:31 编辑 # G* E0 \8 ]& o% d; q; ]
( g8 ?( K/ c6 |( D2 U; L% c2 V
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
# [5 P5 N$ o: x. y6 k. X游戏应该实际只用了其中1个,暂时作下记录。
u' z# m+ `; q7 p8 a
0 n' r6 w/ O* f- J( B1 qDirectDraw是由bin目录下的ddraw2d.dll来完成的。
, ]1 u! d" e. J7 x6 v以下是一处的初始化代码
* F" I/ N$ K1 g8 S/ s, P- CSpace:100150150 H, b& K$ I) D+ u
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
' L j8 P- H9 K. z& z0 h6 `. q- f - CSpace:10015015 mov [ebp+lpGUID], 05 M* ]" q$ D. h4 I+ ^2 A8 Z/ C
- CSpace:1001501C mov eax, [ebp+dwNewLong]
$ j3 J8 I" l0 w+ `1 j - CSpace:1001501F mov ecx, [eax+230h]
7 j) ^; A6 D/ x# E - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
% j) q% ^& a) H% ~7 D - CSpace:10015029 test edx, edx& o7 f" b. H3 s4 }
- CSpace:1001502B jnz short loc_1001503C
0 _/ {, ^7 G) x* j6 L% I& X# E2 m0 r - CSpace:1001502D mov eax, [ebp+dwNewLong]
. A7 e, q H. ~2 z - CSpace:10015030 mov ecx, [eax+230h]1 B; k* p# Z3 I4 K5 w, D
- CSpace:10015036 add ecx, 8
L7 g% M T" x1 m7 { - CSpace:10015039 mov [ebp+lpGUID], ecx! L N8 f. q1 g: N8 |9 d6 @
- CSpace:1001503C& b/ ]4 u( k" `0 U% k# a
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
. E( O0 u; I- U6 a( ? - CSpace:1001503C mov eax, [ebp+dwNewLong]
: z* y- R( ^3 d' B - CSpace:1001503F mov ecx, [eax+230h]
! {* S: L$ A1 _7 U - CSpace:10015045 mov edx, [ecx+1Ch]
`( z6 o- K; T T+ h2 J - CSpace:10015048 push edx
4 W% Z8 B1 V! j! G% G - CSpace:10015049 mov eax, [ebp+dwNewLong]
, Z9 |1 x' F+ o$ U% U* z - CSpace:1001504C mov ecx, [eax+230h]9 a! s! h: Z& e( x- p% f
- CSpace:10015052 mov edx, [ecx+20h]
! D! I. J3 z2 Z; J, W/ e8 U& A% H - CSpace:10015055 push edx
% K* h# w- _+ p+ k: v, f Y - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"0 J S: _( `6 n0 P: j) ~5 Q
- CSpace:1001505B push 3
7 z( c- |$ W4 Z, p - CSpace:1001505D mov eax, [ebp+dwNewLong] e. @& c4 \- P! k* b" C6 t, F
- CSpace:10015060 push eax
/ f) `1 N9 S& q# @ - CSpace:10015061 call sub_1003882A
8 O4 O- t2 X9 f1 N% D/ W: O7 t k$ L3 ] - CSpace:10015066 add esp, 14h9 D/ K# h8 Z) P: S4 R' S& n
- CSpace:10015069 push 0 ; pUnkOuter
( G: Q5 Q) }7 h+ i G7 T - CSpace:1001506B mov eax, [ebp+dwNewLong]
1 o: p% ^% s! `- s. j ^ - CSpace:1001506E add eax, 1DCh
$ r) h m# ~9 G& i, E+ [ - CSpace:10015073 push eax ; lplpDD
y x4 _4 F" g C6 V" \ - CSpace:10015074 mov ecx, [ebp+lpGUID]
4 Y3 D2 Z B5 F8 L4 d& w2 j1 { - CSpace:10015077 push ecx ; lpGUID
6 s, F# S4 \: h% m9 c$ g) I5 `/ \ - CSpace:10015078 call j_DirectDrawCreate
/ H" [/ m2 A/ P/ {; _ - CSpace:1001507D mov [ebp+var_14], eax
% @6 X& W$ c$ u% \% N( r - CSpace:10015080 cmp [ebp+var_14], 0* F9 N1 r1 D: r$ ]' n8 m
- CSpace:10015084 jz short loc_1001509E6 y. y |* x9 N9 w# e6 e; u: \
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"/ @1 H/ u1 P4 ?( ]8 N
- CSpace:1001508B mov eax, [ebp+var_14]7 s' X- C) B1 P8 `
- CSpace:1001508E push eax: }2 b' G3 _# W0 l6 W# M1 \3 [
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
; X6 L5 k! l) V; b- C. [ - CSpace:10015092 call sub_10038F3C# i1 l Z! w7 \1 M! y
- CSpace:10015097 xor al, al+ @3 x A+ |! X, ]* X8 i9 v
- CSpace:10015099 jmp loc_10015173
复制代码 . K( T' S2 n* h# a
* s2 S; j" ?) j6 B6 i; L7 r1 t& W7 q0 c- X b
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
8 a6 q+ C8 y) e1 p' i记录到log_GL.out文件中。以下是摘录的一段。7 L Z% B+ d+ S0 `) q
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。# ~, j8 Y. s) ^. f- h7 V
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?) j( u# C$ t7 Y7 _& m
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>1 _+ h- |, w7 G9 N6 T% ]
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>2 [% ~ D0 m0 u8 {
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
' r9 c9 f, V4 w - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
6 d& U! F2 @5 h+ h - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
$ H% u+ Y, X) k2 u5 Y - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>2 o/ W; J$ j" R/ m% ~
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
. C: Z$ h- _- n - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>1 q5 u) `/ T( i0 _; D2 ~
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>5 L$ d% \0 t. ~2 k
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>4 j) m. j4 Y6 @& s/ B8 r
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
2 V6 \, Z6 Q4 R1 t: T' O9 N - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>& A8 G# m6 s# v" F
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
0 G9 K) J4 y" N5 H6 y% Q' X& U0 E/ A9 h - glClear, GLbitfield<256>' {; a0 [! ?/ f. A
- glShadeModel, GLenum<7424>
6 u: [, r9 z! V$ p0 j9 S - glDisable, GLenum<2929>
! d I! \3 e; V L - glDisable, GLenum<3008>. W7 d* c, }, E6 [! [
- glDisable, GLenum<2896>: K- A. s6 Q4 a
- glEnable, GLenum<3042># g9 H9 }8 Z" e6 ^* j7 T3 x
- glDisable, GLenum<3553>& q6 U: Q. L& b5 e0 r0 ]8 ]
- glBindTexture, GLenum<3553>, GLuint<631>) w+ @' a; E- ]5 l
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>! L( y) L5 x0 X% b- d$ E& t
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
' N2 p u% C5 J+ t, c9 W7 d - glClear, GLbitfield<16384>
3 x2 K! j! R" e i" T - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>6 ^! j2 H- D' |' }
- glEnable, GLenum<3553>* ^$ W" ~+ q6 Y! Z; {
- glBegin, GLenum<7>5 L8 @2 U4 t6 U' j: k
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>/ A, `+ P6 b; ^3 F' y) E
- glTexCoord2f, GLfloat<0>, GLfloat<0>4 N) W$ c6 r' B2 @% V
- glVertex2i, GLint<0>, GLint<768>
8 S/ w& S& j3 J% [ - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>& Y6 A( Q. \3 x# @8 B
- glVertex2i, GLint<1024>, GLint<768>
9 z6 X z( M8 }) i - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
p: s; H X2 T! g6 J - glVertex2i, GLint<1024>, GLint<-256># u# u% B+ Y, I: Z4 q! y
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
* C: E0 I+ |8 j% i/ J& g - glVertex2i, GLint<0>, GLint<-256>
/ t, p% c: H* w - glEnd
# k7 Q/ g: E5 ? - glShadeModel, GLenum<7424> s4 |# `1 w, q# ]8 F/ |
- glGetError& A9 b6 S; k* x' ?5 i5 K
- glDisable, GLenum<2929>
$ U2 w i+ K2 u% T4 V7 v" v - glGetError
. d8 J& b5 c5 {! W+ t G - glBlendFunc, GLenum<770>, GLenum<771>
& Y: \; d" I2 N. Z - glGetError
' l9 R" F( o2 w: G0 b - glEnable, GLenum<3042>0 d% F! E+ r" [) c4 [: Q
- glGetError8 q8 ]* k1 X: i1 q3 J6 M
- glDisable, GLenum<3553>) Q! {* A- L& K8 l, R# V9 ^
- glGetError
- Y4 h$ [3 \8 M6 J0 \# I' _1 Z - glBegin, GLenum<7>
y, R, B( E: T; v - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>" m& ^3 O9 p) Q0 D2 d4 C) T
- glTexCoord2f, GLfloat<0>, GLfloat<0>* N( G% S1 f/ B/ R
- glVertex2i, GLint<0>, GLint<768>
: v* t4 Q( v# Y: Z. p: m - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
% a0 Z, F. Z5 d& k) l. h. E - glVertex2i, GLint<1024>, GLint<768>; l' h7 U0 `9 e* f' {) ]' w A! j
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
# ]' P8 c' u, v! F - glVertex2i, GLint<1024>, GLint<0>3 b2 k/ Q9 ]" W4 X" C6 J
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
5 ^! c4 T) R. J8 g; I: h - glVertex2i, GLint<0>, GLint<0>
% s! ~$ Z$ ~0 e - glEnd5 J0 e2 a8 w- k- d
- glGetError
7 ~# @+ }3 N6 e. _3 I F( R - glEnable, GLenum<3553>8 A0 |' F5 X! J: m" ]* h
- glGetError
; n- P0 \- u! i) u) Z - glFlush5 B9 \5 s% g1 w6 O% O
- wglSwapBuffers
4 U1 B3 N( J/ Q/ v0 Y0 s1 x1 T - ---------------------------
# g- k* W" g5 o+ k/ D& A8 j8 ?, B - , HDC<-33484711>
& X2 V u0 f" S8 p# O3 c! J - wglGetPixelFormat, HDC<-33484711>
, u# }* N7 W, ^7 x - glMatrixMode, GLenum<5889>: g ]9 k" l3 \& M6 ^- |# X* Y. z
- glLoadIdentity; t4 C' S2 X }( p5 ?( _
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>0 d ^/ q, E% h! v
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
+ D2 J/ b9 U: Q' I/ x1 S - glMatrixMode, GLenum<5888>
6 I* T( g6 H3 _' D0 F5 v - glLoadIdentity
; }# L c; ^% y# J& \# I/ Q1 E - glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>& p- o5 _+ h8 V* s2 `3 O1 g
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>8 N( B. S9 O, W$ E3 J* y+ I6 ~) j
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
0 o# P/ @; g2 ]- ~, V/ G2 `1 D - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>" `2 u: U# `& ^3 S
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167># A7 d0 C& [4 c: `- b5 a. f( `
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>. F" ]+ c+ S4 R* O" g E- k' [
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
1 H" j* D5 o: H- T - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>6 E% k) V- w2 `# z) d
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
. B+ [- G8 H2 T+ i2 I' V' Y - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>( l! @5 s3 P7 P8 J3 C) N/ ~
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>5 \4 [8 M9 J7 r$ h. G
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
! }! O; X L6 B1 i8 f - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
* g: Y: G! r4 e; | - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>. a" T h3 x+ m% _3 y1 h
- glClear, GLbitfield<256>7 \0 {$ P, i4 f3 p- v v! b
- glShadeModel, GLenum<7424>
) @4 O! Z4 f3 k6 V; {5 R6 A" Q - glDisable, GLenum<2929>
. U3 |+ t/ b! v7 k) R - glDisable, GLenum<3008>
) t9 p7 g |" ]( s X! Y: }! b - glDisable, GLenum<2896>4 R8 [ q" U z" H# Y. ~
- glEnable, GLenum<3042>
1 D {6 D+ Y5 Y& X+ E& W7 N - glDisable, GLenum<3553>2 }& n: A2 K) {% Z0 r
- glBindTexture, GLenum<3553>, GLuint<631>% F4 A6 `+ N \( h8 J% g3 C4 L
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>" g/ g+ h. D" u) l$ G! @; e
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! {0 l6 V0 C& { }! ?3 t. C
- glClear, GLbitfield<16384>
. H$ c) }# a# i. @$ [5 ^8 P. x: b - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
* M" a% w" _0 x0 { - glEnable, GLenum<3553>
: Q3 k I% g$ Z, t - glBegin, GLenum<7>9 B6 B. D* ^! V& s$ P% k. ]
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
* B' d9 D q7 K: Z, @ - glTexCoord2f, GLfloat<0>, GLfloat<0>" O3 L+ i) C& _2 P- N
- glVertex2i, GLint<0>, GLint<768>
8 K/ i- @1 t. I+ L+ W( L - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>4 _$ r( G" z$ L$ l7 ?
- glVertex2i, GLint<1024>, GLint<768>4 D: E8 `$ m* y" L5 H
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
' X" \& Z! y) h/ N3 T$ ? m - glVertex2i, GLint<1024>, GLint<-256>
5 F7 g, e. j0 i: C - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
0 t6 k/ E' C; E% m - glVertex2i, GLint<0>, GLint<-256>
) z+ `, H1 X6 O$ V7 I6 P2 g
复制代码
" r Z- U. D8 e* ~& p
. v; f( K- E: @2 y6 f R9 H |