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

汉化任务 GDI32.DLL的代理DLL(solidji 请进)

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

[汉化任务] GDI32.DLL的代理DLL(solidji 请进)

跳转到指定楼层
楼主
发表于 2010-4-9 20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

GDI32.DLL的代理DLL(solidji 请进)

solidji) F, B) J2 E. z9 H8 O' |; P9 w+ }

- k( A3 j1 a" y$ S: e1 z& w 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
  M: r0 T- Z5 r7 S( B9 ~ http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
# G8 c2 g3 L+ E& ?7 w
- K/ i, ~* K* j6 X$ Y9 u5 u! ] 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
  k; F" Y, A1 n1 t' m( T  B& G6 l! x 但是比较复杂,我暂时没有时间仔细研究。
* Q$ t: f' W* r4 L' s  o" j 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
" g7 ]- q/ w0 Y- \/ Q( _* ~) X 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
5 q0 _7 L5 c9 p1 m2 K    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2010-4-10 20:41 | 只看该作者

dllproxyskel.c

显示AlterVista
, I7 L* R7 A1 Y+ u打不开页面,我搜索看看
$ p( m$ E! F) O" ], h0 k-------% C! N" l* A# l- q9 \
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

板凳
发表于 2010-4-11 00:55 | 只看该作者

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
' Q( k# G' J/ a! ^7 i然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,5 y3 H0 g& D3 \- O; w* @
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
$ I9 t* B. h! m0 W! M% h9 [9 [+ u比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
) _9 A5 U- d, q1 c1 r- ~+ P& c+ n  C5 j
命令行输入& n* j' C1 V) Q$ u, |7 Z
dllproxyskel.exe <input.dll>
& J3 ]2 U7 @9 @$ I9 W- open file D:\\项目\\dllproxyskel\\input.dll2 a- d, C* v- i4 D5 Z$ @. J
  1 D2 k1 x# A1 Q9 B+ ^5 I

3 ~- P0 Q; }3 q+ K! U$ |% z  w------------------------------------------------------------------' T# _& k* M0 E2 s8 ^" z
我们需要额外添加的代码1 F' q+ G! B/ V6 G# F9 |
#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要9 F- G9 x, z" O8 \- J0 T9 E! d
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2" x& P9 D9 t& K
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值; Z6 a8 v7 O) h2 p5 `
CALL_FUNCTION2(BOOL, ExtTextOutA,) I3 D$ E$ l: n. m/ v0 f
              HDC hdc,
9 \3 P1 w- ?7 h9 d& [4 _' a% L              INT         x,
# Y. N: I4 f* ~. g              INT         y,# o/ |# ?& m2 f/ I1 L
              UINT        flags,3 q5 ?, M6 B. y0 @) C3 T0 ]% u
              const RECT* lprect,
" D) e$ L  ?+ Q* X              LPCSTR      str,. v; e' {" b( k# c+ M
              UINT        count,
" O) ?4 C+ {; Z: L- y" P              const INT*  lpDx" ?1 z) J; G8 b8 N* j
) {
8 j4 W% H8 w( \    //这里可以做任何你想做的事了,HOOK成功1 {8 k+ q9 i- ?3 L3 T) K2 d
    outputdebugstr("HOOK ExtTextOutA suscess!");
) n; F, g2 O- t' h' b       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数/ T6 Q& G3 ^) x' ~
       return(result);
# |. x& p; E  ^, w; z0 U}/ i# T8 Z$ d7 D( M6 M
# i% B& _" ~' ]5 Y; Y
注意,生成的代码需要用gcc/mingw来编译,
& Z  W7 {6 q; j# K! o3 |主要是因为其中使用了gcc宏扩展2 [) p. m( _2 X
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs+ b# k" ]( R" e- I( j2 A( ?
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
. i* v) J' y& m1 M        void CALLING_CONVENTION  FUNCTION_NAME(void)
% [0 y' z* }" `5 ?9 @9 i6 g#define PROXY_FUNCTIONX(FUNCTION_NAME) \\5 v" Q- {4 l1 d
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
1 h" y$ {9 J+ @7 U0 W* S        PROXY_FUNCTION(FUNCTION_NAME) { \\5 Z5 r2 }  \# w+ j$ E
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\/ i$ w( `& e0 g8 X
        }
( I) F2 D$ D* A, v! v#define CALL_FUNCTION(FUNCTION_NAME) \\
  w, S8 O0 M1 V7 i4 b; @# }  R/ ?        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\7 n* n' `1 k" _6 l0 y  Y$ [
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)- \2 R+ }( a0 e1 I! ?7 u
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\4 J1 n1 ~, F9 E) g" R% }0 b* n
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
8 k4 {1 _/ o) u        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)5 K6 `& M' f# B+ f

9 D" j0 ]) J4 q9 O+ t8 H* {/ D: L9 T& [4 d: G) I/ f- N
等我回头翻译到VC里
! W% L3 W6 R4 v& }( ^待续

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2010-4-11 06:38 | 只看该作者
收到。等待你的vc版代码。
回复 支持 反对

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧+ u8 d. u: ~- h0 x- B. C) \
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
9 Z; Z3 {- {6 T/ g' ]; P1 Q哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 4 f6 S' ?/ Z" j5 g8 @6 b: q6 U! [/ Q
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
6 l% P6 d- Q! g% S( w8 O5 N  M3 j$ d

8 b! Z1 h8 G' q+ w$ ?windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。$ d1 r' n! j% o; g( s
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
3 |: n8 N( f; H6 u# ]' _% n: x) J4 m! U* n2 _7 `+ \# e' B. m
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
1 S) J9 S; K8 ]我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
% V! `) i7 j/ g
# u& T; |/ j; c1 b$ {这个我可以试试看,蛮有趣的
$ `5 O' V% c* X  o0 O! P0 q, w是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
* b! p6 f  M( Y; g2 D因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
/ A) [0 [4 C1 ]: E& x  \0 ]无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法". A  M: ~3 h$ g. [
+ {6 w6 L" P, e* h5 R: ]! Y
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
8 O# l& U6 q* e8 C1 n+ f$ a哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
4 G/ G  @# r3 N8 [8 h& H' ~2 N2 p7 A6 T
: {# O( u% R& P6 d/ I1 |这个我可以试试看,蛮有趣的
# l8 k/ ?1 w, E! F, A' a: T是用hash链表把中文字"归类"吗? 7 p$ X6 ?3 n9 p
" `3 M; q8 M* p2 t" ]$ y
.......
1 X! k4 Q6 ?! ]) ]

4 P/ l/ M# B# v' c9 T8 J最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
; p3 T- b* {5 o: N另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA8 O3 J3 I2 S6 W, l
所以无法通过 #define _WINGDI_ 来取消重复定义的问题
9 ~7 T' N; U' u* [  i# l7 p6 W" a说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout9 t& {* `& T. Y+ P/ ~, y8 y
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了2 M' ?5 M* D, f0 L6 s- H8 Y
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦# e. P. N5 o3 ~$ n6 X' F- [* J

8 d+ _2 j% H2 U; |我想的解决方法:9 g4 X) L" D, G% R5 @" s# b
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
) m( c; L: V7 o4 r8 g8 _4 `- J2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)1 A( t3 \- C, d$ H& G
    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n+ b+ {* z+ V4 u6 }
         DECLARE_HANDLE(HINSTANCE);& L! `# i) I' @" V# G6 H+ Q' \2 C
        typedef HINSTANCE HMODULE;
$ {; Q% h  W, N/ Q& w        DECLARE_HANDLE(HWND);3 ]7 A9 D& ~8 L; \% Z9 G
        #define LPVOID              void *5 L) Y0 ^  K3 L. Z8 D4 ^$ d4 v3 l
        #define DWORD               unsigned int
$ {2 \; p9 _( i* s2 {        #define UINT                unsigned int8 g# @: o3 G: k" @% e
        #define LPCSTR              char; {3 ]( ]  r2 U0 V
       #define LPCTSTR             char
( ~6 w- A8 W1 ~% E0 C  Z+ U       .............像这样用到多少自己定义多少
+ ~: _% w+ C+ e" h! i* a* |
# E+ x4 Y" O# E! R# M2 }3.改造def,使用函数转发器
4 Y6 @$ R$ l6 O4 T: S9 }在.def  文件里转发,
6 x6 G4 Z0 K0 g- `" lEXPORTS2 I) k6 t8 C6 ~5 ~% N3 K
  AbortDoc=myAbortDoc @1) X% i7 D1 l8 L/ s3 v
  AbortPath=myAbortPath  @2
6 h2 v# j$ X* g: p2 P$ u4 N* v0 K  ExtTextOutA=myExtTextOutA @222
, E  ]* [- Y' Q1 T8 G然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
: c5 y% e5 T/ g6 C  x( X你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了  P" B$ \! g9 s+ Z

; j9 y3 X2 _& I8 H( R! W& U算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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