设为首页收藏本站官方微博

【汉化资料】Hook OpenGL的問題

[复制链接]
查看: 1655|回复: 0
打印 上一主题 下一主题

【汉化资料】Hook OpenGL的問題

跳转到指定楼层
楼主
发表于 2009-6-6 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
. U: r! B3 `( Q$ P/ |( j( y, x所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
" c% B/ i- H6 ~

" T: T* O$ `7 D/ z8 e$ q, p4 l- a
4 y2 u6 M9 \* G) F$ k1 }( Q原文
* \% B7 {* e) \! g  |+ H1 g! nhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
, p5 R8 b  u! J' o) i3 M7 z. M8 S+ o2 C9 P, v
大家好,
) @; X( K0 R' K0 Y/ _# \: H1 R
& i) J8 M# m" D0 V4 b0 o6 S8 }我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable . ~, a6 ~6 I( m/ ~2 h
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... ! h) S0 E5 b+ x

: {2 z' c' q$ _(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ( `, E$ X" y/ j/ I
但是BMP圖放在wglSwapBuffers卻顯示不出來
( A$ K5 J7 B0 r/ ?(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
1 r3 s: p+ Y8 ]' \! j+ U樣的時間字串
9 l# F7 g: M+ j% [) N" j/ I+ d' t; v* l7 e( m

, b) l. c# o: S3 |/ K, c! e8 \8 q! j2 V6 l: r
作者 : fushunwu(fushunwu)
- r' E+ X; D. l3 i[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
; P$ F1 @% q; J, e- n* w" ?% G% P2 d[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
. b6 t4 x) O  _: r' A2006/9/5 下午 03:21:34 # A9 @- n% g" R# \2 M
! U: d- F3 W5 h: @3 `# D+ x- ?
sorry,按太快還沒打完 ..
: X3 D, E# X5 V
# `: B1 P0 I; V) i3 r我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
" L0 x+ l1 ^% [6 M/ _: c$ x% `,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
2 ]1 X3 s& `6 G- _9 L) `0 n1 y  K( W, K& v) M$ m
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 / l8 h9 Z# d/ b3 D
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
+ k8 ?+ u+ n& n5 H( E% A0 r
, M9 D$ L& w, F7 g& B. d5 r想請問各位高手,有沒有一些好方法可以解決 . ) p& G! `& B5 n. g4 G

4 b9 x, N# r5 A9 e下面是我hook opengl API的code :
- A3 Q3 L  o. ?% c/ }  d// hook wglSwapBuffers的code; hook glBegin的code也一樣
2 }& B; p  d- P6 }" Svoid WINAPI wglSwapBuffersCallback(HDC hDC) 8 E, v; e# T4 V, S; H
{ + e5 m9 t# c! q* T, R

; A" E: t2 I- a3 ]7 G3 jif(!ininstializedfontshit)   \8 ~  W6 d; Y; g
{
, U% U, D  H  W3 k* Jfont.InitText(); $ `- M3 i+ `  G3 v4 {6 i# x+ c
ininstializedfontshit=true; / f3 T. Y, _. j9 A; \9 [" E
}
" R6 e: }( B+ N9 p4 H: R+ ]& d* ]5 r' R( U' R0 g
SYSTEMTIME SysTime; " U$ i8 Y* S' M" u- v! S( N
GetLocalTime(&SysTime); 1 D$ N$ n8 X; S0 l: F, C& w
glPushAttrib(GL_CURRENT_BIT); $ r! t0 h. ?. B0 A# l& f2 q
// 顯示現在時間的字串 8 o/ l- l; |' q8 j
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); $ G* G- o  d& ~/ h
5 G7 ]. Q3 {/ z) x
// 顯示BMP
" S( J% S2 ~! I- b! g, K* p8 T: f7 \1 Z2 N7 k) \4 e$ R, C
byte Texture[]={IDB_BITMAP1};
' G: m0 n! V6 O/ [8 u' O  L2 ?glGenTextures(1, &texture[0]);
; w; l; z3 H. E" K* e0 l* U3 RhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); 6 v7 q& E; D$ K0 i$ h% R; @% u

5 R- [- p! h2 l; a6 m" Kif (hBMP) // Does The Bitmap Exist?
& \% U: y3 i/ o, K3 a4 A8 \{ // If So...
1 S0 Y' ^; S+ Z1 YGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
+ U; _# Z/ F3 |" O' y. G// sizeof(BMP): Size Of Buffer For Object Information   N$ l2 |3 Q  Q$ X
// Buffer For Object Information
9 z0 N) H7 W- Y! U( xglMatrixMode(GL_MODELVIEW);
4 I4 j, z0 |* y& c; Z, b! Q& u% fglLoadIdentity();
% A2 f2 h+ x0 ^9 o& Z4 j/ sglTranslatef(0.0f,0.0f,-1.0f); 0 J5 G7 y- H) z- x& v0 @
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
( ?' f( m0 ^0 V# ~4 S/ m// Bind Our Texture
/ V& M) g$ k( k* U4 y- bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering ; H6 {: G# n( S9 e, S7 z% O1 T
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
5 b+ r  |& k0 {2 W1 ]+ Z- k# ~) q+ Y! C  i9 K2 G
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
& `, U8 k5 m4 m9 M8 hDeleteObject(hBMP); // Delete The Bitmap Object 2 a$ p; C; A! Q5 c
}
6 ^: d7 Z2 L' r. q9 {glPopAttrib();
. G, d# ~1 z3 X1 @% _( P6 ]5 C9 }; ^' |) I, X
2 T0 |: p2 ]. A0 X7 X7 m; e
} % E* C; _( ^0 k/ m7 n- c1 O
wglSwapBuffersNext(hDC);   Q( W$ t! z1 C1 `7 x
}
- U! Z; C) v% j/ o2 D3 O6 R$ d; k  W
1 Y3 `5 G9 A$ u" ^% W& b# J! p# P
& U1 H- u# D6 y* _4 y2 H
& s; g: y/ Q& f. w+ _

" O4 O. u1 P5 D2 o. n4 D; o% c, L; p. V# w/ H+ |; x7 V
作者 : dorkas(aming)
4 y. [8 g" [2 n- f$ P. g2 z+ y[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
1 R) J7 H6 h5 \$ }! \  Z[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 1 ~% R7 ~, r! U8 e
2006/9/7 上午 10:30:03 7 N, z8 j1 g1 z3 f
/ `! Q& f+ s* q7 m' I
1.貼圖動作錯誤
" F$ ~0 {- z+ B- u5 o" j& h& f0 o% c1 }: m6 q  E# n. ^
2. # V' i% t5 K' s1 @" w
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
# q4 J  O$ ?/ \4 t4 ~
) T, ]& Z3 o, T5 U& Q" g
  P0 \% D( q% w# l; o8 Xstruct MyTime
( i7 P: R! l5 y  H* Y8 B. K) E6 J{
- X( `4 o: _6 R: }: tbyte Texture;
+ N' Y, n- S! n2 z* c9 H# _FontGL font; % j  l0 o# ^- [! D, }1 l$ B
void initial(void); ! ?' H& M2 a/ o. v% q" g
void finish(void);
0 V3 z; _6 v* Y, L& k" dvoid draw(void);
/ Y8 e% I, ]$ B; Y; \7 [3 z};
/ B3 S& \$ k; R1 n* Pvoid MyTime::initial(void) , n' N8 k; l/ D7 c0 ?  J9 L: b
{
, f& B' V7 |/ L// 載圖 初始字型 ! y7 C+ T+ p4 L2 a
font.InitText(); 8 f# K/ Z  F/ {; c
glGenTextures(1, &Texture); 8 o1 |  `; V1 ]
} + q" {/ K5 ]1 K% |/ O& G8 P
void MyTime::finish(void)
) x3 K' [) |/ U6 n{ 4 l( L, m) L# L  U
//釋放圖形 字型資源
( L- n% i+ m1 v, N! L& m" O} ( d; T+ z: R8 |7 V

9 V. }: g# v4 X+ T7 n6 Y# |8 v0 lvoid MyTime::draw(void)
$ w# @, L5 G/ [8 k+ p8 g, C) `{
7 W) y$ y/ x) U# q// 顯示現在時間的字串
' b' L, g9 C6 g/ p* O2 _font.Print(......something...); . F0 D5 f1 Z0 C, t& L2 n0 J0 r9 r9 c
// Buffer For Object Information & Z8 y# x+ i8 s- M" P
glMatrixMode(GL_MODELVIEW);
5 U; q& e+ ?  u: o7 S- dglLoadIdentity(); : O; o2 N' }) f# N+ Y' F
glTranslatef(0.0f,0.0f,-1.0f); & e% U$ E6 w( |" S7 Z
glBindTexture(GL_TEXTURE_2D, Texture);
7 m* e2 I% U: J2 H
6 U1 k) b8 L( g1 }9 A..... DrawSomeThing
! P# G/ x7 J" z6 R% W$ o: j3 R0 c. {7 D' l+ n0 F& i
}
3 [1 _2 A: [4 d9 q; q3 ]6 y  w; d/ b( L1 W& v5 m
, ]0 o) w  Z7 W1 ^# S
MyTime time; $ S. [* V6 X0 e# T* |* k% k
void WINAPI wglSwapBuffersCallback(HDC hDC) . b5 M9 H+ b5 w# j% |
{ , d" x7 l" i  ~$ b' S/ I+ x
time.draw(); ! d" C! v  t7 u- o
wglSwapBuffersNext(hDC); 5 @& {' F( H. n" v% ^$ O4 ^% h
} / q& \4 g  W8 {: w; E- n/ n9 Q: X
8 l9 D& X& A9 a- L, @5 W6 [" L
你只要掛進去前呼叫 time.initial(); ! y2 f; b# Z. v4 b7 r8 G
結束呼叫 time.finish(); * v* ^( Z8 K* c2 |+ S1 Y( j! m
, ?5 C) k6 z- {% F- `3 i1 H

% c& G( a+ t* Y$ b* i- G5 k  K8 o
9 Z$ V! q. [8 Y9 n; k/ S" H) C! Z
3 D% g& J2 J6 ?6 Y% @, ~9 \# J. {* @作者 : fushunwu(fushunwu)
) H# J! t5 b; h9 `- I/ E[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
- I" P; [9 f% J8 @( q3 M  f2 |[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 1 e4 ?: @# R$ i, O8 n( e' T
2006/9/7 下午 04:19:31 1 a6 p% ?  \4 P( D  E( R7 \

7 E5 `) n4 y9 @$ d$ i7 {謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
) i* f5 u/ }. S5 W  {. {, m; l7 t1 |
% ]% I, z: b% }, M0 L(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
( H% z* n4 N  k: g時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. 1 ~0 k8 m, m/ A4 l  d+ M
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
- ?: @- [. r4 {( x所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? : d5 y( _& e# h3 f. ]2 b( ~

6 A1 Q( z8 p3 G' D& A7 \$ N5 K4 B  W4 b+ J5 ^9 }
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
. U$ Z, Y2 t3 m: {來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? - a7 J! y* K: N4 }% q- _3 Q  t
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 0 y' \; j* Z! x- h0 N+ A' e4 u2 A
& s9 [! ?2 |5 x3 N1 u+ |
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
" {( y9 v; h6 L1 w& W: Y( Y/ ]
9 v; K& |& o- L2 o/ J
* X5 f9 _+ J: k. T
6 e. B) M+ K; m- n5 x, h* C* Z( D. r+ A5 m7 _

" R% u& G' t$ P2 c; [8 x作者 : dorkas(aming) : }0 E1 h$ {6 `/ B3 d9 ~( b) g! [
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
  k0 i" V* Z( A6 f[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]   p( X1 q2 r( n
2006/9/7 下午 05:31:01 " C$ x6 _0 M" a

# }0 m2 A3 ^8 X" B- U: m1&2 " G  z$ S! ?8 E% O2 o
我對OpenGL不熟...
, t. d4 }* Y. [% S& X% w( O; x& v+ }; Y4 k0 y1 D: @' X; y" o
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 4 u5 l0 b" r# e. Z4 [3 t. U
! c. t/ ^5 w9 O
9 O" C+ j" r6 v- L. g
初始跟結束都是做一次的就好了 2 r/ N# r/ _, A5 K# U' y% G% H* x
你高興要擺在迴圈裡面也是可以
. v; S# [5 p8 {0 A/ Z! P8 g! a4 O9 Z6 U! l7 m  P2 L7 w% K  x
程式的要訣就是 起 承 轉 合 ) I9 z! w1 v' f! G/ s
initial
- g5 x7 @3 {1 E4 N3 tupDate
9 n6 F, G& Z( I3 b" j1 v5 |# r* R/ ?change 1 c# \4 H1 F+ o" j
finish
: |5 V' G' n$ H7 a物件也是起承轉合
; w2 r) z% ?6 S# t" ]% o函數也是起承轉合
7 r+ i8 e, y4 r. B; f迴圈裡面也是 起 承 轉 合
, O% H2 R' P: H3 |6 \$ F0 Y4 |6 E3 W  l  ]( J

/ j; Z/ s9 t& Z/ c1 K, x* Rfor(起;承;轉) ! H2 j& X- o- K2 J3 a3 b
{
3 w# Q! B# w$ |  u/ n
& Q, Q  O. U7 K; u7 |2 m* D! E. G! s1 A+ w. M
! g4 F; M, v2 s4 t: M0 ]& k! k

8 q4 s$ \/ m+ H+ _. A3 \6 s} % v) Z3 f5 _3 Q) S! \

) K$ E% _' v) l7 L7 j. g" D9 |( ~" j3 n. X- i; r  r! ?9 W* F  Y, Y
只要你分的清楚 屬於那一塊的性質就好了 5 \) l/ P( d) h" |# @* X1 b

6 m' h* P+ Q/ L6 m# c
* `! [# u( f( y8 j, k/ I. C+ I" F5 m7 u+ l5 n

+ c, R$ \/ q! L- u) y/ H3 M- K! L6 M- {0 O0 }) ~( m' p/ E! c2 b
作者 : fushunwu(fushunwu) ! s) d* @% k% k$ E8 d' b
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] # k1 c; {  |. n
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
7 b5 C+ u0 m, ~& f1 L) k9 t9 U; g2006/9/8 上午 10:32:26 ; v5 m& _6 M0 b! N5 h

% U9 ?$ W' d7 g8 [3 G2 ~& C5 e恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
) G* x9 m" Z7 M6 l# t
& B7 Z* C- Q& J' I4 A像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin   ~8 k# t# Q  O5 D1 L7 [2 g
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 0 J, [' X' ~& `
我在想是不是因為座標還是矩陣的問題 ? 8 B9 v- N( f3 b

5 B# g* D4 q0 F  u" z但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
8 L3 q. J& W1 X; C2 u8 Y至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
* N3 z3 N$ c9 C. t$ m; |% w+ f4 Y+ e/ x) D4 K& c
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表