php调用dos命令执行exe文件获取信息

php调用编译的exe文件,php只有权限,没有操作exe可执行文件的权限,但是php可以用exec执行dos命令,exe文件可以用程序遍历窗口,编辑器传值,封装为dos命令传到窗口中,然后操作按钮或者文件抓到返回信息。感谢茂茂大神的帮忙,代码如下:

#include <cstdio>
#include <windows.h>
#include <string>
#include <atlconv.h>
using namespace std;

int main(int argc,char * argv[])
{

USES_CONVERSION; //这个宏是为了下面使用 A2W 将ascii转换成unicode
//下面findwindow 根据程序窗口字符串来查找主窗口,可以用spy++,没有的话跟我拿我写的一个
HWND hParent = FindWindow(NULL,L"Safe3 Web漏洞扫描系统企业版v10.1   Crack  By  Lkou[LCG]   Http://www.52pojie.cn");
//判断输入的网址是否为空,为空提示退出
if (argv[1] == NULL){
printf("输入格式:set.exe http://www.baidu.com");
return 0;
}
//将参数网址转换成宽字符串
wstring str(A2W(argv[1]));
//判断主窗口是否找到,没找到提示退出
if (hParent == NULL)
{
printf("没有找到匹配窗口,请确定safe3已经运行\n");
return 0;

}
//printf("%d",hParent); //测试用的
//找到主窗口,接下来遍历子窗口
HWND hchild = GetWindow(hParent, GW_CHILD);
HWND hButton = NULL;
BOOL flag = FALSE;
//循环遍历子窗口,有些子窗口嵌套在其他子窗口内,这个代码遍历不出来的,因为只是要那个编辑框,还有按钮,所以深层遍历我就没写
//如果需要,知道原理后,自己很容易实现

while (hchild != NULL)
{
RECT rcchild;

//得到子窗口的大小
GetWindowRect(hchild, &rcchild);
//得到的子窗口大小是相对于整个屏幕坐标系的,所以要调用下面函数转换,得到相对于主窗口的大小
//我们这里只关心left ,top成员就够了
ScreenToClient(hParent, (LPPOINT)&rcchild);
//printf("找到%d ID:%d 窗口位置:%d %d\n",hchild,GetDlgCtrlID(hchild),rcchild.left,rcchild.top);

//根据位置判断是否是按钮
if (rcchild.left == 676 && rcchild.top == 27)
{
hButton = hchild;

if (flag == TRUE)
{
//ShowWindow(hButton, SW_SHOW);//可以隐藏按钮,测试是否能真正操作那个按钮
SendMessage(hButton, BM_CLICK,0,0); //发送click消息,点击
}
}
//×××注意:这里不知道先遍历出来按钮还是先遍历出来 编辑框,所以用了个flag,以防止,编辑框还没内容的时候 点击按钮
//调式很多次都是先遍历出来编辑框的
//这里就是判断是否是编辑框,如果是的话,那么就发消息
if (rcchild.left == 25 && rcchild.top == 29)
{
::SendMessage(hchild,EM_SETSEL,0,-1);
::SendMessage(hchild, WM_CLEAR, 0, 0);
//上面这两个消息是清空编辑框
//下面的循环是吧我们参数的字符床发送到编辑框上面,解决了中文乱码问题

for (int i = 0; i < str.length(); i++)
::SendMessage(hchild,WM_CHAR,str.at(i),NULL);
if (hButton != NULL)
{
//这里也只是看是按钮先遍历出来还是编辑框
::SendMessage(hButton,BM_CLICK, 0, 0);
break;
}
else
flag = TRUE;

}
//如果都不是的话那么我们就遍历下一个子窗口
hchild = GetWindow(hchild, GW_HWNDNEXT);

}
return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注