首页
社区
课程
招聘
[求助]调用dll中的函数--令人困惑
发表于: 2005-9-24 21:23 5464

[求助]调用dll中的函数--令人困惑

2005-9-24 21:23
5464
自己写vc中嵌入的汇编代码,要调用dll中的函数,用GetProcAddress得到dll文件中的函数地址lfunaddr后,压入参数,可不可以直接call lfunaddr,还是要对lfunaddr做一下修正?好像很多代码都不一样啊。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像要先把涵数的参数先压了堆栈,再用jmp指令跳到涵数入口地址
2005-9-24 23:58
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
sorry说错了,参数已经压栈,然后call
2005-9-25 08:35
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
可以。
2005-9-25 17:14
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
这是从前Binny大虾写的QQ 2005贺岁版登录口令加密算法及其源代码中的vb程序:在QQEncryptTest工程\modVB2ASM文件\LoGetCodeStart函数\
    AddByteToCode &HE8
    AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
'我加的注释:call "??0CVQQSock@@QAE@XZ,加密函数的地址-数组的首地址
其中lngProc是用GetProcAddress得到的加密函数地址(参考Private Sub cmdEncryptDll_Click(IndexAs Integer)),作者在注入的代码中并不是直接调用,而是减去了注入代码的首地址,也就是作了调整.

请问这怎么解释?
2005-9-25 18:06
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
自己顶一下!
2005-9-26 22:29
0
雪    币: 12418
活跃值: (4017)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
在delphi中可以这样,这个是不知道函数名的情况下,相应的参数你按程序一样压进去就行

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: THandle;
begin
  I:=LoadLibrary('GameProj.dll');
  //加上偏移量即可得到函数地址
  J:=I+$BBA0;
  asm
    push ebx    //delphi用汇编多数要保存这个寄存器不然会出错
    call J     //这样调用的话可以产生call [XXXXXXX]的效果
    pop ebx
  end;
  FreeLibrary(I);
end;
2005-9-27 16:24
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
thanks,可是他为何要减去封装代码的数组的首地址呢?难道是因为vb,可是别的地方也是直接调用的啊?
2005-9-27 17:12
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
看了一下Binny兄的代码,你将他的意思理解错了,下面的语句Binny兄并不是调用lngProc函数,而是在VB里写内联汇编代码(OPCODE)。
AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
这一句并不是调用lngProc的地址,而是将call lngProc的OPCODE代码写入文件,所以这一句AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
语句是计算Call的OPCODE代码的Call的偏移址,并不是改变函数的偏移址。
所以他的意思其实是这样的:
假如:lpgProc的偏移址是:00402000,mAsmCodeBuffer变量的地址在00401000,这一句就变成这样:
00402000-00401000=1000 ;mAsmCodeBuffer和lpgProc的之间的相对偏移址在1000的范围
所以,将上面的语句变成汇编OPCODE代码则是:
E8 00 10 00 00 Call 00xxxxxxxx <-这个Call指向lpgProc函数的偏移址。
2005-9-27 17:48
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
谢谢小虾兄的指点,看来真得好好学学vb了。
2005-9-27 19:18
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
11
这应该是个重定位的问题了,俺正在学习中。
2005-9-28 08:48
0
游客
登录 | 注册 方可回帖
返回
//