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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 - x0 {, C4 y+ [/ x9 l
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

) p+ p# }* s/ V+ N
0 C, @/ N5 p) a" D& Q. q2 `# U. k1 i
原文
. @# G% R, K$ J6 I7 [& `http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
7 R8 c7 E, j. u
( x# z% P  f9 s  y( u1 Q; F大家好,
# c; P. E, T" z" b4 |( j- a
1 y& D1 k7 H9 _3 x3 N" t' A9 Y我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable % ~3 Q2 O/ s9 Q# V
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
( ~8 _" S! k! [# e9 c9 ~& |3 |* g5 j! s; X" ~/ V7 b
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
9 m4 u3 `. m6 Q& k0 M. k% Q" r但是BMP圖放在wglSwapBuffers卻顯示不出來 & A3 p3 ~* @1 y3 Q& t( }3 o; }
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 9 L  Z: _$ H  C  O3 K
樣的時間字串
3 ?( O. D4 s; u0 [( \4 n
# O& \8 {5 y/ |& Q/ f. V: g/ h4 n) f3 m% ^

; j/ o! c3 B0 L  U作者 : fushunwu(fushunwu) : |& X! ]" l5 i+ E2 T# k
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] % K3 U- R% X0 q7 f. N
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
$ t& r* l4 C6 u. W5 e2006/9/5 下午 03:21:34 7 T8 _& i! Y; f/ L4 s$ o1 P
7 e9 r" w7 J3 }6 p& G- f. p+ ?
sorry,按太快還沒打完 .. ' r& o' I- G# v$ U  p
' ^- s3 y8 l. r' V- A3 g9 c
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
9 q' M# a8 ~. ]5 }2 m( Z$ W,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
& B9 O, B" R0 a: c: r; `; l/ {3 X# G& ^7 @, R. p, i6 X
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 % [( ]/ t; O$ Y! O5 ]1 D  K
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
: `+ c- {8 i& c. J* U$ V- |2 j* D
1 m& }/ l( ?' F" I6 {) ^- K想請問各位高手,有沒有一些好方法可以解決 .
1 G2 r- r6 M" x* i6 B8 q1 ^, t# P8 R; a8 n8 h, a  e6 P
下面是我hook opengl API的code :
) U2 a  V3 C' S; M2 E; z& S// hook wglSwapBuffers的code; hook glBegin的code也一樣
6 _, Q% M9 f; _9 k/ ~void WINAPI wglSwapBuffersCallback(HDC hDC)
, D( ]% x4 }* |& O{
& ~0 P' B9 R# @5 w$ P" N/ a( B2 [7 j
) m  ?+ G! I9 V9 d& _8 pif(!ininstializedfontshit) & n# J7 h/ s& ?2 _2 P2 `
{ 8 P: A* t/ W6 s5 ]. Z" x
font.InitText();
9 E  U5 n+ F# ]! x# q4 Zininstializedfontshit=true;
" X8 X1 m" m  B5 @* K1 G3 y} 8 N+ J+ c5 F$ E

1 I+ G- p! F6 bSYSTEMTIME SysTime;
2 m* V$ a  X6 z! F) y( OGetLocalTime(&SysTime);
* t+ @$ e( G7 I2 I5 cglPushAttrib(GL_CURRENT_BIT);
/ Z: ~& F8 q) u- R! F/ R7 ]// 顯示現在時間的字串 ! j9 R  o: T8 r2 Y: d2 \$ g
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
1 R0 }8 G: D9 x  w- a) V& m4 P- y% R& T) j% D- N2 C# Z
// 顯示BMP
9 O1 a1 f% T, {' N. `& A8 ?: c% ~0 c7 u# [  ?9 k
byte Texture[]={IDB_BITMAP1}; " y0 `& F! G0 M) ]
glGenTextures(1, &texture[0]); ; W* ^# p% f9 j0 @, `" v  B- s; W$ m2 r
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
+ i# k8 X# [9 K
9 S0 u7 Z, V$ A' Oif (hBMP) // Does The Bitmap Exist? " O) g  N8 [1 X" Z# F6 X4 S
{ // If So... + B' k2 F! f0 b3 T! c% o1 U& T( W
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
2 k  A) t4 J. H/ X, u" [// sizeof(BMP): Size Of Buffer For Object Information
0 \' F4 v  ~, n* n8 V8 c// Buffer For Object Information ( E, A4 ]$ W; J6 J
glMatrixMode(GL_MODELVIEW);
7 l3 _! g4 L5 Y% H! OglLoadIdentity(); ! p  y+ }1 y, z
glTranslatef(0.0f,0.0f,-1.0f); / B8 ]" f6 f6 ]- x( A
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); 5 R' D, C7 I6 O+ I6 u" p: ?
// Bind Our Texture * t' b( C0 p4 {2 [& p
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
! B) \4 l" _+ Y; K5 x$ f1 L% d: gglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering / f, z# s8 l: u" l  x

% C1 t$ m4 B' N: qgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); 6 w( ?! o1 Q( v  W. H
DeleteObject(hBMP); // Delete The Bitmap Object
2 [* t9 P4 _2 V8 y3 z9 U! t}
3 G. H3 A# F7 eglPopAttrib();
- R  \  F: h2 v- T% k4 E& \" f- w9 Z) L$ F) L1 E4 K
0 b0 o2 D) T, T8 h  T
} # c: f/ Y. q( [0 c. K
wglSwapBuffersNext(hDC);
7 s3 m% d7 H! E! ~2 J: P}
0 `; h% d7 z5 S
" m1 y8 e4 \  _  O8 C5 j! W' `3 L( f

; F6 R& u+ f$ m: g9 j
7 v9 `. Z+ F+ D2 E2 H* |0 x
3 ]2 C% E6 j5 ?% w9 T1 s  `7 G1 p4 A7 K0 l
作者 : dorkas(aming) ( R: o* |7 Y8 k4 ?8 C5 n6 S" N
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
/ [) l& i4 A# r7 e1 |* M" p[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
$ G- x' u4 d4 a4 W* Q7 q8 x* J4 L6 k2006/9/7 上午 10:30:03
- d6 N0 ~2 N4 S; p0 v" @$ ?' G. ^
; r% a. P4 D$ |" ^8 ?# q3 o/ j! W1.貼圖動作錯誤   H2 ]5 M& E0 ^- C
, {) v6 h) r% F4 R& O2 {
2.
8 E  i% [+ H1 r每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
: C3 w  ?# T( V+ ?
  @' \/ @& C& o! T- K8 g" L# j& J7 `. S' v& a! b; q
struct MyTime
( J7 j' g3 _) ?4 B2 }3 O, m{
, l; G$ N" S1 c* q" d+ wbyte Texture;
6 I- \0 ]5 A& f5 j' F5 yFontGL font;
9 M, J- q1 c7 c% X- X9 `void initial(void);
$ g  X5 ~6 B5 z% U# e1 n2 w5 i0 \void finish(void);
) t; v0 c3 }- T# l# _2 dvoid draw(void);
: y1 H& y0 Q& C  |};
1 ^+ D& i1 F- I. B& i0 Kvoid MyTime::initial(void)
6 ?. Z/ O* z& Z+ E2 o{ 6 |' I% E8 C: R2 D6 o
// 載圖 初始字型
7 p' x; X2 `1 tfont.InitText();
( j3 L; Q6 c$ @6 p9 I2 XglGenTextures(1, &Texture);
( K5 ^2 \+ i- R1 g} # h& R# R1 N9 R7 Z2 C6 w! {
void MyTime::finish(void) : Y3 t6 }* c7 P) p  ^! o
{ 7 j+ u. I. a1 A( J- D4 w* Q
//釋放圖形 字型資源
. T8 W0 ~1 u: k" B; Z}
$ [7 h1 n# a: _$ E) G
2 t. I/ ^* V; J! X/ Evoid MyTime::draw(void)
( q; @1 S( z4 Z* X6 M2 \{
% ^% F% W$ V$ N// 顯示現在時間的字串
. P1 U9 R1 J. s. _+ d  i4 x( Afont.Print(......something...);
0 Z& P, p2 `+ z' |# N// Buffer For Object Information 8 V5 M7 O3 I3 I- N3 R
glMatrixMode(GL_MODELVIEW); 3 r6 X/ R7 c( `* I5 w5 v3 n
glLoadIdentity(); - N& Q0 L( T! V# P8 d5 I; A" ]
glTranslatef(0.0f,0.0f,-1.0f);
7 @* g) f" E1 ]/ K- }8 I# hglBindTexture(GL_TEXTURE_2D, Texture); " f/ [# O# N% j, h3 J9 B

1 `  W" t; U+ i7 X..... DrawSomeThing
& e! y& x7 i+ x
4 `4 q- _& x3 H, I, [- i7 M5 H3 O} & r1 Z1 l* W. w% I' |
% D! ?" u- l6 }8 a7 j

; b* [: V) a4 a6 G# O! [  jMyTime time;
. K4 \/ s( d- f. X1 s1 b$ r# B! G( r' ]void WINAPI wglSwapBuffersCallback(HDC hDC)
5 K6 u5 z# |! \  K: N{
; J7 W4 ], U4 m' P. ^time.draw(); # ]& z3 s& k8 p9 }* A0 S
wglSwapBuffersNext(hDC);
; N3 ]4 X! y8 R0 u5 g! `}
: [( J2 T! T; b' B$ t. _! B: M4 n
你只要掛進去前呼叫 time.initial();
. g1 \/ Q! e) ~% B- d2 Y$ H結束呼叫 time.finish();
3 M1 v" y  ?# g# M
* _& D# @/ B+ w# c0 o: P! l( U* h; Q

% S& i; X& `  e/ @/ n/ M# C
$ C1 T3 u& B) N5 L* j' a作者 : fushunwu(fushunwu) . x" ~8 V4 e# t& m6 x# y
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 9 V" O" b4 b6 O. n' r1 q/ G# r
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
8 K9 w; K2 x  s2006/9/7 下午 04:19:31
, z5 x0 r" c' i! ~. D4 }7 |/ I
: v  S- {1 w$ t謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
8 J( }" e! i/ C6 X1 n* I8 _4 C- _$ c8 v0 A! w
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
6 ?3 U  D9 D8 i" |時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
% I( B) c2 f% h8 v, G. |& _# I7 h像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. + k* E$ c; e9 f6 B1 X
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
- e  l* L! Q' C* X
+ P- U5 ^3 E7 `, h* {5 [* M  N' y! Y; E( ]: u- x1 Z* E$ T
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
9 u7 Q0 `/ A+ U- c* o. P; {4 m0 P來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
/ E/ q- X$ N! e這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. % J$ M0 r' L7 Z3 \2 o4 B0 x- K

6 C/ g7 M( J5 I* X' O9 U( z(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? . L% D, {- v" e/ f  ]

/ b2 x! ?6 j  U* H- {( W# R9 G, J/ X/ {- U& x2 u
/ L( Z4 C, C% {
% q5 I7 Q( o" V4 Z2 b8 h( k$ M6 |3 B

& i, w6 ~0 V/ B作者 : dorkas(aming) 5 `* b  y0 i% y& Y! `
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
( Y* _' f6 P3 l+ g9 q( E0 s[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 z" v3 A$ P" x2006/9/7 下午 05:31:01
: f  \" [, z; t: \+ e* u" B( f5 W0 X. Z- I- r) n& R. K% ?# h9 q
1&2
8 e2 G% D% O  `! q2 {  ^) y我對OpenGL不熟...
$ a; e5 q$ D5 ]7 _6 V2 L: A! W6 t9 G! ?. p/ H& `2 t
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
3 j. `! ]$ s7 g1 m& D$ T( P% Z. k# p% z: y" ^) K
: _) ~0 m# C& q$ h; o: v
初始跟結束都是做一次的就好了
8 S3 k" c  U- L5 c3 x. F7 G你高興要擺在迴圈裡面也是可以 7 \. F5 v0 r  e4 l; j2 p  j0 W
6 ^9 c2 _/ d" ^8 d( v
程式的要訣就是 起 承 轉 合
- ~2 w  d) L4 ?% c- j# g- P2 K6 v) Vinitial " Y: b$ [; n5 w0 ?9 x6 `
upDate : j8 _- v4 L+ j8 \
change
& v* f. R7 Z$ O* U6 l# x. S& n4 ofinish - X' |" V5 Y0 }. Y
物件也是起承轉合
  X' c4 w9 X8 ^/ l函數也是起承轉合
- {! L7 G4 K6 v' O) _' {迴圈裡面也是 起 承 轉 合 8 Q& O4 b0 r+ Q$ o

" ?5 D4 F) N0 x) K& o- w* L0 ?7 F3 [" S4 I8 X
for(起;承;轉)
9 B( D! Q/ r2 O* b" e9 c* D{ " e' D) r; `. `- [' i7 D( q0 W4 o

, ^  b& g4 l  M- @& S4 O4 f8 R6 C$ S( w/ q, t& ^# a

& J: P5 S) j5 d0 @: Z% E
% }# w; J# g8 ]& @. h& L- w$ H} # m2 O8 D. y& x
6 c: U7 s* Y& j7 w' P& U$ C
2 \& F* U) ^, c' c6 r
只要你分的清楚 屬於那一塊的性質就好了
, y+ V+ h7 b, u2 p. V! _& f4 r# }; U

9 s3 u4 B! n2 d" N$ L6 G# g4 o6 V

  i# y. r( V: o9 {
3 g9 n5 V+ r. u+ q4 `作者 : fushunwu(fushunwu) 9 K7 n& M4 @1 b5 i9 n
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
+ d# L( H' r4 J5 i, ?[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ! `4 t5 g7 \, N; a+ u; g
2006/9/8 上午 10:32:26 ( l# _  `  w2 W% r" }) g

0 W5 ]( \# `3 o. a- o恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ $ i* y2 n2 u6 Y! T/ ]8 Y

( o- Q: j3 e$ r' a. T' Q+ f& F8 r像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
$ I" d- ~' H3 w$ r" I1 f0 m: ~$ H所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
  h+ n3 \# m6 S& a/ T9 o我在想是不是因為座標還是矩陣的問題 ?
* A" E8 Y2 S7 x. D
! \( M$ \% b+ K& m$ J, k% y但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? # K+ O5 U- O- E. K3 z
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. , V$ y, e8 Q5 ~8 Q1 |8 K

& {  x' P5 z; b4 }9 m所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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