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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 $ C3 Y6 D' L; s* d8 n& V/ [
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

* E- g  f! S. M$ _! @6 I4 v! s* K
: ]1 ^5 M. L8 ]& H7 O8 W' O7 N7 z6 o  e  e
原文 5 c4 l% ^7 \4 Q; R) m8 V8 b
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
3 B& e6 _; I2 @( a' f3 K7 m" x9 y* t! [/ D
大家好,
1 T& o9 z$ X  ?& m3 G& W4 M  ^
4 D+ @( e' ^+ V. Z+ o我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
4 Z/ v; g5 D# ?/ g6 V, W3 B,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
/ v; |. E; n3 S. @  P/ Z3 Q$ K
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ' T* u8 D8 ^0 o0 Q0 S1 E
但是BMP圖放在wglSwapBuffers卻顯示不出來 * q3 D9 l; F" ?# P# v) X0 K! @2 \
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
9 l0 c4 g. r$ M" k( ]& x3 Q" Q! c樣的時間字串 # b& z9 E& I1 O* {! u

' f- l3 N7 s6 [, X. U
0 l6 \2 P$ t+ t
* C. `3 U. ~* `+ X1 P0 n0 W作者 : fushunwu(fushunwu) 6 _; U9 K) Z' j: x$ z3 `" V/ ]6 D' B
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] ; `8 M- _7 ~( U- [* o  e
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 C! D* [& [, a$ E, Z/ C( m2 Q% ~2006/9/5 下午 03:21:34 ; l8 I( Y* a" ^6 i* T
; x. E0 `' {8 f) U
sorry,按太快還沒打完 .. ( m$ P( |$ i5 y- P8 V( N7 H
* O* j3 m; u0 Q$ o' L7 z2 J
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
4 e2 _% c' K3 u+ f8 y6 @, r+ f, E,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 0 f; _7 X/ s: @6 p- e
$ J* A; s- P, j2 z4 J, _  y
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
" x3 i/ ]5 w1 K4 q(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
5 M, J3 Q9 }$ q1 T/ v( q$ m, ]8 K0 c" O$ O! ?7 V. I' t% b
想請問各位高手,有沒有一些好方法可以解決 . 8 y% n2 I% `3 d$ A
+ l! K+ Z! i5 O; p
下面是我hook opengl API的code :
1 t% M9 p3 w7 m% v# u// hook wglSwapBuffers的code; hook glBegin的code也一樣
" v5 f- a' y- [) @) Mvoid WINAPI wglSwapBuffersCallback(HDC hDC) 4 R' X8 G; e3 N
{
6 v% m6 P' v) \: N! L) {# d. _, r, d& D  T" l/ M. b2 l& Y
if(!ininstializedfontshit)
+ W, r4 g) l) ~{
- r% y8 H" [0 u! U7 G4 cfont.InitText();
' U! y+ t" |9 |6 Jininstializedfontshit=true;
: `( T3 _- O+ o( [} 9 W4 Z' Q: q; i2 b3 {. J: r5 V
. X0 [" z" R7 J4 C; c8 k
SYSTEMTIME SysTime;
- Z9 }9 o! D  z! B2 Q+ EGetLocalTime(&SysTime);
3 E8 E$ e/ d9 L* t3 FglPushAttrib(GL_CURRENT_BIT);   q! `9 b2 `. Q7 ]; [( I
// 顯示現在時間的字串
. V6 d* O7 U+ }7 O: _/ d  sfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
8 C. x9 ~5 s% c! k/ ^( m
# w( I$ j% h- F! p// 顯示BMP
9 n6 f/ P- W- k+ `) ~& t( G' U
# |; J) I- s+ [; h" I, Ibyte Texture[]={IDB_BITMAP1};
) s; G' p5 R) A' ^& @glGenTextures(1, &texture[0]);
" Y, e9 v/ k! w+ dhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); / I8 T1 P& U; U% m' ]

4 Z, W/ E# y$ A: V+ s# z, P2 N" b! Z  a" iif (hBMP) // Does The Bitmap Exist? ' u( D1 ~2 M% @2 T( N3 W- Q& M* \
{ // If So... 9 M8 n( I+ w% Q: w1 w$ Y
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
: \2 A$ b1 T6 D4 ^9 A  |// sizeof(BMP): Size Of Buffer For Object Information
- h' {  B# y6 r// Buffer For Object Information   n6 {- A$ c. l
glMatrixMode(GL_MODELVIEW);
+ P/ J) o% U4 qglLoadIdentity(); + _6 T* P4 V# E7 l8 N6 d
glTranslatef(0.0f,0.0f,-1.0f);
* L" [' A5 B4 L4 Z* l) ZglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); - s1 B& O, l: a# `8 y) F
// Bind Our Texture , L: ~% U* a/ y& ]- m
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering   @5 M9 x. B( {7 o, Y# P: u3 ^
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering ' W  u( w' z. g- Z! ^' T' Y
+ L5 C( O: z) x, x4 I
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
0 D- o5 {/ ]5 u: V8 {DeleteObject(hBMP); // Delete The Bitmap Object 4 d4 p" W1 h0 M
}
& x) g" Q4 ^7 W& M# GglPopAttrib();   u- C4 v* t2 B* r) Y/ u

3 j, q7 x- l/ A
, `: z8 y+ U) f5 T} % I( |$ [) j1 I
wglSwapBuffersNext(hDC); 0 a, o& w: Y+ ^& k" y$ {$ o' k, d& D+ b
} ( Z4 H9 [# z* U+ p1 S# S; _- C0 [
0 V  B  N& V& [7 V

# w4 T1 Q' ^0 z" z! f; g8 J  W- c; x" P! y% z3 e

5 ~/ u* |4 y! l  x1 w) ]3 ?0 S# J, g$ y
4 d. V2 h0 ?9 o* Q
作者 : dorkas(aming)
0 U: M' g/ Z1 Q& R5 G/ T[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
1 w9 o4 i6 X9 i# G5 f3 z[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] , E( H& V" O8 P4 ?7 g8 ~
2006/9/7 上午 10:30:03
# [" o4 W9 H$ y3 z2 n$ E! ?  c( {; Y
8 l! q3 z. u& S1.貼圖動作錯誤 0 q- F% v0 [0 ~! C; `7 I

: i7 S3 f4 g  a+ a8 f4 O. F2.
) k5 \, I' j4 a/ p) L" X每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 7 V& E  s; _! J* H! r

4 Q8 o( Z* _- F, ^/ ]
/ T! C9 u) y' ?% M: ?/ n: I2 zstruct MyTime " w4 D1 L8 _( }% T* ?
{
* L( G4 C& L2 A2 e7 rbyte Texture;
' n6 V  h. ]- |3 Q2 h* Z6 kFontGL font; 1 P' N. w( M  H8 [7 T2 b
void initial(void); / @% [# T! [- V7 [# y0 F8 z) j$ n
void finish(void);
! A) I' M, U( n) _1 uvoid draw(void); ) Q$ u& e+ Z# t* v# t
}; ; m* \; ~* g" L- S- u8 i
void MyTime::initial(void)
8 H( f* ?0 X9 i# m: ]' z{
9 O/ u4 M0 _9 Y0 M% i+ \! p" R2 B// 載圖 初始字型
# ~: s& S$ a5 I" V& G4 ]% Tfont.InitText(); 0 l9 w. V! m. s
glGenTextures(1, &Texture); $ v) U6 {# d& ~' J6 I" a5 m! z
} 0 d  E# q" O, u* x7 M! @+ \7 f
void MyTime::finish(void)
5 f. N, J+ J" g( c1 r, D2 I{
2 y0 Z" d  A% P: A//釋放圖形 字型資源
. a1 ]: s( I. c. `- w4 E}
% a4 ~) }8 w6 ]9 R/ m0 Z) V: f# z/ V) Y( q- s1 q1 Z
void MyTime::draw(void)
! q. O' q0 l" U/ T2 k# U{ / N6 ]& b* {" m# [! @, _( i
// 顯示現在時間的字串
6 U- G3 }/ A: T( Efont.Print(......something...); % f' u7 F& i- w: J
// Buffer For Object Information
9 j$ y) P! X. OglMatrixMode(GL_MODELVIEW);
! P+ F+ X/ _$ F) P$ r' H+ lglLoadIdentity(); 6 k( R6 |" ?- I2 R
glTranslatef(0.0f,0.0f,-1.0f);
+ N2 Q+ e: Q; V( B9 e7 SglBindTexture(GL_TEXTURE_2D, Texture);
- |2 s4 O& {0 N# o) s+ @2 g
- t2 h+ K/ K4 W" r" F! C' I2 M..... DrawSomeThing % d& j' J; t# |. _& J: M0 L

* _9 P* J1 @( o( M5 K} " K( o9 _: M* T( U

2 ]! L1 c: R. l6 m1 T: u2 w6 q( s
- \& T8 {+ d# h# A# E: J& \MyTime time; ! N. L- t5 U. j! B1 g8 d
void WINAPI wglSwapBuffersCallback(HDC hDC)
% g$ q- ^  I: r8 @{ 2 v0 n* M6 A% N2 G- N* w% \
time.draw(); - f6 Q9 R2 k! O2 o0 s# z9 t, ?
wglSwapBuffersNext(hDC);
( v8 v* C" r# D9 }6 U} ) ], z) N. ~5 I

* r6 ~( |- t# M4 {0 W! n" v你只要掛進去前呼叫 time.initial(); 3 V0 ]3 s4 @0 a* b4 W* z
結束呼叫 time.finish(); 3 X+ Q8 a6 V& m% i5 `

$ ~# }# \8 M$ y; E
% n5 M, U7 s- }7 K& [* Y9 \7 O# y7 S+ s8 N4 U% \9 \) m; A) q

, \, B6 U. {( m/ ]' f7 c1 h6 J作者 : fushunwu(fushunwu)
' P7 F# |% t8 `4 K! [* u4 I8 a. q[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
( i; C4 j: _6 i[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 2 c9 w+ s, v- x- K
2006/9/7 下午 04:19:31 0 Z0 U3 I7 H- l2 c! N9 c  k

2 Q" x. R  c2 L" ?5 B謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ 9 a  D( D  N0 g9 _

( h* g0 q2 r4 F. A. K8 i(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 6 O4 o7 T& @! P6 x: W5 s' R+ s
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
/ b1 \$ a3 G$ g% _像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
6 [( n  o4 o3 V% n6 R所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? + S! z: B7 {  A; f
4 ~) a3 p4 s8 l( {: d- i6 y, Y) m
# _/ A7 ~# `  m
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut # j2 e( V' O0 f1 D/ ~# D3 I
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? " n% h; E+ I; p2 o- G& [/ s
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
1 I: \" s8 x+ o: ^' w, C" N4 U+ E8 W0 f5 M: ], J
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
  \3 J$ U4 k; f- ?0 H- y* w$ S1 F2 Q# d, j) ]$ h
, c3 a' `4 ?& Q4 Q& Z; n! U5 O: {

0 j' x6 E3 W1 @0 ~# a  B  `2 M, E% X% y5 k. n7 f1 w: X
8 I3 p1 |* _3 V, O3 D3 J
作者 : dorkas(aming) $ a7 D# k# z" K! S, ^( Y
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
' y) ~% K" C0 C[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 3 G% `' `' ]: X: s# U& P; C
2006/9/7 下午 05:31:01
  z2 u4 \1 X4 Y: f& R9 C6 X
' B! H) D& a- {3 a1&2
; ]$ D/ g# P# N- H5 m' ]& d  b我對OpenGL不熟...
3 o' {3 y/ T& ?7 }
) j! {' M8 O) C' ~9 I5 {3 a! {>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? $ A* ?+ E4 I) Y7 E; h" y
: @% ]) c/ N# g& J3 T# M

! n) S& Y$ O& p初始跟結束都是做一次的就好了
0 b% W/ \3 O! `3 w# X3 [9 Z# a你高興要擺在迴圈裡面也是可以 0 D" r. N& G# k0 L" e2 g
2 c9 p! y! N* n+ R
程式的要訣就是 起 承 轉 合 8 |- P, s9 B: F. B) l  t
initial * U' Y2 ?' x: K8 w
upDate
/ y5 w0 m3 z& }) }9 `$ @8 R8 b& j2 uchange
! I8 j5 P7 E& u0 s' t0 u* ^- l: N2 jfinish + D, a6 A6 K' y6 D8 E* }( @# [
物件也是起承轉合
) Y( `# i7 B) T4 X2 w函數也是起承轉合
7 u/ a  s) E4 I  y迴圈裡面也是 起 承 轉 合   ?6 ]' y. ]; ?
- E) N6 G( Q. [' a, r3 x" M

% N0 C& g% ~/ z, Cfor(起;承;轉) 1 b8 V' [2 e) O# K
{
- A; U$ H* r7 D7 a
( k* }) \0 n$ O2 V0 v) e$ A- d& E, o) k' j/ `
6 s4 @7 }$ ~8 N! G
) C, h2 D! f* c# A6 V1 a; O
}
6 \7 m9 ?$ w' C/ ~. x. T8 Y" W7 ^2 k% B1 b8 ?7 p
8 e/ g/ t: x* z3 W
只要你分的清楚 屬於那一塊的性質就好了 " G- X4 R+ h0 E9 G% D" u0 b) z, W

( c! s( D+ j1 s& k/ E  o# \1 R$ T1 X. p1 c& h8 Q

% a: x) g( j4 L7 {; m% y  s# r$ U& ^, g& y
  z, o. U. D" b$ v8 Z
作者 : fushunwu(fushunwu)
* @# g4 r: \7 A# x4 o[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
) t. a- S3 c7 }1 C[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 0 P8 u6 n1 O' c& E' G; S) p3 ]/ l
2006/9/8 上午 10:32:26
! N. {; g0 e3 Y
; N+ G4 ?1 }  \& H9 F. n恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ 9 s9 q5 I( r0 V+ I( o

7 U; O6 P8 N: U1 I: V3 [* B. U像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
+ j. C+ }" W6 D5 b+ }0 \/ l所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 8 e, K7 S$ F. x( Q9 Q; \( @
我在想是不是因為座標還是矩陣的問題 ?
# @1 ^' t& z+ Y2 R/ l* i2 _4 n) R3 {
: C1 v; d  [* C但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? # I+ j  \( M; [0 p" w
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
; L0 U% L4 B# x, y9 L7 e/ W  m3 f% u" {  i# q+ z5 j
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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