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

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

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

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

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

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

solidji
' w8 d  l( F; F* n3 f6 x
- p9 l8 ^0 Y' D1 p8 x5 O 你好,先给你安排一个小任务,这个任务对你来说应该很简单。' f6 j. @  ]1 A- p. o6 g7 K
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip3 f6 c4 x. B! c% X% ?, S1 l

2 p! p- M( `; h/ i+ y) L- T- c 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。
/ K8 n8 u" X. S8 _4 N% a 但是比较复杂,我暂时没有时间仔细研究。5 l6 p6 D  t5 h9 X# h0 v
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,; I4 Q, f/ \- N$ ]
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
& y1 y( n0 i1 n1 [# \. t- Z: I" }/ l    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista( G# S* P+ h; a
打不开页面,我搜索看看: ?( A* W2 w, |& n
-------
  @+ c( v5 t# g( E6 f哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号' D3 Q# K. x- g  t( }8 I( M- p
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,- ?5 _% J7 j  g+ y4 r  O
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_) G! L, T* _. |9 F- C7 t
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作8 f) h; ]3 w5 b% ]

  R8 T8 _( t6 u命令行输入6 H4 S3 J* u" `/ |- Q
dllproxyskel.exe <input.dll>
: z) l' y' ]7 a' @- open file D:\\项目\\dllproxyskel\\input.dll" j1 ]) ]# Y/ j$ u+ M
  
& H6 M5 d4 c% G7 e, b
# T2 z; e0 N$ j" S/ }------------------------------------------------------------------% n8 `$ l. b$ `5 P
我们需要额外添加的代码
, T6 `; k  ]/ d" L#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
7 z/ i5 E. Y. \1 T& O& [1 a//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2. _7 S, x& o# d# o
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值
- N2 p, I- Q8 ~4 ^CALL_FUNCTION2(BOOL, ExtTextOutA,3 {  U+ Z3 ~) A5 C& C
              HDC hdc,
. p& \8 g7 `; I# z              INT         x,2 v+ {' L9 j: R8 \6 B2 ~- m- k
              INT         y,
: m# U6 U& n" ]8 l; t/ W: t              UINT        flags,4 n9 f. M6 W: c( v1 w5 e, D
              const RECT* lprect,
1 o1 B) Q  o( [! A. U3 w/ a              LPCSTR      str,2 `. t9 N& W+ H
              UINT        count,7 M) L5 G8 q# j& ?3 [8 W* V
              const INT*  lpDx
$ }7 e4 d- X( E( r0 y3 \) {
3 }4 ?6 Z+ k* q4 X3 ~    //这里可以做任何你想做的事了,HOOK成功
$ t0 y- m5 U0 k& T& t! l    outputdebugstr("HOOK ExtTextOutA suscess!");* O. Z; L* g. h
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
$ z, f. k, y- A& C* E& G5 b       return(result);) k' L  Q! `2 Z& V& }- a
}6 v9 Q2 E  ?! l& w4 W

5 f3 y1 Q) K+ k6 \' Y% C' l/ C注意,生成的代码需要用gcc/mingw来编译,
/ I  t9 c# s$ R7 r主要是因为其中使用了gcc宏扩展
( G# ?+ Y- R( \" n#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
* S8 @, h6 W7 ?) }' a5 }1 I#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
' c3 A6 f( V: [# g8 G- e4 K' |6 [        void CALLING_CONVENTION  FUNCTION_NAME(void)
0 {9 [6 L/ @& {$ y( N#define PROXY_FUNCTIONX(FUNCTION_NAME) \\& R6 k* v  O) ^+ Q0 V
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\: O4 n( [: s% r6 O7 G0 c! u
        PROXY_FUNCTION(FUNCTION_NAME) { \\& I, u8 M9 z% e$ ^; q
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\/ `' V5 L; S) z' P8 g. E+ H' R
        }' ?) E; x- `7 f, v
#define CALL_FUNCTION(FUNCTION_NAME) \\3 K1 G9 Y  _& u+ U% K; w
        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
3 _: Y/ J9 X2 W% O  h9 Q, w' K        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)" ~  g: A! W* ^; u! W+ t" Y3 q
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\' W4 G7 R( e) h. S
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\
& f, m  u) N0 R5 E  L* a        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
. J+ Y) J& u+ R  l2 H: ]6 w
. X" ~4 B  f4 M. k; I; t# Z) U
5 M8 U  g  b0 G& }4 h+ F等我回头翻译到VC里
! e8 p7 Z1 }, O6 h9 i8 v. |6 s待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
( m! c) g5 J" {( V那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
; [9 t6 w6 x% _" _哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 1 q+ \" U* q# P
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

2 V4 J: l& X' D6 q- F1 J; \7 Z1 B0 I( k, Q4 X
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
9 X' i: p6 t6 d. ~& O% A1 G1 h这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
& r! e0 J& Y& p
. Y4 E- r1 Q  \1 b. F; v对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?% L" |9 ^* E! F# J
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以8 Z0 j7 R- o* D- J0 B/ Q

, r/ f" U) ^$ _这个我可以试试看,蛮有趣的
$ W- w* i5 n( i' Y' W( x: x8 x是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,* \$ F& `. n% a6 S
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
% W% d: A( O/ k( W无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
( `9 }- V# g$ D" u* t
# V% w$ q5 \! l007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : * U4 Q. t0 \& }. R8 ?
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 + }. v5 g- Y2 l

7 I: {' U. a/ l+ j5 {! O这个我可以试试看,蛮有趣的
# ~" K7 W5 F8 m  h6 W" k是用hash链表把中文字"归类"吗? 0 K7 X! C. G# T9 g) a- _3 E

: y9 n  M( K) Q9 h9 L0 _.......
. G5 K* }: g3 i/ L) |

8 a- N. S7 }( x: @  L* T& W8 A最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
8 [+ ^6 n) a; q9 C; y% u1 W9 z6 o另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA9 s' \& r- d# y! g! y1 H
所以无法通过 #define _WINGDI_ 来取消重复定义的问题
( p! c2 _6 F) J& s1 [, {说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
7 s- W3 k4 g8 I) K可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了4 |5 e9 L5 ~7 K6 a: K6 s. l, ~
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦, v# g2 K& [, p0 l  t% I
, C9 g7 c' c9 x* [
我想的解决方法:- n7 F! ]9 z$ h5 q( A3 G/ u2 X
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
3 t7 v7 Y  s6 I6 m( S$ `1 N2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
& g, I# u/ H# j" J& D. @( z. u    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n, j4 G3 ~" v- O. ]
         DECLARE_HANDLE(HINSTANCE);% t4 L# H( ]* M4 Z% s
        typedef HINSTANCE HMODULE;! l9 L( P! ]: T4 S  T
        DECLARE_HANDLE(HWND);
* v$ ?0 i8 E8 }5 m( f        #define LPVOID              void *
; h9 J9 b1 [4 ]% n        #define DWORD               unsigned int
: y" S- F: k' k        #define UINT                unsigned int
/ D1 X0 \1 l/ I, m4 z1 a0 W0 \5 I        #define LPCSTR              char* D) _  b* V$ s+ S! m/ D
       #define LPCTSTR             char
% v2 n& p" P! e9 J       .............像这样用到多少自己定义多少
2 X: M4 u$ P6 m' C# o+ a! s+ H0 M
3.改造def,使用函数转发器
  g3 M( h2 A8 L. V+ y; ]在.def  文件里转发,
5 n2 B. m" ?7 K% }" b. C+ v2 I" z+ ^7 xEXPORTS
4 _& X' o( D$ N( F" B# t  AbortDoc=myAbortDoc @1
1 z. S- j+ Y# m4 |  AbortPath=myAbortPath  @20 w1 }0 X/ r1 L  q4 T- B
  ExtTextOutA=myExtTextOutA @222
, M$ u, C6 L2 r: s+ H3 Y: t2 ~) e# [然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA
8 w, K# o! S2 N. c1 z你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
% V# C0 j$ s. R8 k( }
* z1 R! @" u; D# n2 u) d9 X算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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