首页
社区
课程
招聘
[求助]VB如何向CALL中传递参数?
发表于: 2010-4-25 17:30 5462

[求助]VB如何向CALL中传递参数?

2010-4-25 17:30
5462
获取hProcess,运行VB中Command1后可以成功实现远程调用callType的运行。

如何通过Command1来传递参数(x y m d)给callType(使用技能)运行?

===========================================

PowerBASIC的代码:

#DIM ALL '申明所有
#REGISTER ALL '注册所有
#COMPILE DLL "ProjectOK.DLL" '生成文件类型及名字
#INCLUDE "WIN32API.INC" '引用API

''''''''''''''''''''''''''' 注入程序 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FUNCTION FuncIn ALIAS "FuncIn" (BYVAL Func AS DWORD POINTER) EXPORT AS LONG
    WriteProcessMemory(hProcess, BYVAL ThreadAdd, @Func, 4096, 0&)
    hThread = CreateRemoteThread(hProcess, BYVAL 0&, 0, ThreadAdd, BYVAL 0&, 0, 0&)
    WaitForSingleObject(hThread, %INFINITE)
    CloseHandle(hThread)
    FUNCTION = -1&
END FUNCTION

FUNCTION UseSkills ALIAS "UseSkills" () EXPORT AS LONG
    FuncIn(CODEPTR(UseSkillsCall))
    FUNCTION = -1&
END FUNCTION

'''''''''''''''''''' CallType使用技能 ''''''''''''''''''''''''''''''''''''
FUNCTION UseSkillsCall ALIAS "UseSkillsCall" () EXPORT AS LONG
    DIM Address AS LONG
    DIM x AS LONG
    DIM y AS LONG
    DIM m AS LONG
    DIM d AS LONG
    Address = &H00531010
    x = &H12C
    y = &H1C2
    m = 0
    d = &H15
    !pushad
    !PUSH x
    !PUSH y
    !PUSH m
    !PUSH d
    !mov EDX, dword ptr [&H9A0FC4]
    !mov ecx, dword ptr [EDX-&H8]
    !call Address
    !popad
END FUNCTION

===========================================

VB的代码:

Public Declare Function UseSkills Lib "ProjectOK.Dll"   () As Long

Private Sub Command1_Click()
    Call UseSkills
End Sub

===========================================

参考资料:
http://blog.csdn.net/hack_wg/archive/2009/09/12/4546836.aspx

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
你说的是远程线程创建一个CALL吗?

如果是,有一种方法可以传递多个参数。

因为创建远程线程允许提交一个任意类型的参数。

这个参数我们可以提交一个struct。示例:

struct a
{
  int a;
  int b;
  int c;
};

void r_Thread(struct a)
{
   //此处就可以使用结构体a里的三个变量了
}

创建线程之前把结构体a填充好,就传过去了。

可能说的不够清楚~继续讨论吧。。
2010-4-25 18:43
0
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
刚仔细看了一下,似乎你说的不是这个意思。。
唉,反正是没看明白你想说的,向DLL里面的函数提交参数?
2010-4-25 18:45
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
要解决VB如何向Dll中的call传递(即汇编语句)参数,请赐教

    !PUSH x
    !PUSH y
    !PUSH m
    !PUSH d
2010-4-25 18:53
0
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我不懂VB哈,我给你描述原理,就是给你DLL的函数增加参数,需要自己平衡堆栈。

描述:


VB伪代码
//为你的函数增加参数
FUNCTION UseSkillsCall ALIAS "UseSkillsCall" (x AS LONG,y AS LONG,m AS LONG,d AS LONG) EXPORT AS LONG


之后修改你的函数代码


FUNCTION UseSkillsCall ALIAS "UseSkillsCall" (x AS LONG,y AS LONG,m AS LONG,d AS LONG) EXPORT AS LONG
DIM Address AS LONG
; DIM x AS LONG //删除这几行,避免重复声明
; DIM y AS LONG
; DIM m AS LONG
; DIM d AS LONG


Address = &H00531010
; x = &H12C //删除,不进行赋值
; y = &H1C2
; m = 0
; d = &H15

!pushad
!PUSH x
!PUSH y
!PUSH m
!PUSH d
!mov EDX, dword ptr [&H9A0FC4]
!mov ecx, dword ptr [EDX-&H8]
!call Address
!popad
END FUNCTION


修改你的调用代码:


Public Declare Function UseSkills Lib "ProjectOK.Dll" (x AS LONG,y AS LONG,m AS LONG,d AS LONG) As Long

Private Sub Command1_Click()
UseSkills (1,2,3,4) //直接提交参数
End Sub


PS. 由于不懂VB,所以我说的这些只供参考,也许堆栈或其它地方存在问题。
2010-4-25 20:57
0
雪    币: 198
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
直接调用就出错,需要远程注入吗?
2010-4-25 22:51
0
雪    币: 44
活跃值: (24)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
出错就排错去,实在是不懂VB,无非就是向外部函数传个参数而已。。。无能为力了。
2010-4-26 17:43
0
游客
登录 | 注册 方可回帖
返回
//