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

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

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

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

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

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

solidji
- k& Q! j; q0 M- Y; X2 O( G# Z" w/ Y0 ^0 b3 V: P% A9 E7 m: F. `/ G
 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
" ], z( m8 u7 {, s, L& W  l' s http://aluigi.altervista.org/mytoolz/dllproxyskel.zip3 z! \/ Z- W" q# K& z$ @

. n7 W% i: Y! w2 q" L: N% `1 D* G 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。" T3 ^* D" Y' D) |* u" D, L& S
 但是比较复杂,我暂时没有时间仔细研究。. f$ y% I3 C3 `  |! B0 O+ o
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,) d7 c7 |& G/ G( Y3 X
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
. K- Y" S0 Z- |! w0 R' d) o    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista
, N/ @. L# s, O3 e. G7 a打不开页面,我搜索看看2 Z7 L# K' E1 z
-------% O8 T) Z2 _7 _
哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号) J1 Z) w& x9 L! V
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
  }0 p+ f% {0 x/ V0 Y# w) L通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
# O; x1 V9 o5 S( U) ^1 S) e比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作
7 S7 q  i- o8 _( ^. d2 R) I& N" D' D, Z  \3 r' f! K! [) a, u$ M3 `
命令行输入2 \# k  K% A& Y( n' W- z' [' L& e- j
dllproxyskel.exe <input.dll>
8 N- j( e: [7 O5 Z- open file D:\\项目\\dllproxyskel\\input.dll5 e, h1 M/ L  q- ^% [
  * {' H- H! a9 [( A/ ~
  M- |/ Y2 `# O; X8 H, E
------------------------------------------------------------------
7 d  a1 W& A; j  a+ W7 q6 n我们需要额外添加的代码
1 y* k! K0 k( F7 N7 A  I& i#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
  D1 z6 J) a% y% x9 D& ?" l0 \//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2$ ]/ c% q, B, P: h1 S! g! l
//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值3 j# u1 ~% O/ h! G1 Z, k: A4 N9 P- ]. V
CALL_FUNCTION2(BOOL, ExtTextOutA,5 v7 b$ Q: t2 E
              HDC hdc,
" ^  U0 n5 ]2 p, a9 Z              INT         x,
( @) ^$ b: A, O' p$ t2 k& y              INT         y,
+ k0 g: B' h: s4 G+ W& G              UINT        flags,2 a" G& s4 ^( E
              const RECT* lprect,! q; w  ?$ U9 @/ H4 I
              LPCSTR      str,
+ l; C9 A1 n! h; E              UINT        count,/ `+ _  @/ S9 `2 i) Z
              const INT*  lpDx
6 F0 P- V" V5 ]/ I) {
, z% w& k9 y3 ^+ m( h+ Y: T    //这里可以做任何你想做的事了,HOOK成功9 g; g2 D: u0 [) J
    outputdebugstr("HOOK ExtTextOutA suscess!");8 n% q. ?6 e% R; u1 R$ y* K
       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数3 r/ K2 B$ s, W4 j' i
       return(result);
$ k$ A& w: H) y) C. J8 [}
: L: `5 R9 F  I  o, v, A- Z- ~" r
注意,生成的代码需要用gcc/mingw来编译,. w, Z& D& }2 r$ X# t
主要是因为其中使用了gcc宏扩展: ?6 M- C2 B- c" l  I# a. C
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs" L: i5 [6 _' }# }
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
5 l. ~% `( }6 c" y% ^0 Z        void CALLING_CONVENTION  FUNCTION_NAME(void)
$ R" n% }3 q8 v2 i#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
0 e6 G  H7 b8 C1 u, o$ L! K! L2 w        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\4 b$ a% W; S; p( H# i+ \3 d3 r( n& r
        PROXY_FUNCTION(FUNCTION_NAME) { \\
( V# H# l2 b* p/ X            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\6 G- O1 J0 ]3 \* |2 L
        }
. f7 a% F1 t5 f#define CALL_FUNCTION(FUNCTION_NAME) \\
8 ?) y! P; Z. O, e        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\' r/ ]$ v8 [6 k- O3 ]
        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
8 E# T2 |9 d& S# a1 i$ I#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\, d/ a8 v! {3 s+ q" Q" I* `. m
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\$ R$ F, i, m6 i. G% B  {
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
3 d' |. Q2 T% `8 ~! p/ a  C9 q" c+ a8 v/ P" i
2 _6 Q2 t5 U& P6 u0 C
等我回头翻译到VC里1 u6 D- L7 O* t1 X  c  ^: |2 Q
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 : 3 C3 d0 \. f* B+ R
哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 . s  |) p( H" M- K  ?
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

( @! e: L, ?1 E! R: o  G6 r' Z5 {/ |3 ~3 v4 d. |
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。: C, r1 w2 E2 Y, g7 b0 l5 l6 Y3 H
这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。' u' a* N% [- [6 |; p& v
& y2 K7 Y5 S8 ^$ W
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
3 e1 \4 `0 ?, m, L- E3 M: `- Y我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以, n- [( ]# }4 i5 \
% L1 v7 r7 W2 o; m
这个我可以试试看,蛮有趣的
+ e* e" h0 }. i3 W是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
0 d2 _- l# k* [* {6 ]# G6 V7 M因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
7 m0 {5 O: L% ]# Q1 ]5 _2 r6 C6 m7 k% o无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"( p' h6 M) y  W1 t$ B% I
+ ?& F$ Y6 Q9 W) G* a! T5 e' w( g
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 0 N" k% z7 o0 ^. f! \
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以 3 S( T1 p. C$ V$ Z4 U1 O$ p# m3 C
. r" E0 o" g1 [8 I8 M7 R
这个我可以试试看,蛮有趣的
) a9 X$ M6 t. o1 X是用hash链表把中文字"归类"吗?
$ I8 S# U% Z" P5 N5 M
6 f/ v+ {! e* J7 d1 ^3 O  A( d.......
2 u/ P2 \: e, o) {
) F- B4 a6 U; F& \, N! o( x* [4 [5 l# b
最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了9 p4 X# e8 Y4 h: M# v0 s
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
' F0 X8 U! h, t% z所以无法通过 #define _WINGDI_ 来取消重复定义的问题
$ s! C8 y8 h1 \) j. u说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout0 l- R# }, A# K
可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了& H/ v- _/ J5 N
如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦2 s- y( K3 {6 n. S, E* y7 A8 n
" t' L7 v+ y* I8 Q
我想的解决方法:2 S! ~7 y- j9 E+ A$ y+ q. e
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
  `, ]3 ~8 P, A) I  S2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
4 q2 b0 d+ ~0 `& Z+ B% v    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
9 w8 T- e3 S% r0 A% Z         DECLARE_HANDLE(HINSTANCE);
8 m# B( B' S, z4 _, U        typedef HINSTANCE HMODULE;2 }9 |; f+ a1 x! j7 o/ y9 L
        DECLARE_HANDLE(HWND);! w4 z+ K4 m4 L
        #define LPVOID              void *  J7 X1 l5 W* M. K  V5 B$ u( U
        #define DWORD               unsigned int% ~3 J/ \- E* t5 Z( }: z
        #define UINT                unsigned int3 {# e$ I! [) m9 `# [& H" d# E
        #define LPCSTR              char  U+ \: G' r( o  T0 }
       #define LPCTSTR             char 9 @$ P8 Y# r# P$ Q. R
       .............像这样用到多少自己定义多少
2 Q  {; ^; x8 ^
4 V' R  f0 y3 `5 y7 S3.改造def,使用函数转发器
3 Y  V- M& y+ {$ Q* p8 O) W8 k在.def  文件里转发,6 g  \1 O' n9 E! V5 i8 T! R# I5 Q
EXPORTS- _. P6 ?3 T5 d3 W: p
  AbortDoc=myAbortDoc @1! H, j+ Q# }" l# u1 s* k
  AbortPath=myAbortPath  @2
( M/ W# q7 q% U6 j& e  ExtTextOutA=myExtTextOutA @222$ @5 S. t, v  y
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA : I$ `- p: H* ~9 N
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
+ W) G1 p: x4 o( |. O/ O3 c
6 v: d  i- b$ V6 |, j算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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