冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】Hook OpenGL的問題 [打印本页]

作者: shane007    时间: 2009-6-6 15:44
标题: 【汉化资料】Hook OpenGL的問題
在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
6 C/ K6 A/ _- t9 ]  `* _: U所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

$ i2 x3 ~8 Q4 h4 M( v9 H7 N. ]3 \$ P1 `8 u/ T: w
/ j1 D0 S3 c2 c" Q. k: d) r
原文 : o* a& p1 m9 D( n$ `) F
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
2 _% K. Q3 c" x, G3 K, @- C  s. d6 B# ^6 u, S4 ~- h9 S# O9 g6 X
大家好,
$ n5 k9 ~  A; J6 d) \0 f4 \' H* Y7 ?* R% ~# c$ h8 H
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
' |& ^/ x' t4 |( ?+ M,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
8 P# t: F6 \  N7 s; c: n  d; h( x9 V' L9 E! X& _0 y
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 2 O! D: c. e  Z& m2 y9 y4 Q
但是BMP圖放在wglSwapBuffers卻顯示不出來 ! @8 S3 H# `9 ?% ?$ N
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 # d- x; n: V, ~6 [( N) E+ A
樣的時間字串
4 Q% @% A( Y1 w# U9 ?& J, i7 h. d! h# A1 g& Q6 I6 f
; `% }' }& a+ F/ e& p, Y) p- D) v$ M
( T$ I' B+ s, Z, U$ g  I+ o* L
作者 : fushunwu(fushunwu)
* x5 e& O% l- T3 d- B[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] % [1 V$ U* e( t1 M: `7 p- |: U: x
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 0 k$ s  G* v3 C/ d9 V5 n: q& M. Q$ d
2006/9/5 下午 03:21:34 ) u+ U  m" z# a5 v' m0 q

" A3 m# U6 c  M! M& ?  Usorry,按太快還沒打完 ..
" q& T& R0 M2 G& d7 l- q, W* ~: |  M- A1 c/ n/ X  o- ?3 v
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
+ C# v# O3 c/ M/ a  G8 ^7 z/ ?' K,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) ' U9 h" u% U* f1 A7 S' J
- y* a! _, N% P; f! [1 \
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 5 d% k4 F. P% J" u$ |4 z: r
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. ! Z$ ], [9 C! ~; _; n* s3 ]
6 e: X- p' `. ?& Z8 ]
想請問各位高手,有沒有一些好方法可以解決 . 4 d8 s$ ?; {) G0 _+ i) d& P/ u6 @
. Y  d9 Y. B" Q3 n( B& {
下面是我hook opengl API的code :
7 M5 |2 P. E: O; E' f8 r// hook wglSwapBuffers的code; hook glBegin的code也一樣 / H7 C+ P2 Y6 U  f2 a) [
void WINAPI wglSwapBuffersCallback(HDC hDC) / b. h7 M: \  j$ X/ T1 T. @
{ # g, y) T( F% l7 \5 A+ E

, w. E0 H! D& {" @; P0 \( E7 Bif(!ininstializedfontshit)
4 d% F! F6 `' S: b  ^{
( J% m% D/ @1 J& o0 tfont.InitText(); % ?; ?! A  |& Q( w
ininstializedfontshit=true; 8 y# I' E8 K: x% H3 h! d4 i
} : h+ u- ?1 G: I6 ]# \
' Q3 J8 F# T! g
SYSTEMTIME SysTime; + x0 Y; E+ D  Z' q" C5 ?/ L) q
GetLocalTime(&SysTime); / Y; f# N* H3 H
glPushAttrib(GL_CURRENT_BIT);
9 g1 {6 X- R% H7 S7 |1 t) V// 顯示現在時間的字串
: h( W& }6 F* o5 B4 |3 zfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); 5 L& M# E/ {) f% f3 l4 t

3 ^( I# x2 [% l0 I// 顯示BMP
- C, h7 W: x5 P
( g; L( C8 V( v2 o5 [/ v$ l2 v, t! Rbyte Texture[]={IDB_BITMAP1};
2 X9 |/ m( q- m% O# a1 dglGenTextures(1, &texture[0]); " C8 a& N6 I& ]( q/ p
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); . K7 ^# Z( t8 U  X
3 D& g, H& }" r+ L
if (hBMP) // Does The Bitmap Exist? . T% v- C1 i& |& d( g/ o
{ // If So...
/ a6 n9 t6 t7 W$ v7 @8 g: `4 ?GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object & J7 w, c: H" h: `8 X2 }+ m4 R
// sizeof(BMP): Size Of Buffer For Object Information ) g/ V# y( ~7 w6 G* |2 }- G8 r
// Buffer For Object Information
1 R* k/ f  m. ]# U( qglMatrixMode(GL_MODELVIEW); ! M! I( q- c0 J5 S2 d; A
glLoadIdentity();
  \: o: S7 [! W9 ^, c3 A8 E0 jglTranslatef(0.0f,0.0f,-1.0f);
  B; G8 m) T& D& N0 W* M1 tglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); $ S& {3 b0 n* h. X4 X1 C
// Bind Our Texture
! T" o5 P5 @& `! GglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 4 M' J6 O4 g. c8 B$ W
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering ) ?6 T/ @: M& L" H# l) m
/ M) f9 P6 `- {. L
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); ) G( U4 N3 r8 U$ x% g2 Z
DeleteObject(hBMP); // Delete The Bitmap Object 7 S5 y2 b+ k' v* V
}
; u( |4 G8 W, _& WglPopAttrib(); 5 U# p1 {" e. ]2 P, _
  ~- ^) j! J) N! z- H
5 @, A4 m  j+ a3 `
}
% I/ ~% X; A, }wglSwapBuffersNext(hDC);
* o5 u' K7 F+ n7 w7 i0 F( X}
5 M7 @5 `2 E' ]  [, Y9 {% u, r- P9 D
9 c& l0 m9 _* X/ x/ V% M

6 S! h6 A" {$ J
- U+ L7 A8 g6 Q9 A1 B- E) g
! C( \2 h' J9 {+ a' N2 w$ a
, j" H- b# c7 ~/ o6 ^* K作者 : dorkas(aming)
. @6 b4 W# T6 `[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] ! j) h3 ~% a  G7 z( i4 {, N9 X
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 5 b) b8 Y+ @" R& ]" |$ @0 }
2006/9/7 上午 10:30:03
& I" h0 U6 N; d" b' h2 ]+ u! Q" g# N$ E# u5 O7 K6 h/ T4 R
1.貼圖動作錯誤
, e6 O# t" L0 D
, l3 G  L  B" A4 V2. / }0 c& U+ `  ]
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 2 k# _- Q$ z% r5 v7 s) h

6 M* [0 G' S% o" o2 S8 B/ F5 |9 q3 l' I. S) b6 Y& t& a9 g
struct MyTime
- P. h( E9 m' b. [{
3 q9 _/ }; t: b, a; Wbyte Texture;
% o& n; S5 a# L& W% J$ u; _FontGL font; 9 Y9 B' i* L" g& X# T
void initial(void);
! i! R1 W' \- F, V$ z  P' y, d1 B0 Xvoid finish(void);
% J, U8 R$ g# y* s1 f( fvoid draw(void); . S5 ]& O8 c6 O4 H, F4 t0 H, D
}; $ a' @0 @7 y$ l$ E$ m0 t
void MyTime::initial(void)
- F" _0 c( r5 i7 B- b! L{
2 s+ ]! T( v7 F8 B: ]// 載圖 初始字型 2 E5 H7 d: h: Y, F* T( I
font.InitText(); 3 \' u# Y5 q% v6 w+ E
glGenTextures(1, &Texture); " o. {+ Q; Z% D9 V# V# j) e; `0 @# {
}
# o( Q  D* Z( G+ d$ K' `* Yvoid MyTime::finish(void)
7 L6 z$ z( a3 X; f6 {# Z8 q{
2 I$ y* ]5 C8 B/ I//釋放圖形 字型資源
6 V: s- X" _. Z2 D} / X) f0 L3 O2 U+ R' {& g
0 U5 s8 m! U0 U1 x& X
void MyTime::draw(void)
8 e2 S, ?" H8 v( h: X$ B{ 4 C5 U* x! E9 y- ^4 g
// 顯示現在時間的字串
- _3 V5 K# c, r2 Bfont.Print(......something...); 0 c$ v( r+ @7 j; N/ a% a0 w% p
// Buffer For Object Information
1 w- n- ~& R' Z4 lglMatrixMode(GL_MODELVIEW);
" z! A4 s" T7 d# R! g5 k/ CglLoadIdentity();
5 |$ [- o) D6 XglTranslatef(0.0f,0.0f,-1.0f); 2 E7 W+ s% T+ `( Z4 V$ R1 Y4 k
glBindTexture(GL_TEXTURE_2D, Texture);
( k3 ]! [& w& q# A3 L5 k0 G6 S) K. ?+ b- f$ P: F
..... DrawSomeThing
& X8 L3 _7 Q. v% I* \5 H2 l8 E9 R; q/ O
}
# f& A) e# M- D& F( U8 r- p- b! p& g$ l: v6 ?

0 A6 q7 s( W; z- I$ T9 Z' t/ YMyTime time; / ]& a0 j% z% h7 u
void WINAPI wglSwapBuffersCallback(HDC hDC) 1 Z+ B% {  G& w/ Y) n
{
' i/ g6 X( B5 V5 o/ d$ g: I- Ntime.draw();
8 u9 a  g9 Q" vwglSwapBuffersNext(hDC);
: ]6 k  k5 y$ g9 j- {% `( z( z}
0 Y8 i( Q0 x$ X
$ `9 z- l: z# S4 k你只要掛進去前呼叫 time.initial();
9 ^1 d' v) k6 [結束呼叫 time.finish();
0 ~' P& k- }3 w: q4 r! |
3 M) {/ |$ w2 E5 I: c1 a- P' p7 y5 p0 I

2 q) F8 I" o) X2 l" p5 x  F* d! L; \/ L% f0 B# r
作者 : fushunwu(fushunwu) 1 ]2 q& `$ ]: Z, |9 ^. s2 d
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
4 i: F1 g, B; R- _# e[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] + \8 D% ], e3 I7 p( ?
2006/9/7 下午 04:19:31 # ]. _% l& `( N
% H2 {. K2 T; N9 ]
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ " E: |2 G9 }7 L# k8 V

$ _( f( V1 b6 W& d4 k& b(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 9 e  d/ K6 D- _- Y$ i7 W
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
% ]" \5 f1 e' ~, Q0 `% z像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. 0 p0 H8 a4 k) y3 {
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? 8 x) ^/ l/ E! W* d
3 k  F' w  K0 T& x3 m* ?! z1 ^
* j% f3 d) j. ~) i4 ^
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
2 Y% M( Z9 q7 A# ~8 d6 p0 u來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
) n! Z& A' r+ y* t- m5 x% a9 ]2 [這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. : Y- A# c% Y7 S) j, F0 y( U7 T

6 _( A" `7 p) `/ V(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 9 F; _7 z: U8 _; n1 X
# ^  L' M$ `) V8 J% d
3 g) X. a$ I6 e& n6 R3 w: f5 `2 z

8 S) i" G. _/ o' P  J- |6 V& u% z- m; ]/ [! k
+ n0 ]! n5 M$ z3 ^, i) t" X
作者 : dorkas(aming) 7 b% o5 A! b1 g: g' F) @
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] 0 f% L7 x8 ?7 B$ [( A
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( D0 l/ L; ?# R1 Z8 A1 p2006/9/7 下午 05:31:01
/ Y% w) _" ~4 I  r: B& t! W
( I: \% \( ~8 W9 M1&2
/ A: c" G/ e) u5 J2 T; B我對OpenGL不熟...
! l1 t/ f# c$ Z" a3 q! L5 @4 r( F6 H/ `* E% G# V0 V. O6 \
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 5 x1 w8 f9 L3 t2 M

6 V% Q3 ^# g0 t. `/ H5 a( T: _' F/ M( Q- C! W' {% w* p/ H# @& L7 E) A
初始跟結束都是做一次的就好了 9 D0 z( }: H( o' B) @- `/ [7 h
你高興要擺在迴圈裡面也是可以 6 T9 ?5 I* A) u$ L5 W" B
7 y3 V+ Q1 Q# u' `, ?8 R3 ^
程式的要訣就是 起 承 轉 合 & O; [! M' }- s. r+ m) R+ t; m
initial 7 z/ h% Q& M. K
upDate * r$ E- q8 r& V3 y3 ]$ f
change
8 w8 X3 p) _5 g0 k. j( cfinish
; a# |7 t) A( ^物件也是起承轉合 ) [* ~- E' O0 Y# q+ r, o
函數也是起承轉合 , r- z: ?# J+ U, g
迴圈裡面也是 起 承 轉 合
  j. o+ Q, Z* ~/ V" N3 s
: e( ]7 M2 h4 _" i
3 j$ a' Y( s* G& }; @7 Rfor(起;承;轉) , i: P2 z& X( a# `* [* O
{
, \7 I$ @3 I2 S5 H. L3 ?( `0 R
6 M; u3 Z" j2 U7 X
/ \* e5 |4 }; h( l& x  }9 U* z  }( ?6 C4 K  L
, c, ^  I( q3 w
} 6 W2 J: X0 D3 o- u! n6 [
+ v9 A4 z% J1 R$ q0 a" J: r* x
  r% R& ?* L. \2 w) T" t
只要你分的清楚 屬於那一塊的性質就好了
' I' N" W5 u+ H6 W: v* n* A$ ^% a! x. b

& N3 L+ f$ E9 i- I' _. I, a" h( Y
5 F4 F# X" t: d2 d- b
& `$ `* B) }" A8 ^( @1 E
作者 : fushunwu(fushunwu) 6 y* U8 T( ?  A: ~7 S
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 0 [  E3 _) t' [$ t
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] : }$ t; d! [. X+ T3 o9 K
2006/9/8 上午 10:32:26 $ G2 i5 q9 ?: W3 D9 h
: a; G% A3 }3 y
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
9 d' m# V( v6 j
& |* L3 ^( n+ r! ~' z" |  m像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
4 q% Q% N3 H. p/ I所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
' M7 c1 x% D' M. ^, H) c* _我在想是不是因為座標還是矩陣的問題 ? & P: |0 M) s+ ~( g' }0 d4 F/ B
1 x( |: M0 P" ~" ]9 m0 r9 ]' n
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
. ^& k# z$ u+ D; k, ~, G: Y至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 6 z$ ]7 b' @7 E; m" u
* b) M3 ^. H' }
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2