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

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

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

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

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

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

solidji
* q. [4 H+ C  Z4 ]" t/ R4 {; D$ w
9 Q  ~7 m/ O$ A" _* `8 D" h! M9 K: ^ 你好,先给你安排一个小任务,这个任务对你来说应该很简单。
! T4 G) e, q7 P( F" S. b7 l- J http://aluigi.altervista.org/mytoolz/dllproxyskel.zip
' x* [% U4 M  s% U
2 \$ Y7 U% y( m 上面是老外开发的一个制作代理DLL的工具,他的网站上面也有例子。. P. t3 t) Y1 i1 G  w4 v
 但是比较复杂,我暂时没有时间仔细研究。  a! ~* n& E) w" C3 N  m1 e
 请你用上面的工具作一个GDI32.DLL的代理DLL,HOOK其中的1个函数即可,' b  u+ x1 G/ o
 比如Exttextout,也就是说想让你做个最简单的例子。以备扩充修改。
# \: w# Y! B6 e: u8 m    请发布代码。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

25#
发表于 2010-4-20 21:31 | 只看该作者
啊,原来是这样,4 s8 x& w% H% h+ T
谢谢,solidji8 z0 ?) A) l% c9 G
solidji能不能再推荐些教程- r1 K' I6 F" y+ A" o. {2 D
我对这方面(导出,API)之类的不太了解
回复 支持 反对

使用道具 举报

24#
发表于 2010-4-20 12:19 | 只看该作者
他的代码就漏了个函数返回类型BOOL或int,; F9 G4 r) e5 N4 a: ^9 M$ u$ g
int
ExtTextOutA(/ F- z$ q- j% O7 W' w
导致了导出函数链接没对6 _, {; z( i2 ^6 E1 c* T
直接看他的代码就行了
回复 支持 反对

使用道具 举报

23#
 楼主| 发表于 2010-4-20 11:53 | 只看该作者
solidji,请放代码,把scgame错误的地方注释说明一下,便于大家学习。
回复 支持 反对

使用道具 举报

22#
发表于 2010-4-20 11:34 | 只看该作者
typedef BOOL (WINAPI *ExtTextOutA_); e! _  a' o. S! V
就是定义了一个函数类型,我们故意把他定义成和原始的API ExtTextOutA一样* D" I9 h' ?3 z6 |# {" F# Q
就是为了ExtTextOutA_ _ExtTextOutA 声明一个与原始API ExtTextOutA一样一样的函数指针9 V+ A, E6 }$ M
然后_ExtTextOutA = (ExtTextOutA_)GetProcAddress(hm, "ExtTextOutA"); 为这个函数指针赋值为原始API的函数地址7 |+ G. H: b5 b, s% k2 @
这样_ExtTextOutA  就是real_ExtTextOutA的意思,完全把他当原始API ExtTextOutA 来使用就是了
6 {: w" C! b$ s1 C  j1 R. Q+ `" y2 }
你编译的DLL有点问题,我打开PE文件找到  ExtTextOutA  部分,发现虽然你导出了ExtTextOutA ,但却不是你实现的那个5 k3 \8 c* Z! Z1 p& w

- R% o8 q5 q+ ~4 m6 D7 W0 O0 q
/ [7 s1 z: o* e0 v  a9 @. v) ]5 y6 S& m& x4 {6 P) ~

2 i5 B; @. T/ E4 ~) I) _8 A4 D. l1 l
  1. //6A80偏移处你 实际上的函数体代码,可以看到只是个简单的代理,明显不是你自己实现的那个
  2. 10006A80 >  8B4424 20           mov eax,dword ptr ss:[esp+20]
  3. 10006A84    8B4C24 1C           mov ecx,dword ptr ss:[esp+1C]
  4. 10006A88    8B5424 18           mov edx,dword ptr ss:[esp+18]
  5. 10006A8C    50                  push eax
  6. 10006A8D    8B4424 18           mov eax,dword ptr ss:[esp+18]
  7. 10006A91    51                  push ecx
  8. 10006A92    8B4C24 18           mov ecx,dword ptr ss:[esp+18]
  9. 10006A96    52                  push edx
  10. 10006A97    8B5424 18           mov edx,dword ptr ss:[esp+18]
  11. 10006A9B    50                  push eax
  12. 10006A9C    8B4424 18           mov eax,dword ptr ss:[esp+18]
  13. 10006AA0    51                  push ecx
  14. 10006AA1    8B4C24 18           mov ecx,dword ptr ss:[esp+18]
  15. 10006AA5    52                  push edx
  16. 10006AA6    50                  push eax
  17. 10006AA7    51                  push ecx
  18. 10006AA8    FF15 80520110       call dword ptr ds:[10015280]                            ; GDI32.ExtTextOutA
  19. 10006AAE    A3 24570110         mov dword ptr ds:[10015724],eax
  20. 10006AB3    C3                  retn
复制代码
+ i7 q. v6 c* W# a; w7 L+ P' E
- H! [- ^2 [  `0 z  @" Y0 _
我想主要是你定义ExtTextOutA 的时候漏了个int, VC认为这是你另外一个内部函数,而导出的是另外一个
  1. int ExtTextOutA(
  2. HDC         hdc,
  3. int         x,
  4. int         y,
  5. unsigned int         flags,
  6. const RECT* lprect,
  7. LPCSTR      str,
  8. unsigned int        count,
  9. const int*  lpDx)
  10. {
  11.   
  12. // MessageBox(0, "i'm in ExtTextOutA now!", 0, 0);//做你想做的事情
复制代码

0 J7 ]" }: l$ p$ X0 a另外附上我重新帮你编译过的DEBUG版DLL
( N) x7 g1 M( Y$ j$ y; y' S
6 C& b' E6 }/ x8 Q- m

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

21#
发表于 2010-4-19 05:46 | 只看该作者
我再来求救一下,编译好的gd32.dll好像没起作用嘛,我加了个while(1);2 n7 A$ h9 d9 M5 G! A( }' v6 D7 i
运行了个测试程序还是没成功啊
/ X& ^0 U: j6 a' h* L$ E  M: e) E2 |( F3 O" M+ r- A
我还是看得不是很懂,比如说$ _, x3 e6 f# q6 X! [7 v
这个BOOL,有一个#define,还有一个typedef
3 J$ V9 D( A3 n$ _那在我们改的函数那里就是
: l* K) ]- ]+ L! M0 fBOOL ExtTextOutA(blah blah)
9 ^6 B/ u) \3 k那是不是说我们的定义就是
  1. (WINAPI *ExtTextOutA_)(
  2.                 HDC         hdc,
  3.                 int         x,
  4.                 int         y,
  5.                 unsigned int         flags,
  6.                 const RECT* lprect,
  7.                 LPCSTR      str,
  8.                 unsigned int        count,
  9.                 const int*  lpDx
  10. );
复制代码
还有就是不明白' E4 K! W4 s" [+ A; L5 p2 x
ExtTextOutA_ _ExtTextOutA = 0;
* n7 a% r8 `, f3 f# ^6 ?. W' P这个ExtTextOutA_和_ExtTexOutA又是怎么定义的

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

20#
发表于 2010-4-14 23:52 | 只看该作者
原来是VC++是cpp不是c的原因  [s:116]
回复 支持 反对

使用道具 举报

19#
 楼主| 发表于 2010-4-14 22:49 | 只看该作者
试试看http://sourceforge.net/projects/dev-cpp/8 ~) u. M) Y" I+ J3 K2 v2 ]
这个呢?是gcc的。
回复 支持 反对

使用道具 举报

18#
发表于 2010-4-14 21:56 | 只看该作者
VC 和VC++有区别吗
" r6 J9 I# ~( `. w我下了个VC++ 2008的,编译不了啊0 l7 ?1 w" i$ K: Z: I; P! ^
    _CreateFontIndirectA = (void *)GetProcAddress(hm, "CreateFontIndirectA");
0 C% K3 s- k1 k1 ]5 j等等都有这么个错1 u& d5 s1 ?) j* L& o. s! g( n8 A
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
' C% D5 A7 N* v( h) x0 f1 O) {' u) z$ k! s( l$ N3 @; `7 Y7 g2 w1 O3 X
我先用钩子试试看看能不能编译
回复 支持 反对

使用道具 举报

17#
发表于 2010-4-14 20:39 | 只看该作者
我不明白ExtTextOutA_是哪来的 [s:105]
+ V- X! Q8 ]& Z6 y  _# Rp.s 原来那个叫钩子.我还是第一次接触这个概念,嘿嘿
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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