帮助文档中没有raw.remoteApi的说明,简单讲一下:
call的语法与声明普通API一样,只需要用同样的语法来定义函数形参,只是多了一个进程ID的参数.
其实这个函数的使用很简单,有两种用法.
根据最新编码规范,call函数请添加_call后缀 |
1、直接通过函数地址call- func_call = raw.remoteApi(这里是进程ID,"void()", 这里是函数地址,"cdcel")
复制代码 第二个参数定义函数的参数,参考api的语法,是完全一致的,第四个参数指定调用约定,有stdcall与cdcel两种
2、在目标EXE中注入DLL,然后再调用该DLL的API函数,例如- MessageBox_call = raw.remoteApi(processId,"void ( int hWnd, string &lpText,string &lpCaption ,INT uType )","User32.dll","MessageBoxA");
-
复制代码 下面是完整的示例
//remote call Api调用
//直接调用外部EXE进程中的函数,就是一种通用的CALL,这样可以在外部进程中做很多的事,例如枚举一个外部EXE窗体中的一个树形控件中所有的项,比鼠标键盘模拟更加快、直接。*/
import winex; //引用winex库
IsWindowVisible = ::User32.api("IsWindowVisible","int(int hwnd)")
//遍历桌面所有窗口
for hwnd,title,theadId,processId in winex.each( ) {
if(title!="" && IsWindowVisible(hwnd) /*不然下面的看不到了*/) //如果窗口标题不为空
{
//在目标进程内声明一个函数,加载user.dll,并获取user.dll中的MessageBoxA函数指针
var messageBox_call = raw.remoteApi(processId,"void ( int hWnd, string &lpText,string &lpCaption ,INT uType )","User32.dll","MessageBoxA");
//象普通函数一样使用
messageBox_call(0,"这是一个外部进程!在此进程加载了User32.dll,并获取执行了MessageBoxA函数指针","AAuto Call",0)
//将外部进程的函数地址直接转换为普通函数
//RemoteMessageBox = raw.remoteApi(processId,"void ( int hWnd, string &lpText,string &lpCaption ,INT uType )",0x7e4507ea);
//象普通函数一样使用
//RemoteMessageBox(0,"这是一个外部进程,我直接使用该进程的函数地址调用了该函数","AAuto Call",0)
break ;
}
}
注意CALL是敏感的操作,需要事先关闭所有临控软件,不然会报警
阅读(1074) | 评论(0) | 转发(1) |