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

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

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

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

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

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

solidji
; u7 u3 W5 l, S9 }
% N; C! ~8 {- Y6 W7 G 你好,先给你安排一个小任务,这个任务对你来说应该很简单。& p7 S: a! p# J
 http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
5 }6 e: l- K+ {4 Z  v% P( ~9 L2 ^' v5 o
 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。) m1 a2 f! c6 k' e; I7 c' F
 但是比较复杂,我暂时没有时间仔细研究。* |9 S) V- ^/ |6 }5 f
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,% ^* A8 _  d9 Y3 [" u
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
- ]2 ~( \; A+ b8 Y7 |/ s    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
+ Z* g" V0 s: F* ?* z打不开页面,我搜索看看- k$ d5 c/ d& W
-------- D8 s& R" e. t/ e0 h3 l& g
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号) k: [9 t3 \" u# K2 s0 d
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,% S. q2 C+ f. r
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_# [0 f, i$ o- {+ p" S
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
6 b+ W0 }8 G5 i5 P- i+ z8 x
% A$ J! ~" [. {) V, d( I命令行输入$ L. l7 f2 F  M- c
dllproxyskel.exe <input.dll>
( j3 Y3 |+ Q5 `- e8 V' o, p) f- open file D:\\项目\\dllproxyskel\\input.dll
' i3 t2 C+ p8 r1 u$ [& d  0 F0 @4 W% G9 u0 |
3 |0 w4 Z0 Z8 m/ q( x4 v
------------------------------------------------------------------0 s; k9 n; U0 y' v( V$ m" V6 u& m0 T
我们需要额外添加的代码
) W' T3 q) ]  I' y  O; S#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
$ S* j2 l7 \! W8 c# B3 u//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
( s: z7 _& R+ m$ p//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值- S- i" O! K( ~
CALL_FUNCTION2(BOOL, ExtTextOutA,
, ?, A3 b6 `% ?              HDC hdc,
+ ]4 t1 R9 E1 a: I# l              INT         x,% @' E$ \% [$ ~  A3 ]' d
              INT         y,0 p+ P( D; P5 x
              UINT        flags,
/ a' }: V9 q( ^6 x  Z0 @              const RECT* lprect,/ Y4 w. \# D8 s% |5 M2 w* K: R
              LPCSTR      str,1 N! T  T$ c8 V# M2 ~
              UINT        count,, h/ i7 Z  B- E. g/ K, p0 L
              const INT*  lpDx# i8 ]# n9 ^1 d
) {) z; `% P9 R. }$ l1 E/ P, w
    //这里可以做任何你想做的事了,HOOK成功5 s' i* {5 ?/ U
    outputdebugstr("HOOK ExtTextOutA suscess!");2 E6 G& g/ k0 B3 ?0 l( [$ J  S
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数" _2 _+ T( A; {
       return(result);
$ `% D% z2 D# q1 u5 i}: p# Z% b, E9 J  s: d' I
: S9 ~) {4 M3 h, F1 t1 o* j0 {+ C* ?
注意,生成的代码需要用gcc/mingw来编译,# H2 N8 p4 s5 o( W
主要是因为其中使用了gcc宏扩展5 i# Y4 L0 n  V+ ~, G
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
5 b' x* T8 v, Y; d#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\' F3 P5 }$ ~% ?8 d8 N
        void CALLING_CONVENTION  FUNCTION_NAME(void)
$ g2 c% m& }& Q1 i: i0 E' R#define PROXY_FUNCTIONX(FUNCTION_NAME) \\3 c1 W% {+ j$ `5 O7 O
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
7 ~* Q. D$ ]3 R8 a( G( m# W& M+ U        PROXY_FUNCTION(FUNCTION_NAME) { \\
" v+ @8 [2 `3 J3 M' K6 Y6 m; X            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
* K/ y/ _+ g! ?! \, Q! e, V        }
( ?8 x' }0 u  G8 Q, J3 r; z#define CALL_FUNCTION(FUNCTION_NAME) \\- }& x( k* a; M9 O* W, C+ [
        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\, H; e! w) W8 j$ `. m; p
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)3 A* M, u' ~1 P4 A2 y
#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\6 P2 T; l* q% _6 Y" ~: `" }6 z
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\$ G) m7 {- ~& K6 w: x3 q/ `2 M
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
. `' Y& _8 b9 D9 B  V5 r
/ i/ t8 p4 d' G; f( a  R8 H5 ^; e! I" c, n7 n/ s
等我回头翻译到VC里* O/ y  ?9 ~$ w: l
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

5#
发表于 2010-4-12 09:02 | 只看该作者
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧+ p; c+ f3 i  e% X! a( N7 v8 L. i
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
. Y8 J3 }4 L# l9 a哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 3 _3 r: l, v2 j* o! {4 z* }
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

  q) z9 S! ]$ \1 O1 Z3 y) q9 K3 A0 F* K8 j
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。  h. ?5 o2 N. l. B3 v
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
+ {, w% i: Z( g: i- o0 o% }
* G& c7 N, A2 D/ n; P对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?8 `: `8 {* C$ g1 E: X. k6 m+ c. ]
我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以/ U0 Y/ _" g/ B/ |
7 T- d7 M* ^9 H! d
这个我可以试试看,蛮有趣的
+ g9 i! k$ r" G是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
4 U: w: y2 u# f8 m/ g* [  \  G因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,9 v3 Q/ L, k3 K# u
无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
1 K8 w. c6 o. l3 w, ~9 F2 }  b1 a& w
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
# a' N+ y$ i9 G# w' Z9 j+ p哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
. n! u0 r6 B7 R
  \& l1 F9 g) r, v这个我可以试试看,蛮有趣的 ' [+ n* x  X* S* U1 U* _' S1 C, G
是用hash链表把中文字"归类"吗?
, b1 o) S8 c; Z( ?: ?: x1 G% d" c. h, V1 k% N8 @- |, e% G
.......

0 T& [. n3 Y, b# d9 T
; T- `% `, r* r& ?3 P. g最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
. @% P8 u/ G& c# x0 l3 P9 A4 u另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
/ i$ Z- b) j" _- K0 C* w9 ~所以无法通过 #define _WINGDI_ 来取消重复定义的问题- D. J2 n$ {7 d5 L( w; \& H$ o
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
/ t; V8 h/ i1 A1 p7 \可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了# W5 o1 U* M, z
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦8 A- _# |9 I# X& H  F
' j) X$ `$ @% i4 L% S( A
我想的解决方法:
! O! d% `- i" T+ W1 e: ]1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接% \3 n) l  Q. m' _; X! O( [) H
2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
0 i# V4 T" Z2 a) C) q8 H    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n9 g) i# }4 [2 y. }
         DECLARE_HANDLE(HINSTANCE);1 k& s' J) f/ M; Z) O
        typedef HINSTANCE HMODULE;
" r8 b  V. i, {/ S9 O$ X9 T* D/ z        DECLARE_HANDLE(HWND);
0 X" z& L) L# K% K% w8 m) N        #define LPVOID              void *  s" A! d6 k9 S- J1 f/ c
        #define DWORD               unsigned int* {$ \" H3 }: ^; b4 Y/ v
        #define UINT                unsigned int
% E; w2 p* V, q. m: B: K7 T        #define LPCSTR              char
8 |' i& I7 E6 q" V: J       #define LPCTSTR             char 8 R2 k  z  n, v# ^1 ~- Z$ @: p& I+ s
       .............像这样用到多少自己定义多少1 X0 D2 }* k7 e- Z5 ?; n
$ T* B" c4 b0 L/ U. ]- J9 y
3.改造def,使用函数转发器
8 J$ U4 J, {% k" d1 `( @在.def  文件里转发,
. ]0 g& z' T; M5 |+ NEXPORTS  m6 f6 t3 Q2 K/ o4 p( W
  AbortDoc=myAbortDoc @11 {9 l- k! ^8 G6 o
  AbortPath=myAbortPath  @2
5 H* K# `. R( j  ExtTextOutA=myExtTextOutA @222. x" n$ g6 i# h  Z3 N4 Q
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA " M+ b3 u/ [; M# ]! Y% g3 G
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了; N  G* q5 x. A) S* ?

+ Z0 L' f! c; }$ z- ^, G% L; y算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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