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

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

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

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

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

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

solidji
* C3 @: P" n$ f& d; q: u
4 Y& ^" s% o3 q" D2 ]3 T 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
. u) b8 g0 D7 P0 X4 i# u5 X* B http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
6 l: J5 Q! A5 y! G5 K
  E- K* s6 T0 R) q5 \- j" K 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。. [  J0 l+ a' s
 但是比较复杂,我暂时没有时间仔细研究。& \9 |1 [& Y3 k; u- F0 C" k
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,
: h. N# P+ ~' D  K' Y 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
& B# B# x' o$ A5 m' U5 i    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

dllproxyskel.c

显示AlterVista/ m3 j& l2 Q: v2 a& t5 _. b
打不开页面,我搜索看看8 N2 y! H6 {" x  a
-------
- ]2 ^: s; n9 r哦有了dllproxyskel.c,就两个文件,代码很少
回复 支持 反对

使用道具 举报

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

dllproxyskel

dllproxyskel使用起来比较简单,dllproxyskel自动从你输入的原始DLL中提取所有导出函数符号6 k# z4 l, j  ]7 T% A
然后按一定的格式生成.c文件,自动将所有的dll函数信息记录进.def, 做好替换 函数在.c,: M7 r8 G% {6 U- y% F0 z! E
通过在.c文件中#ifdef DLL_PATH 来寻找原始DLL路径(默认为\\system32),原始DLL里的函数调用是原函数名前面加个下划线_/ N4 W; a& E& B# E! _( c1 M- e
比如Exttextout,在.c里做完自己的事后可以调用 _Exttextout 来完全其原本的工作8 ~8 `/ ~8 ?* g; \2 h

9 h' w) i2 H3 K' _# v9 Y3 U5 X命令行输入
6 m' J; v% G, `+ k% ]/ V! qdllproxyskel.exe <input.dll>
5 K& |& A! R% a- open file D:\\项目\\dllproxyskel\\input.dll
- Q  z. d0 A8 w: E2 T  
4 ]5 [6 o7 h% ?0 M. a& B) J. \( x/ q% e, N5 g6 m% W
------------------------------------------------------------------
0 l+ B3 q! _7 O我们需要额外添加的代码! G7 O$ e8 h& ?. d6 C8 t+ `
#define _WINGDI_    //这个值从wingdi.h里获取,仅仅在代理系统DLL的时候需要
0 ]9 \6 ]0 S7 F3 H5 i//定义了两种声明代理函数的宏,CALL_FUNCTION与CALL_FUNCTION2
, }: O5 k  w- k5 g& a//这里我采用第二种,将返回值与函数名与参数列表一起作为宏内容,下面第一个参数BOOL 是ExtTextOutA的返回值+ K$ I/ i6 D) c: X/ G
CALL_FUNCTION2(BOOL, ExtTextOutA,
0 }7 ^$ |5 u' S9 N5 z  v; b8 [              HDC hdc,! m; C$ z" H& P5 q: W
              INT         x,% V$ a5 a6 B3 b# C7 K# i
              INT         y,
- I- N! X: h5 Q3 w& ?              UINT        flags,
5 [. }( V) m$ ^" [: M0 E              const RECT* lprect,0 f7 ^! R  Q  k
              LPCSTR      str,
. ^8 L& i& Y4 k6 I              UINT        count,
7 T* K+ [$ U+ o9 y              const INT*  lpDx) U3 t9 ^: ]2 P" D7 W& h5 L
) {# Q  |: M' \$ b
    //这里可以做任何你想做的事了,HOOK成功2 Q( y: ]" U+ N% x
    outputdebugstr("HOOK ExtTextOutA suscess!");
; \8 C1 a0 e: c- z6 ]/ {       BOOL result = _ExtTextOutA(x, y, flags, lprect, str,count,lpDx);//调用原始函数
# ]5 [! p4 J, E. L7 k       return(result);2 y0 o, s$ E: x
}( h0 e% c2 `5 h, Y+ t6 Q" K; @
% K: b) m6 q  H
注意,生成的代码需要用gcc/mingw来编译,
* m- z  F! y1 s主要是因为其中使用了gcc宏扩展5 f  J, B$ i: Z8 L: j
#define CALLING_CONVENTION WINAPI       // default for Windows DLLs
+ L0 ?. C" d7 a9 A/ F#define PROXY_FUNCTION(FUNCTION_NAME)   /* for the proxified functions not modified */ \\4 J4 b+ a2 x! K
        void CALLING_CONVENTION  FUNCTION_NAME(void)" ?' e+ B/ p& g0 E7 q) A* K" U* ~
#define PROXY_FUNCTIONX(FUNCTION_NAME) \\
7 `- i& J1 b' I' Y        static PROXY_FUNCTION(*_##FUNCTION_NAME) = NULL; \\
6 W, T" L+ }- G+ G        PROXY_FUNCTION(FUNCTION_NAME) { \\
5 }9 O3 B* K0 B/ ]            POP_EBP __asm__("jmp *__"#FUNCTION_NAME); \\
5 y6 U5 X% W- S6 E. l' \0 K        }
- Z/ M$ T( `- L( z- e' c#define CALL_FUNCTION(FUNCTION_NAME) \\
" ?9 R6 m% w6 M* I        static CALLING_CONVENTION FUNCTION_NAME##_(*_##FUNCTION_NAME) = NULL; \\
8 J" b6 H% D8 q3 m) u        CALLING_CONVENTION FUNCTION_NAME##_(FUNCTION_NAME)
+ c6 J" j' B8 W#define CALL_FUNCTION2(FUNCTION_RET, FUNCTION_NAME, FUNCTION_ARGS ...) \\0 F4 B; s* [" o( z/ @9 e) F
        static CALLING_CONVENTION FUNCTION_RET (*_##FUNCTION_NAME)(FUNCTION_ARGS) = NULL; \\5 v6 S% M( n0 l2 V
        CALLING_CONVENTION FUNCTION_RET FUNCTION_NAME(FUNCTION_ARGS), m4 z& U' q- Z3 u- x0 n5 d

' k7 z, d  z% a0 n7 O( Z7 {/ R/ U5 l1 q  G4 T9 S& r, y& z
等我回头翻译到VC里/ q' b+ [: [" \7 \1 ]/ K  M
待续

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

6#
 楼主| 发表于 2010-4-12 11:16 | 只看该作者
引用第4楼scgame于2010-04-12 09:02发表的 :
& z! H8 h5 `. Z; V0 ]( K哦...那看来在不知道函数拿几个arguments的话是不能替换的吧 5 b$ e1 |' T" [. N6 q5 s9 v
那除非用的是GDI的createText画字的游戏,别的似乎还不能用hook解决啊

( \* w. i0 b! [, g. m
6 H1 B! H$ S9 A+ ]7 awindows GDI 的API查查msdn就知道参数了,看vs里的头文件也能知道啊。
% d8 V+ v. {  G& V6 i3 T5 R* y: }这个工具对directx 的com 接口的hook还是不行的,需要用别的办法。) d% E: x4 [; Y+ t
3 f1 v( U3 b. q, [
对了,想等vc版的代码出来以后,我想安排你做exttextout的文本替换部分,行吗?
5 n; D8 v' C5 [9 Q2 q% h1 M我会给你写个简单的设计书,你照着做即可。请先找一下关于hash的代码。
回复 支持 反对

使用道具 举报

7#
发表于 2010-4-12 11:59 | 只看该作者
哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以8 ^0 M2 d; F+ e
' `' ?" P1 [' I5 X% C1 I
这个我可以试试看,蛮有趣的
3 V; T' w5 k" u1 [. r* h/ K6 [是用hash链表把中文字"归类"吗?
回复 支持 反对

使用道具 举报

8#
发表于 2010-4-12 15:24 | 只看该作者
directx 的com 接口的hook,
( \* N/ X6 U/ O0 F+ n1 e因为不是直接导出函数的DLL, 有很多接口是通过对象的方法来调用,
  j. l( R& W, {1 m无法这样通过枚举PE文件头里的导出模块名来取出某个"对象方法", e; e. @6 z, W

% l. ]" Y+ S! d/ O007之前有篇贴子的办法才行,就是在创建对象的时候COM对象整个替换掉
回复 支持 反对

使用道具 举报

9#
 楼主| 发表于 2010-4-12 17:07 | 只看该作者
引用第6楼scgame于2010-04-12 11:59发表的 :
5 n0 ~/ p# p2 b# m# O* Y哦,solidji的不可以直接用吗?我是用CodeBlocks+MingW的,不用写成VC的我也可以
7 A( s% O% `8 M- X9 m" ?0 y6 E# j7 i3 ]( r9 u
这个我可以试试看,蛮有趣的
( h8 d* e5 `8 |- S: p是用hash链表把中文字"归类"吗?
- ~7 D1 [5 c3 g; G4 G$ j. E9 x# b& x' e. l/ X
.......

& n% \6 U1 H# W* B- W
" P5 G" N  e( @* A/ X* l, X! Y7 C最近几天我把设计书写好,你按要求编就行了,请关注。
回复 支持 反对

使用道具 举报

10#
发表于 2010-4-13 20:15 | 只看该作者
非常遗憾的说,鉴于VC严格的格式检查,命名规则等原因。。。这份自动生成gcc的C代码很难改成通过VC编译的了- ?* a$ E0 f* d/ u7 }
另外由于gdi32.dll是一个比较特殊的系统DLL,<windows.h>用到了大量由<wingdi.h>定义的的结构如LPDEVMODEA
3 z" _, K5 i9 F$ I3 W( R所以无法通过 #define _WINGDI_ 来取消重复定义的问题
. D( O2 |+ K3 h  ]0 w说白了就是你自己想生成一个gdi32.dll,这个DLL里的导出函数与原来的DLL一样,都有exttextout
# L- A& e( @3 G# W可是你自己定义导出函数exttextout的话,系统会提示你exttextout已经在wingdi.h里定义过了
+ f+ p! `1 T/ }' @* I' Z如果是一般的DLL,直接不让wingdi.h载入就是了,可是windows.h又必须载入wingdi.h,这样就绕不开这个重定义的麻烦0 g$ c' U( o- r9 P- C3 v' V1 q

  y* v% E) H: @" F1 X0 e4 f6 W1 g: I我想的解决方法:
) \5 m4 F& E9 D1,定义自己的名字空间namespace,将exttextout这些包含进去,或者/FORCE 这类强制链接命令强制跳过检查通过链接
; j8 }; L9 D3 W2,去掉#include <windows.h>这一句,而自己用到的全部自己定义,(在很大量的情况下就比较麻烦)
: p% ~/ \  B# E    #define DECLARE_HANDLE(n)   typedef struct n##__{int i;}*n
( I9 o3 W3 N$ V4 |; [. e2 p* N# ?9 |         DECLARE_HANDLE(HINSTANCE);
: k+ m. @2 T2 K  @$ v, t. a8 K5 O$ e        typedef HINSTANCE HMODULE;
  |* ^; ?2 l' [- f; B        DECLARE_HANDLE(HWND);
1 G( ]1 F' v9 g" A( r8 g2 E        #define LPVOID              void *. W% l6 Q/ Q5 A: V3 r
        #define DWORD               unsigned int
: v3 P6 G9 f4 i- g) a7 x        #define UINT                unsigned int  r5 S8 O/ c) s: a
        #define LPCSTR              char; B, C2 i" O8 J# b- t) Z
       #define LPCTSTR             char
1 [% m4 I& K9 {4 e3 A5 w# i# ~       .............像这样用到多少自己定义多少
* T3 R7 V, ^; P5 P9 r9 U( L$ G! {$ Q
3.改造def,使用函数转发器
5 `& u% T) q4 E3 U) l6 q* s在.def  文件里转发,' ~( V$ g& s( f$ e  Z
EXPORTS
! f# f) f* q. [0 b  AbortDoc=myAbortDoc @1
6 Z2 M8 }' F2 N! m7 T5 \) d6 Z  AbortPath=myAbortPath  @2* Z0 @5 V% b# z# A
  ExtTextOutA=myExtTextOutA @222. k5 v7 R7 L. v/ M, r
然后.c里声明myExtTextOutA 来实现函数部分,这样导出函数就还是ExtTextOutA,但是转发到了myExtTextOutA 0 D5 C  P# ?+ ^
你实现myExtTextOutA 自然不会和wingdi.h出现重复定义的冲突了
3 P; U* f: p/ V
6 Z  K( l% }9 n6 d算了,等我用函数转发器的办法另外实现一个吧,dllproxyskel完全拿他当个PE文件“导出函数”模块名导出器使用
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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