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

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

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

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

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

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

solidji
4 I9 x* k5 [5 O: N9 B
: ]; D/ D; C- o1 w 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
% S! c$ @, J) [2 R7 d- ~) X, ?1 | http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
  b, Y+ y6 H2 [
: i5 o$ q1 d0 k 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。* Z1 [: n% K  \: Q- c4 Y  ]
 但是比较复杂,我暂时没有时间仔细研究。
  `5 E# f/ Y7 a+ q 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
, E+ ?" X9 W' M 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。# Z0 j5 B" l$ }
    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista7 t  Z0 Y8 i* k( d! B( L" c: O
打不开页面,我搜索看看
" J5 S: {- g* A4 J! o" A9 R. x-------
3 O8 K3 E0 X' M& i: L; n4 Z% \4 I1 r哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号
5 Q5 }2 b0 y7 G# V( I然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,
1 U5 k' X  d) p; k! E" g通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_
4 g6 Y" Z2 r) ?( ~) l- L比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作: E+ n' U+ |/ J7 K
3 l) Y* N4 g9 c5 z: A
命令行输入
  k. k8 C) m* k4 P  z; l4 Pdllproxyskel.exe <input.dll>
1 V% A  M) \" o# }- open file D:\\项目\\dllproxyskel\\input.dll- q$ U! N( \6 e" G. Z$ p' H
  
+ c! w; h6 S" ?4 x. t
8 `/ Y8 J* r' p9 |------------------------------------------------------------------  ^5 P4 b6 |. ~  L% `6 E4 A& s$ g
我们需要额外添加的代码: |* z4 o; I( ~0 S  |" m% f9 n6 ]
#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要; D0 @5 z+ ~+ V" i' l
//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
. O7 a/ D9 X9 U0 X' A) @//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值3 M+ R! F. ^  o
CALL_FUNCTION2(BOOL, ExtTextOutA,
& J6 u- A1 m+ b+ M              HDC hdc,+ z6 g5 s3 g6 S' O) d8 V
              INT         x,% d) Q( g+ E! c
              INT         y,: t3 l4 p# h/ |  j) |
              UINT        flags,# P; ~0 \" r, U1 t4 F
              const RECT* lprect,. O9 m) p- a% @% h8 `1 y
              LPCSTR      str,
6 @( S  V) c+ Q5 p5 O              UINT        count," R2 w) n5 ^7 A  L  A6 O
              const INT*  lpDx- ~: o* M3 v, R: f5 P7 i  S: O2 A
) {
+ _2 R" B+ C0 W1 }/ N- l' X% ?5 J    //这里可以做任何你想做的事了,HOOK成功* A0 U0 A; i9 v7 y2 f" F3 P7 O
    outputdebugstr("HOOK ExtTextOutA suscess!");
8 E2 `5 u- ^1 ~+ d+ g: d       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数3 X( o, f3 w) v8 s! I5 J6 y
       return(result);
+ d5 a5 U- v9 {( I, q2 P}2 M7 _# [! s. j8 p
) T$ h1 ^8 x, C9 g- K
注意,生成的代码需要用gcc/mingw来编译,
2 j$ J' w3 ~  G* @1 M主要是因为其中使用了gcc宏扩展& `% q  Z& [/ V8 x$ \
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs* d' n6 F; J6 A; f6 I' M& {+ |
#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\
. T7 K/ {0 J$ @5 r        void CALLING_CONVENTION  FUNCTION_NAME(void)  [, y; U' I+ ]& Y* ~6 a  d# S# q
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\/ {0 \/ D4 A9 L9 u$ n  U
        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
: S' i. K1 A1 z" {        PROXY_FUNCTION(FUNCTION_NAME) { \\4 i* O) G4 i$ l1 z8 o" k0 m, {
            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
8 d) J1 l2 C* ]' q        }
4 z( R' {2 I& o9 c* p1 R8 C#define CALL_FUNCTION(FUNCTION_NAME) \\3 G. f1 j- I/ g' Q2 y' M) t  a
        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
; r, _% l) Q: n0 y1 _, P2 a        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
. H( u+ ~: t( }8 O5 F1 C  V9 m#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\
7 c8 J' T' G. g/ r% e9 W        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\4 i1 p5 q% i, A& d' X$ i
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS)
# U7 i& t0 q- C# V  f1 Q( p5 x/ a- e& w+ o9 \4 s
8 n+ u/ D6 Z1 C! q6 `* l' ~3 m
等我回头翻译到VC里8 G% i# ]/ o! M3 x& i
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
/ e8 T9 ^9 @: U/ y$ S0 f哦...那看来在不知道函数拿几个arguments的话是不能替换的吧
2 q/ Z; A4 i. z' \9 L! ~那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊
  Q6 X$ G) K( [, L
0 L* {5 p( w0 O' E7 g9 T. [" c  o4 m1 v
windows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
4 @) Y+ s7 T& `- B+ p) d这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。
# d# a1 P9 T2 c: c) Q( l* D2 M1 y) F8 T
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
% n  Z/ X% |! Y/ }: F+ h我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
0 ], j% N9 g4 S. I6 @3 _5 ]
# W; m) h0 @, d( @( d( B+ I这个我可以试试看,蛮有趣的% G9 i5 T6 \( w; f9 J
是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,$ t" h! \% i& l3 C( \
因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
! G9 d0 P9 p0 b( Z% V8 A4 ^无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法"
6 R# z6 b* k7 F; J3 }. L/ ?  E& F$ u
007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 : 9 H5 w' `4 `; G$ [/ r/ i
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
: A" d- ^! y% R! q( h" I5 K" s3 F; w0 S( r: ^# F- x7 n
这个我可以试试看,蛮有趣的 ) R# P9 Y) R8 M! G, Q. n
是用hash链表把中文字"归类"吗? ' `5 V  E3 v& x% b  j4 C
7 z2 s* [' p) l  E& l
.......

' }3 J' I/ c' y3 j. ]0 U& A8 M
0 B) o2 }5 V, q, u* s: n  o3 j8 w最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了
; P) x+ ]: L2 o8 g" }$ ]! J另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
8 `  {! g  y( @! z, }; t! d0 h* s所以无法通过 #define _WINGDI_ 来取消重复定义的问题8 {/ W. ^! {8 _) w, {
说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
7 B- Z& T+ Q+ S可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
* V' `  u: q5 C; }如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦4 G; s3 G& E# D+ j

6 P# \# B0 Y" G! T+ W0 E5 l我想的解决方法:/ t* z% x* e' {/ B& r& Q
1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
4 c. b6 {5 q& S# `2 M1 K+ Y2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)+ _: Y/ I7 D, m) M* {) r
    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
* S0 S& b8 N: r/ R  W8 X3 ]         DECLARE_HANDLE(HINSTANCE);3 O+ C- x+ u0 y
        typedef HINSTANCE HMODULE;
8 k, ^: |7 ~8 n. \# \0 v        DECLARE_HANDLE(HWND);
# y' E" G9 T* E% C3 ]; @        #define LPVOID              void *
) L2 I- u0 f2 {; l6 A        #define DWORD               unsigned int! _- K3 }) {2 s# V$ t, s( O- r
        #define UINT                unsigned int3 H3 H- i4 b, t" k- G8 O
        #define LPCSTR              char/ k9 z  `& B) ]
       #define LPCTSTR             char 5 U3 n% E) Y* P8 L' g" N
       .............像这样用到多少自己定义多少- N& W+ f6 J1 w8 e+ p
: I7 Z" P3 h7 j/ d4 K( |6 d$ o* M3 X
3.改造def,使用函数转发器
# ~+ C4 b! j8 n在.def  文件里转发,$ B2 l& L1 h9 q! q. x% l. j! d9 @
EXPORTS+ W4 }2 B8 w7 J4 r
  AbortDoc=myAbortDoc @16 _: }0 t! ~% k8 I* ^) m7 K
  AbortPath=myAbortPath  @25 O0 ]- v8 D) w; n  O' ~. i4 p
  ExtTextOutA=myExtTextOutA @222% y: @1 U% T! e6 D; H. U$ X
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA ) O. i  f2 P. f; `4 ~3 g
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了! q" Z( H% K! I& {% E: @2 i

5 l/ \" Y: U# d; `* s5 E6 i# O算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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