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

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

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

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

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

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

solidji5 u% ^) n( E9 l& U2 h+ j6 E3 {0 ?

0 s  I9 s; y5 H' F5 v 你好,先给你安排一个小任务,这个任务对你来说应该很简单。4 T9 N$ P  \# y8 {: a
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
% r$ `7 F" K. X  b: ^  Y+ I: _3 s$ ?. C2 K
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
: H# O: n9 [* [# c# |- E  v 但是比较复杂,我暂时没有时间仔细研究。* _" ?2 R3 `, a* w% `1 i
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
. J* \; G% Z3 [6 v 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。  |9 V- K) C! a
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
* h* c3 ~4 Q) B6 @打不开页面,我搜索看看+ @& {0 r4 s0 L7 Q$ G9 _" k3 c6 B
-------
5 w/ V2 q5 Q' K. z- f哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号" Y! d3 y. P4 t# J5 r2 o
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
% I) b# U. Z/ k  r; U; X3 t2 F: e6 @通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_% v) ]; t! X1 b' F
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作. s$ |' R! w* b# @0 [9 X+ h

* W0 w  q( p+ x4 T命令行输入0 _; A% s0 m9 t$ T* [. ~8 X: F
dllproxyskel.exe <input.dll>7 h3 \$ T' \1 ?4 ^" n
- open file D:\\项目\\dllproxyskel\\input.dll
. A& v* W( U6 Z  % _! G2 F  I6 B+ [! ^
3 v% U/ `) Y5 i& K4 Z$ d
------------------------------------------------------------------  u; {. s- w1 a* S* m  `3 t
我们需要额外添加的代码
/ Q9 I7 O6 K* ~) p#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
. d, _3 Q) j7 u3 q8 {//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
6 B- K/ K1 f: \* r" |2 w. K//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值$ c4 X% F8 ]$ X4 y- R( D% E
CALL_FUNCTION2(BOOL, ExtTextOutA,7 W- `% n2 x* J) K: z* |4 |. c8 d
              HDC hdc,. y; z+ Q0 ?. s& e0 D  I
              INT         x,: m$ ^5 S. ~6 [1 m+ w
              INT         y,$ ]% O( K4 ]' l4 H
              UINT        flags,  w* D4 K9 q& g8 e) L; Y- i
              const RECT* lprect,$ b% h' v6 ?/ q1 F1 ?
              LPCSTR      str,
7 L7 H4 C% E. e# f- L              UINT        count,# [7 f% U1 u. i. @) _- [+ A
              const INT*  lpDx
& O( q$ l/ g4 k1 L: d, B) {
8 Z7 S' _+ k+ e" T  {    //这里可以做任何你想做的事了,HOOK成功
1 P. @  ?& H2 F7 x" [, n2 X' h    outputdebugstr("HOOK ExtTextOutA suscess!");
6 Z+ Z9 s6 k+ p9 V6 ~: ?! T       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
" l6 ^3 k: Z1 Q       return(result);
7 b$ c0 q; m* Y* c}
( m6 f# I5 ~3 t1 y3 m+ h) r. R+ a  O% `
注意,生成的代码需要用gcc/mingw来编译,+ S0 C+ m! k3 r8 L
主要是因为其中使用了gcc宏扩展
: T9 [- f( ]# N4 J#define CALLING_CONVENTION WINAPI       // default for Windows DLLs$ q# H* _  Y2 h1 A& I* w
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\' Y9 K1 v  e% N3 N
        void CALLING_CONVENTION  FUNCTION_NAME(void)2 a$ ~2 k, u* ]: ?) q" X0 D
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\2 i; s$ F2 {8 H. w
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
7 |$ c* c# d  J9 V  Q, C1 n: Q5 P        PROXY_FUNCTION(FUNCTION_NAME) { \\; U% [1 l) j* M3 H. D
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\% h& N  h, q) ?+ l) ?
        }# }! M( U( W* k9 Y" d- O0 V/ c; Z
#define CALL_FUNCTION(FUNCTION_NAME) \\
1 Y8 U- i( u+ ]9 d3 E' K  u        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
$ n$ \. [( N& Q8 g& |, F8 a! I        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)- A1 |* }5 O, J. ]4 O7 W" Z
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
% e2 x+ N; E: T8 U- Y( l  J( n        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
  o  j. Q0 w6 Q" I/ g        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)/ s, p9 V  X* b; }  S
) Q* O/ E7 u1 u  ^- k- W

1 X! a& w- @" ?7 D8 B等我回头翻译到VC里
& c+ B/ j8 e7 t" F& y+ P- O: }) Q' `待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : , P) C6 T; E) e. G' c
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 * _6 P: E7 z7 p
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
$ V4 Q, U% J* |2 p6 l

/ W& r3 v6 D+ l; u1 owindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。2 s+ X: _$ z1 z8 _9 ^, O4 f
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。# g2 M- |6 x6 x1 y5 ]
4 u) M, e% ?* {6 D3 R
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?0 X' w4 ~9 v% B; j4 y4 V) Y; M: r
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以0 |( k: A! \9 X& G, w
9 p9 C3 h5 f& h
这个我可以试试看,蛮有趣的
( t7 ~6 c4 Z/ c3 C+ t9 n, w是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
3 u& a" }5 C7 Q# X" ^7 H因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
: H2 u! o5 I- [- l7 i7 ~* l& \; e" x无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"3 ^3 }# r$ _/ F0 p- A( U- `8 F
2 o( ]: R  ?1 A2 m, h) D
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
5 y& f/ U$ }" x! j5 q. z3 z& u3 E- N哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
( Z5 ]) |" K" U; Y' c3 A
2 e  M" k% |9 A9 C: v0 n& f5 @这个我可以试试看,蛮有趣的
2 {( |/ \- P+ {3 t# }1 d8 v是用hash链表把中文字"归类"吗?
( U* Q5 b, r8 i# Q) N& B5 \; S* E% e8 c4 `3 s5 V
.......

+ M$ f; s1 h1 V6 N% @! _
/ z% W( Y. @: X2 `# E最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了5 R" j6 U" O* |; v# l; t
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA6 V* C( {2 e* q+ N5 _  g
所以无法通过 #define _WINGDI_ 来取消重复定义的问题0 P. }. b4 D9 s1 O6 S( a" Q
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout5 R3 N, n2 g8 U5 `
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了" d- o* ?+ J! C7 }
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦3 u1 Y( V9 U4 G  A7 y
1 V- F% H  X! x8 W! U
我想的解决方法:
! B1 v2 e4 w- A% b- ^2 B1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接/ G5 _7 c( I3 F8 f! h
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
3 s+ J: N( P' @    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
6 m+ i( @, T' j5 _+ D         DECLARE_HANDLE(HINSTANCE);) `. |/ }- h( W
        typedef HINSTANCE HMODULE;
9 q! P. R$ _! W        DECLARE_HANDLE(HWND);& m4 c; f. ~# Y6 R- C
        #define LPVOID              void *
6 U1 n+ Q7 f2 A- e; e' M        #define DWORD               unsigned int. c. B& e6 o, A0 o
        #define UINT                unsigned int
% F8 y' y" Z" o' C* V$ R        #define LPCSTR              char
# d% Z$ r& V( A5 c: Y0 ^       #define LPCTSTR             char 8 W* g  `- f5 u( k  Y4 V
       .............像这样用到多少自己定义多少
, p- `! [( ]. v5 g/ K" a% O" a# U$ n0 A+ U  h9 ~7 c
3.改造def,使用函数转发器, d9 ~5 W7 ]( a9 Q$ o
在.def  文件里转发,
1 f3 W# x' G: s' f6 \EXPORTS# }$ R% }% p: m# _1 m: C; L
  AbortDoc=myAbortDoc @1
/ X1 K7 o3 U4 E3 D  AbortPath=myAbortPath  @29 |6 l  I; ]3 t. @
  ExtTextOutA=myExtTextOutA @222
) n  o2 e7 w  h& ]然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA ( L4 C! L% p1 u, v$ H+ i
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了3 |. v, E; b! L, ]

5 _) F9 i( u  ~0 G算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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