冒险解谜游戏中文网 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 h
4 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& ? U
sorry,按太快還沒打完 ..
" 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 B
if(!ininstializedfontshit)
4 d% F! F6 `' S: b ^
{
( J% m% D/ @1 J& o0 t
font.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 z
font.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! R
byte Texture[]={IDB_BITMAP1};
2 X9 |/ m( q- m% O# a1 d
glGenTextures(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( q
glMatrixMode(GL_MODELVIEW);
! M! I( q- c0 J5 S2 d; A
glLoadIdentity();
\: o: S7 [! W9 ^, c3 A8 E0 j
glTranslatef(0.0f,0.0f,-1.0f);
B; G8 m) T& D& N0 W* M1 t
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
$ S& {3 b0 n* h. X4 X1 C
// Bind Our Texture
! T" o5 P5 @& `! G
glTexParameteri(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, _& W
glPopAttrib();
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 V
2.
/ }0 c& U+ ` ]
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
2 k# _- Q$ z% r5 v7 s) h
6 M* [0 G' S% o" o2 S8 B/ F
5 |9 q3 l' I. S) b6 Y& t& a9 g
struct MyTime
- P. h( E9 m' b. [
{
3 q9 _/ }; t: b, a; W
byte 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 X
void finish(void);
% J, U8 R$ g# y* s1 f( f
void 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' `* Y
void 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 B
font.Print(......something...);
0 c$ v( r+ @7 j; N/ a% a0 w% p
// Buffer For Object Information
1 w- n- ~& R' Z4 l
glMatrixMode(GL_MODELVIEW);
" z! A4 s" T7 d# R! g5 k/ C
glLoadIdentity();
5 |$ [- o) D6 X
glTranslatef(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 k
0 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/ Y
MyTime 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- N
time.draw();
8 u9 a g9 Q" v
wglSwapBuffersNext(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 p
2006/9/7 下午 05:31:01
/ Y% w) _" ~4 I r: B& t! W
( I: \% \( ~8 W9 M
1&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( c
finish
; 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 R
for(起;承;轉)
, 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