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

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

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

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

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

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

solidji# n; u& a$ [0 X% ]. m" @

# E6 D; {0 [. y# ~3 Z4 T# ~7 a 你好,先给你安排一个小任务,这个任务对你来说应该很简单。% o% g1 W) n. F* l, {
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip! |. d# {% |) K5 E" J8 p* j$ A

7 z9 d: \) Y- e+ c- E 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。8 Q3 ?0 b! m  a1 v3 o( P: V3 w2 T
 但是比较复杂,我暂时没有时间仔细研究。
3 d/ T: s7 x" }' X$ }$ J 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
3 X* m" ^# d1 p 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
# L" w, R8 }1 B/ \1 }    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
/ a( ?9 e' W: B4 h: N6 h3 H: s打不开页面,我搜索看看
; w, l; n' H' @, `% b# G-------
1 ]! ?  g0 S& ]) g* t$ w. Y9 h哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
5 v) }3 r! p& q4 F# R" ]然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
/ G* [! f. b) ]5 ?$ Y6 P通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_  e* D1 B4 D  _% i8 t/ D
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作4 l3 d1 S$ Y6 N
+ p! j) u  T$ f) g3 o2 l. g
命令行输入4 o1 g) o7 a: z# z8 G/ u& h
dllproxyskel.exe <input.dll>1 x7 n* M0 f4 p
- open file D:\\项目\\dllproxyskel\\input.dll
! m% w6 w: E9 u  7 G' [- a( Z( [; q
  @: A2 @( _0 f$ I! |: N& `
------------------------------------------------------------------
% K" D, S, p, c9 P$ Z4 C- V我们需要额外添加的代码
4 U* i/ s  B9 s$ v$ ]8 ]! a#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
# @  ~% h  R4 s% e" x//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2' k7 y1 N4 t/ u5 C( ^4 R6 O. D
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值* j* U$ @( D/ \
CALL_FUNCTION2(BOOL, ExtTextOutA,7 b4 _6 |* \  m- u8 c2 `; A
              HDC hdc,. a/ k& o5 Z+ f* G# J
              INT         x,! s/ a  |# }0 D
              INT         y,
- G5 n6 T- J9 o. o              UINT        flags,) b# s4 G" _/ U8 B# o4 g
              const RECT* lprect,
. s2 A1 T8 v0 {7 x# x9 M2 n              LPCSTR      str,6 H. o! J7 Q. m" k
              UINT        count,
4 q6 x; i5 S. M) {2 v              const INT*  lpDx
1 h; @( G8 J: A9 O) L% I! k) {% `% F- F0 J4 Y
    //这里可以做任何你想做的事了,HOOK成功) t! i9 h1 b4 \- Q0 Y8 d7 n
    outputdebugstr("HOOK ExtTextOutA suscess!");
8 R9 F/ B" x6 y5 b* J       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
. o5 ?" `+ f8 Z' `0 t+ K1 Q       return(result);& n+ J9 Z- D  y7 u* p3 u0 h3 m
}" C- E. Y* c$ n
- v% F2 {8 y) n5 ~" f4 ?
注意,生成的代码需要用gcc/mingw来编译,
( s2 @2 @+ ~; g4 N6 b% y, X主要是因为其中使用了gcc宏扩展
/ |" p/ W4 `; o+ c3 _#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
! W( B2 B# P$ k  ~! @3 K#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
. u* q- |; [: m+ Y* E) P' }7 I2 ?        void CALLING_CONVENTION  FUNCTION_NAME(void)7 R- i* v) X+ v6 r7 i8 c
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\& L8 W4 f/ w7 Q
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\: a# B( r* i+ _4 P. i& I6 A
        PROXY_FUNCTION(FUNCTION_NAME) { \\8 X' D7 [0 \$ ?" |+ N
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
/ Y' ?, P2 m, q4 R( A' q, O        }2 F5 D$ Q* o5 A  f
#define CALL_FUNCTION(FUNCTION_NAME) \\
) Q' \) O4 r4 L        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\5 X! c: l5 K7 S* R# T$ }
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
* N: l0 x/ U2 b- M% V6 l' s9 i#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\+ D6 p5 ~+ @; w$ H& r' C" h) A. s: @+ O
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\! Z) u# g) T2 l  Q
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
, _; J' t- _( N" N9 u, `8 H# x) B% J
! u5 [' M' k7 g  N2 E8 o
等我回头翻译到VC里
: o3 i/ U' t. M; Z待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧1 _; {9 h8 f+ ]0 I2 j
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : / K- N* i+ n. E3 G8 y  [% g  ?
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
+ F' ], t! }8 I% L9 Z! Y) G$ e& s那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
* l& ?' c6 u; M7 x5 ~( m! c) X
8 P% g4 @& q; J# U- S( p  ?$ c$ B
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
( J& n' T  x, {5 P% r/ j这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
$ M6 ?( K4 z1 ~# z% J( i% H5 o6 @- j( H& V
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?: u; k8 m& r, i4 u$ ~3 e$ i
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
. A: N+ o+ Q5 g7 x! |. }9 i! J+ [& r; L; B8 g
这个我可以试试看,蛮有趣的
4 X/ l$ K' ~0 B. A/ S  O是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,' T2 P8 F% V9 U/ ^( M5 |
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,8 p$ I7 d8 }. x  }  `0 {, B
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
( }& h- O+ @+ |. @
" C& m' w  N, }007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 4 `6 f+ }" W) k/ E2 ]7 k) P
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
0 q" X" {! i; `! ^+ o5 l6 P
9 g  |3 x* n7 s4 S0 u. I* a这个我可以试试看,蛮有趣的 : y0 [8 B$ s2 L- N+ a( d5 k, }
是用hash链表把中文字"归类"吗? * p$ ?/ T- j% O  `) {! d8 v' D2 z
7 G* Z* }3 e/ T% a
.......

7 a7 C$ O5 T- h1 s
7 g6 V- C1 M: m2 a  I9 [: y最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
4 c0 w+ l9 r7 q$ f$ z另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA) F9 u* v& E6 C$ T9 ]
所以无法通过 #define _WINGDI_ 来取消重复定义的问题
* [* z9 _$ ^) \- F/ O$ P说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
: j  k) M3 ^  e* P4 I; c% c可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
, y, w7 P- q2 R  g* n8 _如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦
' ?' u+ c) }: L* ]9 C' `) ~6 C, |+ B! E" @
我想的解决方法:6 O: }! e3 m8 g- N5 ^
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接' R' G9 `* M2 y* A  ~- t
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)5 x( t! K$ a5 d% S
    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
1 ~+ w  O; n0 E1 H/ D         DECLARE_HANDLE(HINSTANCE);
+ K) q, F0 D6 |( \        typedef HINSTANCE HMODULE;
# k2 A. V" P' G. {8 [% P        DECLARE_HANDLE(HWND);% I0 m" G7 c$ t
        #define LPVOID              void *
  d5 I5 C% g( l- l$ `2 U        #define DWORD               unsigned int
( S; R0 t) x; \; `! I        #define UINT                unsigned int
; g3 i0 {3 d& r8 c7 j2 w        #define LPCSTR              char3 U3 e! P# M. V# ^% l  w: q
       #define LPCTSTR             char $ A! l2 V% Q# H) V- [( ^. @. S
       .............像这样用到多少自己定义多少5 ]0 [  w! Q7 T: r

7 c% D: a; a$ d6 v" ^3.改造def,使用函数转发器. E$ V% Y# G3 x0 s. j! r
在.def  文件里转发,
5 D: N, ?" i" R) JEXPORTS
. `( X9 a5 b0 {, a# ^5 Z+ o9 j( {1 ^  AbortDoc=myAbortDoc @1
2 @( `# F* ^& \- j# |, e  AbortPath=myAbortPath  @2
3 m3 z3 |5 S1 \  ExtTextOutA=myExtTextOutA @222
* x0 Y; W1 v  t, @% v7 G4 F然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA $ T* B% Z3 f: E0 `' W, b
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
4 e3 A4 R+ M/ q+ @  r1 N5 ]4 \4 J3 O8 a% h% u+ B* r: y" _* ^8 T
算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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