首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

CreateRemoteThread可否直接调用远程函数?解决方案

2013-10-21 
CreateRemoteThread可否直接调用远程函数?我用VB调用这个api 目的是实现调用另一个程序的某个函数,比如:被

CreateRemoteThread可否直接调用远程函数?
我用VB调用这个api 目的是实现调用另一个程序的某个函数,比如:
被调用:
Function xx()
msgbox "123"
end function

我想在其它vb中通过FindWindow 找到被调用程序窗体句柄
getprocessthreadid 搞到pid
openprocess 获取进程权限
createremotethread 创建远程线程
其中被调用函数地址已经用OD找到了(不知道对不对,地址对应的汇编代码是一个Call 下断之后弹出对话框之前是中断在那里的)

为什么一创建被调用程序就自动崩溃呢?我是WIn7
附上代码

Private Sub Form_Click()
Dim ss As a'本想传参的 可是总是出现错误,干脆就重新写了一个子程序 把参数去掉了,所以这行暂时没用了
ss.in = 0 '同上
ss.in2 = 0 'And so on...
Dim hwnd As Long, pid As Long, pHandle!, pid2 As Long
hwnd = FindWindow(vbNullString, "AA") 'Caption是AA
GetWindowThreadProcessId hwnd, pid 'GetPid
pHandle = OpenProcess(&H1F0FFF, False, pid) GetpHandle
'VirtualAllocEx pHandle, 0, 10, 0, 0 '不想用这个....因为我只是单纯的调用一个已经存在的函数
CreateRemoteThread pHandle, Null, 0, &H40109B, Null, 0&, pid2 '就是这里执行后被调用的程序出现错误,然后退出...
End Sub
求大神帮帮小弟
CreateRemoteThread可否直接调用远程函数?解决方案 vb function 线程 汇编 api
[解决办法]

bool AdjustPrivileges() {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;
    TOKEN_PRIVILEGES oldtp;
    DWORD dwSize=sizeof(TOKEN_PRIVILEGES);
    LUID luid;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES 
[解决办法]
 TOKEN_QUERY, &hToken)) {
        if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;
        else return false;
    }
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
        CloseHandle(hToken);
        return false;
    }
    ZeroMemory(&tp, sizeof(tp));
    tp.PrivilegeCount=1;
    tp.Privileges[0].Luid=luid;
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
    /* Adjust Token Privileges */
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
        CloseHandle(hToken);
        return false;
    }
    // close handles
    CloseHandle(hToken);
    return true;
}

[解决办法]
CreateRemoteThread顾名思义是在目标进程创建一个线程,来执行你指定的代码。可是VB程序并不支持多线程,只要一涉及UI的函数,在非主线程里都可能造成崩溃。
LZ可以做下实验,用createthread创建一个本地线程,执行
Function xx()
msgbox "123"
end function
看看会不会奔溃,我记得点下确定就崩了
CreateRemoteThread就是其他进程帮忙创建线程,原理是一样的,还有请确定函数的地址正确性,硬编码不是什么好办法
[解决办法]
CreateRemoteThread 你要远程地址空间,和自己的地址空间互相映射。
你的程序,在自己的地址空间运行,
CreateRemoteThread创建的线程,在远程地址空间里运行。

热点排行