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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
# c2 J) ^9 m' s; V! M' k所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

1 w+ Z# Y: H$ _& k* T
0 C' i# V% v7 P) s- ]) o3 d6 f0 C5 c; w) a; i3 ]2 G
原文
1 w! K, X3 h8 i, Bhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
$ Y- M6 H$ X, ?9 G$ E
6 b) X$ G$ u) B3 w, N5 v大家好, , h% p1 J$ {8 s. }
! w$ w4 j8 k* i- N+ U
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
. X. j  a6 Y; `,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... $ \9 S4 y. R+ G

- y7 P. r7 c! v( E(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
6 W  I4 O' Q1 h/ ~但是BMP圖放在wglSwapBuffers卻顯示不出來
6 L3 N8 ?4 \) A4 H0 Z) a+ S- d(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 9 e6 ~1 m' A+ ~0 e: x4 |
樣的時間字串
/ x, W* y- H* D4 g: M
6 g( a# w: Y4 j8 V( K) w1 o6 n2 Q3 y
8 i) [4 a$ i2 b* i# ^7 u' o: t7 m. U2 m5 T2 B
作者 : fushunwu(fushunwu) & E; [: m" |7 ~" S4 B+ l  A
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] " `8 O7 q0 T) u% B" J5 ?
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( g$ H; h6 `' g& G4 H2006/9/5 下午 03:21:34 5 u3 Q5 R) J4 |) H, l
; R* ?5 G7 R7 Q+ {
sorry,按太快還沒打完 .. 1 }$ {1 |& _- v- v6 y1 m% w  p
) X/ l$ W: R) M
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
% x8 _' S+ l' n$ n+ G* k, X,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
' L& |7 V( D+ v$ V1 M+ I) W4 {& y2 Z3 F0 |$ n' y, q
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 ( F& A. O; e0 m2 x1 L' E2 F5 Y; q1 Z; B
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. , d7 p/ R/ |; D9 B3 `- T5 w

) D6 ?# q; F! i: x$ B想請問各位高手,有沒有一些好方法可以解決 .
% i& H  g! e; }1 f0 T8 A9 k. s3 P
下面是我hook opengl API的code : , x) M7 k% o& m& n) v4 a" w4 M
// hook wglSwapBuffers的code; hook glBegin的code也一樣 5 ]* X* ]/ r  K7 r) E, W
void WINAPI wglSwapBuffersCallback(HDC hDC) / f0 x; J# ]2 U. F9 W
{ 8 E0 K: j1 P6 Q! q. c

, t2 K" @1 Y' Y8 |if(!ininstializedfontshit) + k: x4 V' k) ]0 H
{
6 v5 I& e. {* E8 |; `font.InitText();
: T- u9 Z# w: D# @$ f3 Q2 q4 ^ininstializedfontshit=true; 0 `9 I( b! i# s* P* Y8 @
} ' O+ W- ^7 |, G) D) B& x/ L. \

+ R  @- a. f$ `6 [4 QSYSTEMTIME SysTime;
3 e" C$ |9 l9 x) S6 UGetLocalTime(&SysTime);
6 l2 u. e5 S0 U- x- VglPushAttrib(GL_CURRENT_BIT); 7 E6 A8 l' i0 R/ g( O/ K1 a% O+ ~
// 顯示現在時間的字串
% F' q3 D! ?# _9 x1 k8 H- J  t( @/ Mfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
4 u9 a) |# r' {2 e3 w; m
' i+ Z( \' d- e1 b8 @// 顯示BMP * G# C' I8 }! @4 Y8 X, T' ]
5 z" n, k5 `% X
byte Texture[]={IDB_BITMAP1};
. N2 L0 P+ c& }glGenTextures(1, &texture[0]);
% f. Q+ [' X' _  hhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); & J) i% o' X$ j2 C) s" q
1 t: l8 ~/ ^0 V/ L
if (hBMP) // Does The Bitmap Exist?
+ b9 d* K9 h( B# e1 @( {* H; l{ // If So...
/ S- I$ ?; S1 x& r( \0 H) qGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
* x' \$ j7 t! O3 j  O0 w" p// sizeof(BMP): Size Of Buffer For Object Information
2 ]9 ~$ ?8 j$ N' G// Buffer For Object Information
9 X  E) x  {7 l- k. RglMatrixMode(GL_MODELVIEW); 5 o6 X9 [$ P! z  A% ]# p5 W; c
glLoadIdentity(); : L) J* N0 b# j6 G# p) i  b
glTranslatef(0.0f,0.0f,-1.0f);
% U/ Q) \# B% B2 v4 r9 }+ B) LglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
; P) F5 ^  f- }  w, q' l; C; {4 \// Bind Our Texture
. P3 |, M8 E( M5 VglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
; t! @  ?/ J$ KglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
' S( L' ?6 c3 a4 `- r
7 t; q( T6 X* Z0 RgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
6 g; |8 d# c+ h" XDeleteObject(hBMP); // Delete The Bitmap Object
+ t- \- V( g+ u7 z9 u} . ~+ z8 b) r0 M  c- r, W6 \8 X7 C
glPopAttrib();
/ V$ n/ o9 Q/ J- y* ?5 @
- b+ Z# G/ t8 W: e
6 |6 V- P0 j7 X, |6 z& a: P1 n; k; B% y9 |} ! L- U( J( q8 g( b. S4 k; \
wglSwapBuffersNext(hDC); 9 _3 N9 s0 w* P9 i
} & O  ]( Y6 Y* h* h% P

! N! g7 G' z, r* _) o, U9 E1 \4 Q- @  K1 e3 T1 A+ q! g
+ |1 ?3 [$ O* z$ `+ i

% t$ {& U7 [, v9 i& ^  V
  d1 @/ H5 Q% F) |8 h* J  Z! Z
* y4 X5 r5 Q3 X0 `/ s, r! f作者 : dorkas(aming)   P4 G' `2 N3 A5 H
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] 8 L! F/ O% h9 K- t( h6 T) j8 X
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] / r4 P# I( u, J3 M- ]$ C+ a
2006/9/7 上午 10:30:03 $ a2 ^* i: h5 Z7 }! }5 J

( x/ V, e* L% v) D1.貼圖動作錯誤 ! `# R) x% d+ y- Z
5 o$ e: z& u+ T4 `3 J
2.
" ]# j/ W, e0 S3 y每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
6 O7 y; t4 f/ Z4 |' K% o+ ]# h, t3 n/ c5 @1 `* g
0 D, h" y# |0 E( Y; _  g6 ~
struct MyTime 3 C) N7 @. i) @8 ?0 @
{ , I" z+ \3 g" L* d
byte Texture; ( L# q3 r) r1 j( z# t3 ~: {- f+ h
FontGL font; # o2 `7 ~% h2 {; W( \
void initial(void);
/ Z* K2 q$ Q) l7 J6 a) ^% Z2 c# fvoid finish(void);
: T! J7 A. ?% zvoid draw(void); " l! o! A5 w9 f. a. D7 [; N2 g
}; " z& t& H& C( s) Q) V, [- l
void MyTime::initial(void) : s$ z5 h0 e% M) t: P3 `
{ & U8 }6 e. }9 W# C; `
// 載圖 初始字型
( y3 g  N- V' Q( C) Q% E2 Lfont.InitText();
9 h! A& B3 L3 d; QglGenTextures(1, &Texture); . _  b; L1 J" y( w+ i1 q2 o9 c1 g
} ; e5 S1 ?5 X+ `+ W
void MyTime::finish(void)
* H/ j) u  M$ C% x1 q{ / G8 x. ^5 L3 @5 Q  {( Z  }2 z, r
//釋放圖形 字型資源
: i) H* O$ u( g: E. h, n}
' a# c# K$ Z) j2 F; q7 j/ R5 j% Y- Q) w& D: y8 j. E' _6 _
void MyTime::draw(void) ( d+ m  N* v" b2 y; a( E8 \
{ 7 v3 s6 w- A3 q0 Z& s
// 顯示現在時間的字串
3 Q6 Y# c  w. M- ]1 Ufont.Print(......something...);
% O, J) m4 B3 G; [- c: j# [// Buffer For Object Information
" b$ u- L0 M9 E" v+ E; ZglMatrixMode(GL_MODELVIEW);
% U& h, M6 I& }' W  ?glLoadIdentity();
$ M+ O3 ]3 d; B: v8 a6 wglTranslatef(0.0f,0.0f,-1.0f);
4 c8 Z8 n' K2 j8 i- V$ k9 YglBindTexture(GL_TEXTURE_2D, Texture); ! ?) d, I* _0 n; p  g  k/ u7 p5 O

! e/ @! g0 e. _! A..... DrawSomeThing ( ]3 ^; y/ r: `$ ^; Y- i

, |" _: b7 L2 ^/ U$ j  {} : T; n1 g& w9 V3 B
; n  S6 e& k- n; N5 p

) i) W- z2 |9 P  r( f1 f+ d7 j" T) h$ CMyTime time; ) x# i2 ~" F* i( T3 {+ `
void WINAPI wglSwapBuffersCallback(HDC hDC) ) q+ H$ x* V6 c. q$ D
{
9 q# W9 E; e/ Y% u. Ytime.draw(); : w8 m1 d' O$ e2 R
wglSwapBuffersNext(hDC);
0 D2 A, N( i+ m7 I1 R5 q} 3 @! `" m3 ]) B' W0 v, Z
1 M  q- R% e& e" ~" @
你只要掛進去前呼叫 time.initial();
2 w9 s( o2 {8 h3 t/ e, a結束呼叫 time.finish(); + ~% a' H2 E8 E$ [7 C7 ]% ]0 B+ u" {

) k- s# B) Q8 ?' a( m; Y5 {4 i: P; F0 @: S

4 i* B. Z) v- x: z, i' g1 U
- s5 I$ l- ~7 J# b2 ?. c, L6 l) B作者 : fushunwu(fushunwu)
9 f! I% o3 z) k8 ?7 Q[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 1 y) Q2 ]! A) R6 A  i. q
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
! B& |+ B& W; K3 F3 O2006/9/7 下午 04:19:31
! q  o) R$ S0 n) u
) O& |- o1 s" T謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ 8 C8 v. E) T# a7 r- [- o

4 _' u9 F( h, Q5 J3 _! g8 A( E  a(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
: F7 g8 I2 ?5 L" U" `' J時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
2 H+ q9 t% q; W: Z5 h9 d/ u$ s像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. . g6 Y3 b: ]6 \, z1 ^! K8 h
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
1 _5 h3 W6 {+ X2 |# C0 @" k. V; T$ P8 {6 @  |$ H7 {
2 x9 \. e* C, V
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut * x* C3 V* w+ g+ {5 d- E
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
9 _# O6 \3 t; \8 }這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
% C- m6 d0 ~& O" Q& a) Z+ p9 y! K6 w5 A7 ~" n5 t
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? # G, t7 ^8 z! i2 X. L! i
% H+ m# h  R! x

$ n) M) y, H! z- |+ t
7 ^5 o4 i* X& r
& V5 x5 v1 L  t% f$ C6 J
% h3 A# U& b# _" H0 n& x9 s作者 : dorkas(aming)
- _( f6 m! k8 p' ^8 I[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] 3 ]" t( p7 y! _2 @; u  K# g* i* Z- ^
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] . U! |; M  M- m. X" d$ ]3 [
2006/9/7 下午 05:31:01 2 S6 X, v( F' `# C7 V
( u' m1 B8 K* X5 i
1&2 2 T( I3 ]  }, L2 A
我對OpenGL不熟... " s, R' k! G! W( l
0 g  M5 |# q3 ?1 G- E& R9 }) j) c
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? - v7 O1 {. t% G
4 n/ X8 y" Y. ?/ b* W

9 Z7 u/ R! J3 p: t. D( t初始跟結束都是做一次的就好了
1 s3 M# I4 c4 G* m* {' R你高興要擺在迴圈裡面也是可以 0 j" F& s6 R( g0 P% G) L9 q* T

2 S" H9 x) v( G+ E1 H程式的要訣就是 起 承 轉 合 & M& a5 c7 k9 E' G8 ]. ?
initial
8 W5 t) s5 j" S. J0 @, q, [upDate # o% ?6 X7 G  p$ \; X! n
change
0 O+ M& \, h( M$ }' i2 n9 y- dfinish
% g; m0 I1 r& P  x/ V0 q# S; |2 f物件也是起承轉合 , a* s4 ?. P, Q* W
函數也是起承轉合
6 ^* x8 k/ g7 ?. _2 B4 Y迴圈裡面也是 起 承 轉 合 : U1 t) b7 B5 r, t

8 f" D0 P1 F; K6 K/ k" _4 |1 S' e/ J
5 {+ \& Z* w' o6 D# ?8 gfor(起;承;轉) 7 E1 ^  f+ G0 Y$ ?; C% a. W
{
) g  ~6 Z9 x, n  U4 u; ]
: G' W' E7 Z/ |
# {+ R9 B1 q  Q* m! R2 U) O* N/ a% k* k4 `7 T

- d( B$ j5 g, g7 Q8 u} 4 G$ @4 F- d6 F* y9 D8 u2 ^

: _+ K$ J* r+ e) f& i. }1 T; [  u: D: k: c) O; ?% X
只要你分的清楚 屬於那一塊的性質就好了 ; ]. ~$ x/ V+ ~! ]  H
$ f; Z  n: D+ t4 Z. N, L' _& u

* P' A* }5 Z+ @+ J' x, B& ?5 U+ r- b3 v" I8 U' ]# q0 L) y3 \
' Q, d) j- X5 j) D* K% U3 G9 c

& J3 B6 m2 D9 A  ]作者 : fushunwu(fushunwu) ! ?' E, Q% r7 ^" Q2 T9 g
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
8 j2 [, C! C  ~[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] " _/ j+ P$ d7 s9 o% s7 Z
2006/9/8 上午 10:32:26
3 V, }% p) X/ r$ z. G: ^7 m& S0 K
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ ) T7 |3 b6 D! w& A6 d: d
% F& I0 Y' b0 L
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
( i+ J% Y) ~$ E! g: {: Q0 H所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
4 G& E# i& V1 z" [我在想是不是因為座標還是矩陣的問題 ? ' p. ?3 i9 i7 ~8 {

; W7 |. f& I' a4 V3 o但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
1 p" Q# @8 W$ X: k! @+ f" A至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
% F- ?! }$ p7 r% ^+ c2 n, d, a) ~- \8 T( U8 {; i2 ?+ U
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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