首页
社区
课程
招聘
[求助]如何为dll添加Messagebox功能
发表于: 2009-7-20 09:21 7697

[求助]如何为dll添加Messagebox功能

2009-7-20 09:21
7697
我描述一下过程。

A.exe 运行后,调用B.dll

在B.dll中有一个字符串,是动态计算出来的。我的目的是要用MessageBox把这个字符串个输出。

0294C5BA   .  8B55 F8           mov edx,dword ptr ss:[ebp-8]                 ;  [ebp-8]这里面的内容是我要输出的文字。
0294C5BD   .  E9 71330000       jmp KDENCR~1.0294F933
0294C5C2   >  B8 442D9502       mov eax,KDENCR~1.02952D44

0294F933   > \60                pushad
0294F934   .  6A 00             push 0                                       ; /Style = MB_OK|MB_APPLMODAL
0294F936   .  68 22F99402       push KDENCR~1.0294F922                       ; |Title = "请记录注册码"
0294F93B   .  FF75 F8           push dword ptr ss:[ebp-8]                    ; |Text
0294F93E   .  6A 00             push 0                                       ; |hOwner = NULL
0294F940      FF15 C8D27C00     call dword ptr ds:[<&user32.MessageBoxA>]    ;  user32.MessageBoxA
0294F946      61                popad
0294F947   .  E8 C84AF8FF       call KDENCR~1.028D4414
0294F94C   .^ E9 71CCFFFF       jmp KDENCR~1.0294C5C2

我这样修改后,可以在我的电脑上面实现messagebox功能,但是换一台电脑就不能了。

据说是重定位,但是我不知道该怎么改,麻烦各位,告知!谢谢!详细点。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
1,楼主是典型的论坛没有搜索
2,楼主是精华集没看

这种问题的答复多的数不胜数,自己都不帮自己,别人帮你只怕更加无益
2009-7-20 11:48
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
3
2009-7-20 15:14
0
雪    币: 546
活跃值: (1707)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=北极狐狸;658416]http://bbs.pediy.com/showthread.php?t=41553[/QUOTE]

看了这篇帖子,弱弱的问问,谁能给我解释一下原理,我太菜了,看不懂。麻烦版主给解释一下,好吗?

call  @F
         @@:
         pop  ebx
         sub  ebx,offset @B
         pushad
         push 0
         push 0
         push eax
         push 0
         call [ebx + 312f10]
         popad

         call  @F
         @@:
         pop  ebx
         sub  ebx,offset @B
是经典的解决重定位代码
2009-7-20 23:29
0
雪    币: 546
活跃值: (1707)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
0294C5BA   .  8B55 F8           mov edx,dword ptr ss:[ebp-8]                 ;  这里面的内容是我要输出的文字。
0294C5BD   .  E9 71330000       jmp KDENCR~1.0294F933

0294F933   > \60                pushad
0294F934      E8 00000000       call KDENCR~1.0294F939
0294F939      58                pop eax
0294F93A      2D 39F99402       sub eax,KDENCR~1.0294F939
0294F93F      05 04329502       add eax,<&user32.MessageBoxA>                ;  add eax,2953204 这个地址2953204 是我Ctrl+N  在idate区段的导入表里面找到的,这个地址不知道换平台的话会不会改变,要是改变,程序就出错了。谁能告诉我他会不会改变呢?为什么?该如何解决?
0294F944      6A 00             push 0
0294F946      6A 00             push 0
0294F948      FF75 F8           push dword ptr ss:[ebp-8]
0294F94B      6A 00             push 0
0294F94D      FF10              call dword ptr ds:[eax]
0294F94F      61                popad
0294F950      E8 BF4AF8FF       call KDENCR~1.028D4414
0294F955    ^ E9 68CCFFFF       jmp KDENCR~1.0294C5C2

这是我仿照上面的“经典的解决重定位代码”的帖子写的,不知道是否正确,但是可以再我本机输出MessageBox,不知道换一台机器能不能用。

希望高手点评!

我本机测试,可以使用,


换电脑后,就出错了。


什么原因呢?
上传的附件:
2009-7-21 00:15
0
雪    币: 546
活跃值: (1707)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
版主帮我看看呗!
2009-7-21 20:41
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
7
在Dll 中不可以直接调用导入表中的APi指针。

你可以这样做,现在导入表中找到MessageBoxA函数的指针。如你一开始的时候倒入表函数指针是7CD2C8
再Ctrl+F查找
jmp     dword ptr [7CD2C8]  找到后

call "adress of JMP dword ptr [7CD2C8]"
2009-7-22 08:41
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
LZ,你这需要重定位的有很多,虽然你解决了MessageBox,但是其他的东西不能无视掉啊,比如
0294F936   .  68 22F99402       push KDENCR~1.0294F922                       ; |Title = "请记录注册码"
2009-7-22 14:04
0
雪    币: 546
活跃值: (1707)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
这个确实是个问题,文字显示乱码。如何解决这个问题呢?
2009-7-22 23:08
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
先把字符串压入栈里面,在调用就可以了。
2009-7-23 11:14
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
跟那个MessageBox同样的解决方法啊。。。
除了jmp xxx和call xxx这两种是偏移地址不需要总定位(机器码是指明偏移量,虽然我们看见的是绝对地址),其他的出现绝对地址的,基本上都需要重定位。
2009-7-23 12:19
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
帮顶。。。。。
2009-12-29 12:51
0
游客
登录 | 注册 方可回帖
返回
//