Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4738797
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-08-20 19:36:33

帮助文档中没有raw.remoteApi的说明,简单讲一下:

call的语法与声明普通API一样,只需要用同样的语法来定义函数形参,只是多了一个进程ID的参数.
其实这个函数的使用很简单,有两种用法.

根据最新编码规范,call函数请添加_call后缀


1、直接通过函数地址call
  1. func_call = raw.remoteApi(这里是进程ID,"void()", 这里是函数地址,"cdcel")
复制代码
第二个参数定义函数的参数,参考api的语法,是完全一致的,第四个参数指定调用约定,有stdcall与cdcel两种

2、在目标EXE中注入DLL,然后再调用该DLL的API函数,例如
  1. MessageBox_call = raw.remoteApi(processId,"void ( int hWnd, string &lpText,string &lpCaption ,INT uType )","User32.dll","MessageBoxA");
  2.       
复制代码
下面是完整的示例

//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是敏感的操作,需要事先关闭所有临控软件,不然会报警
阅读(1030) | 评论(0) | 转发(1) |
0

上一篇:关机代码

下一篇:快手支持汇编

给主人留下些什么吧!~~