32位程序访问64位com如何与64位程序进行通信

为何32位系统的程序可以在64位上运行
按时间排序
通常情况下都是可以的,只有一部分要求极高的32位软件无法正常运行,也就是无法兼容。64位操作系统在系统盘下会有两个program file文件夹,有一个是专门存放32位软件的。
英文意思是 访问一个腐化的共享库 大至意思就说。此程序不支持或缺少某些文件,导致无法运行
不知道可不可以使用虚拟目录~~
你试试不就行了么,做程序员,要会自己动手这个不影响,好好看看64位与32位的区别我也要学习啊
完全可以运行,在外部看来感觉不到有什么问题
可以。64位系统可以向下兼容运行32位程序,但是32位系统不能运行64位程序。
可以在64位系统中运行的。但是64位的软件却并不能在32位系统中运行。附上win7 64位优缺点供参考:优点:win7 64位系统最大的优点体现在内存上。它可以使用超过4G的内存,相比与最大只能使用3G内存的32位版本来说,性能方面提升了不少。Win7 64位处理性能好于32位是事实,但也存在这样的一个误区。两台计算机均是2G内存,系统分别是win7 64位与win7 32位,你会发现win7 32位的速度要快一些;但是如果把win7 64位的内存换成4G,这时候win7 64位的性能就真正体现出来了。这也就是说,win7 64位需要更高的内存来支持它运行。缺点:过去一段时间里很多人都不选择win7 64位的系统。原因就是很多软件不支持64位,在win7 64位系统下无法运行。当时win7 64位系统的不兼容性的确让一部分人把它换掉了。但是,发展都需要一个过程,现在win7 64位系统已经不存在这样的缺点。或者应该这么说:这本来就不是它的缺点,只是当时的软件普遍适用于32位的系统,
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:64位下无法运行32位程序的解决方法 提示未指定提供程序,也没有指派的默认提供程序
互联网 & 发布时间: 16:47:38 & 作者:佚名 &
现在很多电脑装了大内存了.为了能识别到大内存.也都装上64位的系统了.但64位下有时会出现无法运行32位程序的现象.那怎么解决呢
1. cmd进入DOS的窗口,然后进入 cd /d %systemdrive%\Inetpub\AdminScripts 2. 接着执行下面操作 cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 &true& 3、iisreset 搞定~这就是一个典型的64位系统问题,由于64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程序,在2003中,则应该使用以下命令就可以了。 cmd转到dos工作区 工作目录转到C:\Inetpub\AdminScripts\ 然后运行 adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 true iisreset 就可以了 ADODB.Connection 错误 '800a0ea9' 这个问题的解决方法也蛮简单的: 脚本命令: cmd进入DOS的窗口,然后进入 cd /d %systemdrive%\Inetpub\AdminScripts 接着执行下面操作 cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 &true&
大家感兴趣的内容
12345678910
最近更新的内容64位进程和32位进程通信问题
最近遇到一个问题,64位程序向32位程序发送一个WM_COPYDATA消息, 发现传递的数据和收到的数据不对
函数代码如下,
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwD
__field_bcount(cbData) PVOID lpD
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
发送方(64位程序)
void CSendDlg::OnDataSend()
CWnd *pWnd = CWnd::FindWindow(NULL,"接收窗口的标题");
TCHAR msg[255] = "HELLO";
COPYDATASTRUCT
cpd.dwData = 0;
cpd.cbData = 255 + 1;
cpd.lpData = @
pWnd-&SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);
接收方(32位程序)
afx_msg void OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)
ON_MESSAGE(WM_COPYDATA,OnCopyData)
END_MESSAGE_MAP()
CReceiveDlg::OnCopyData( WPARAM wParm, LPARAM lParm)
TCHAR msgReceive[256];
memset(msgReceive, 0, sizeof(msgReceive));
strcpy(msgReceive, pCopyDataStruct-&lpData));
经分析,是由于传递数据是用的指针,所以会出现一个问题:指针在64位下的长度为64位,而在32位下的长度为32位,故当64位情况下指针高字节不为空时,实际上32位程序收到的指针只有低字节部分,高字节被截取了。
发送方(64位程序)自定义一个消息通知接收方(32位程序),并把要传递的数据及相关参数的值保持到本地文件;接收方收到消息后,读取本地文件的值,再给自己发送WM_COPYDATA消息(这样写的好处是WM_COPYDATA的响应函数不用改写)。
发送方(64位程序)
**#define WM_USERMSG
WM_USER + 1111
void CSendDlg()
CWnd *pWnd = CWnd(NULL,"接收窗口的标题");
pWnd-&SendMessage(WM_USERMSG, NULL, 1);
接收方(32位程序)
**#define WM_USERMSG
WM_USER + 1111
afx_msg void OnCopyData(WPARAM wParm, LPARAM lParm);
afx_msg void OnUerMsg(WPARAM wParm, LPARAM lParm);
BEGIN_MESSAGE_MAP(CMainFrame, CCJMDIFrameWnd)
ON_MESSAGE(WM_COPYDATA,OnCopyData)
ON_MESSAGE(WM_USERMSG,OnUerMsg)
END_MESSAGE_MAP()
CReceiveDlg::OnCopyData( WPARAM wParm, LPARAM lParm)
TCHAR msgReceive[256];
memset(msgReceive, 0, sizeof(msgReceive));
strcpy(msgReceive, pCopyDataStruct-&lpData));
CReceiveDlg::OnUerMsg( WPARAM wParm, LPARAM lParm )
TCHAR msg[255] = 赋值;
COPYDATASTRUCT
cpd.dwData = 赋值
cpd.cbData = 赋值 + 1;
cpd.lpData = @
SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);
没有更多推荐了,关注51Testing
如何在64位的Linux中运行32位的应用程序
发表于: 10:51 &作者:未知 & 来源:网络转载
推荐标签:
  大部分发行套件都有针对x86_64处理器的版本。比较典型的x86_64的处理器有ADM Athlon II和英特尔Xeon。因为这些Linux发行套件都有自己专用的软件源,这些软件源会为提供所有它所支持的应用软件的二进制包。如果你满足于Linux 的安装方式,你可能不会需要运行32位的程序。  一些Linux商业软件,尤其是游戏,只提供32的版本。因为某些特殊的理由,你可能需要配置你的电脑来运行32位的软件。  安装32位的支持库  因为x86_64处理器是为x86技术涉及,所以它也是支持32位程序的。在Linux里,你所需要做的就是为这些软件安装必要的软件库。幸运的是,大部分Linux发行版本已经将这些打包好了。比方在Ubuntu里,这个包就叫做ia32-libs。为了安装它,你可以打开一个终端,然后输入下面的内容:  sudo apt-get install ia32-libs  在Kubuntu中,你也可以通过Synaptic和Kpackagekit在图形界面下安装。一旦安装了之后,像游戏之类的软件就不再需要更多的配置。  图形问题  当你在一个64位的环境中运行32位的软件时,Ubuntu仍然会去寻找默认的GTK引擎。这样导致一个wrong ELF class的报错。这种情况在你运行某些特定的软件的时候特别恼人,比方说Chrome,一款新的谷歌浏览器开源版本。Ubuntu确实已经将32位版本的GTK引擎安装在了 /usr/lib32/gtk-2.0,但是我所使用的GTK项目并没有在这个位置找到。快速的解决方法如下:  1、为你现在用的主题找到32位包。比方说我,我查找了ubuntu packages  2、下载包,然后将包解压缩  3、为主题找到库文件  4、将库拷贝到lib32路径:  sudo cp ~/download-directory/usr/lib/gtk-2.0/2.10.0/engines/libqtcurve.so /usr/lib32/gtk-2.0/2.10.0/engines/  比方说Chrome,它的需要可以设置在启动脚本里: /user/lib32/gtk-2.0  如果程序的启动脚本在你运行的时候没有去看,而是去寻找 /user.lib/gtk-2.0,你可能需要修改启动脚本或者在终端里输出并设置一个环境变量:  export GTK_PATH=/usr/lib32/gtk-2.0 command-to-start-app  如果一个程序没有启动脚本,你可以像上面那样设置下环境变量。  的错误  我已经发现了像Boxee这样的应用程序,不能很好地在任何情况运行在64位系统下,即使在安装了32位的库文件也不行。这时候唯一可行的办法就是在根下运行了。
搜索风云榜
51Testing官方微信
51Testing官方微博
测试知识全知道32位程序对64位进程的远程注入实现
导语:要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode。
要对指定进程进行远程注入,通常使用Windows提供的API CreateRemoteThread创建一个远程线程,进而注入dll或是执行shellcode。
在64位系统下,该方法需要特别注意,注入的目标进程要同程序的结构保持一致,即32位程序只能对32进程作注入,64位程序只能对64位进程作注入,32位程序对64位程序进行注入时会失败(32位和64位的结构不同)。
然而,在某些特殊的环境下,无法提前预知目标进程的结构,准备两个不同版本的程序又不现实,所以只能重新思考这个问题:
32位程序真的无法对64位程序进行远程注入吗?
我在odzhan的博客里找到了解决思路,文章地址如下:
本文将会介绍实现思路,参考odzhan的开源工程”pi”,编写测试代码,生成32位程序,实现对64位进程calc.exe的进程注入,验证32位程序能够对64进程作注入的结论。
0x02 实现思路
1、32位程序支持对64位程序的读写
参考资料:
2、 利用CreateRemoteThread作进程注入的通用方法
进程注入流程:
OpenProcess
VirtualAllocEx
WriteProcessMemory
VirtualProtectEx
CreateRemoteThread
WaitForSingleObject
在具体的实现过程中,如果指定了进程名称,需要先将进程名称转换为进程ID,参考代码如下:
DWORD&processNameToId(LPCTSTR&lpszProcessName)&&
&&&&HANDLE&hSnapshot&=&CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,&0);&&
&&&&PROCESSENTRY32&&&
&&&&pe.dwSize&=&sizeof(PROCESSENTRY32);&&
&&&&if&(!Process32First(hSnapshot,&&pe))&{&&
&&&&&&&&MessageBox(NULL,&The&frist&entry&of&the&process&list&has&not&been&copyied&to&the&buffer&,&Notice&,&MB_ICONINFORMATION&|&MB_OK);&&
&&&&&&&&return&0;&&
&&&&while&(Process32Next(hSnapshot,&&pe))&{&&
&&&&&&&&if&(!strcmp(lpszProcessName,&pe.szExeFile))&{&&
&&&&&&&&&&&&return&pe.th32ProcessID;&&
&&&&&&&&}&&
&&&&return&0;&&
依次实现如下操作:
根据进程ID打开进程,获得进程句柄
申请内存空间
将内存改为可读可执行(可选)
等待线程退出(可选)
代码可参考:
对参考代码作细微修改,将注入进程名称指定为calc.exe,完整代码已上传github,地址如下:
程序运行后,查找进程calc.exe,接着尝试远程注入,弹出对话框,如图
将程序编译成x86,对32位的进程calc.exe进行注入,成功
将程序编译成x64,对64位的进程calc.exe进行注入,成功
将程序编译成x86,对64位的进程calc.exe进行注入,OpenProcess、VirtualAllocEx、WriteProcessMemory、VirtualProtectEx均正常,执行CreateRemoteThread时会报错
解决思路:
参考rgb/29a和ReWolf的思路,将此处的CreateRemoteThread切换为64位后再创建线程,完成后再切换回32位,即可实现32位程序对64位进程的远程注入
3、判断当前系统是32位还是64位
void&WINAPI&GetNativeSystemInfo(
&&_Out_&LPSYSTEM_INFO&lpSystemInfo
查看结构体中的wProcessorArchitecture可获得CPU架构,进而判断操作系统
代码如下:
#include&&windows.h&
BOOL&Is64BitOS()
&&&&typedef&VOID&(WINAPI&*LPFN_GetNativeSystemInfo)(&__out&LPSYSTEM_INFO&lpSystemInfo&);
&&&&LPFN_GetNativeSystemInfo&fnGetNativeSystemInfo&=&(LPFN_GetNativeSystemInfo)GetProcAddress(&GetModuleHandle(&kernel32&),&GetNativeSystemInfo&);
&&&&if(fnGetNativeSystemInfo)
&&&&&&&&SYSTEM_INFO&stInfo&=&{0};
&&&&&&&&fnGetNativeSystemInfo(&&stInfo);
&&&&&&&&if(&stInfo.wProcessorArchitecture&==&PROCESSOR_ARCHITECTURE_IA64
&&&&&&&&&&&&||&stInfo.wProcessorArchitecture&==&PROCESSOR_ARCHITECTURE_AMD64)
&&&&&&&&&&&&return&TRUE;
&&&&return&FALSE;
int&main()
&&&&if&(Is64BitOS())&&&
&&&&&&&&printf(&x64\n&);
&&&&&&&&printf(&x86\n&);
&&&&return&0;
4、判断注入的进程是32位还是64位
查找进程ID,打开进程,获得句柄,使用API,传入参数,进行判断
BOOL&WINAPI&IsWow64Process(
&&__in&HANDLE&hProcess,
&&__out&PBOOL&Wow64Process
返回true, 代表进程是32位,否则是64位
完整代码如下:
#include&&windows.h&
#include&&TlHelp32.h&&&
BOOL&IsWow64(HANDLE&hProcess)
&&&&typedef&BOOL&(WINAPI&*LPFN_ISWOW64PROCESS)&(HANDLE,&PBOOL);
&&&&LPFN_ISWOW64PROCESS&fnIsWow64P
&&&&BOOL&bIsWow64&=&FALSE;
&&&&fnIsWow64Process&=&(LPFN_ISWOW64PROCESS)GetProcAddress(
&&&&GetModuleHandle(&kernel32&),&IsWow64Process&);
&&&&if&(NULL&!=&fnIsWow64Process)
&&&&&&&&fnIsWow64Process(hProcess,&&bIsWow64);&&
&&&&return&bIsWow64;
DWORD&processNameToId(LPCTSTR&lpszProcessName)&&
&&&&HANDLE&hSnapshot&=&CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,&0);&&
&&&&PROCESSENTRY32&&&
&&&&pe.dwSize&=&sizeof(PROCESSENTRY32);&&
&&&&if&(!Process32First(hSnapshot,&&pe))&{&&
&&&&&&&&MessageBox(NULL,&&&
&&&&&&&&&&&&&The&frist&entry&of&the&process&list&has&not&been&copyied&to&the&buffer&,&Notice&,&MB_ICONINFORMATION&|&MB_OK);&&
&&&&&&&&return&0;&&
&&&&while&(Process32Next(hSnapshot,&&pe))&{&&
&&&&&&&&if&(!strcmp(lpszProcessName,&pe.szExeFile))&{&&
&&&&&&&&&&&&return&pe.th32ProcessID;&&
&&&&&&&&}&&
&&&&}&&&&&
&&&&return&0;&&
int&main()
&&&&BOOL&&&&&&&&&&&bWow64;&&
&&&&char&*szExeName=&calc.exe&;&&
&&&&DWORD&dwProcessId&=&processNameToId(szExeName);&&
&&&&if&(dwProcessId&==&0)&{&&
&&&&&&&&MessageBox(NULL,&&The&target&process&have&not&been&found&!&,&Notice&,&MB_ICONINFORMATION&|&MB_OK);&&
&&&&&&&&return&-1;&&
&&&&HANDLE&hTargetProcess&=&OpenProcess(PROCESS_ALL_ACCESS,&FALSE,&dwProcessId);&&&&&
&&&&if&(!hTargetProcess)&{&&
&&&&&&&&MessageBox(NULL,&&Open&target&process&failed&!&,&&&
&&&&&&&&&&&&&Notice&,&MB_ICONINFORMATION&|&MB_OK);&&
&&&&&&&&return&0;&&
&&&&bWow64&=&IsWow64(hTargetProcess);
&&&&if(bWow64)
&&&&&&&&printf(&32-bit&process\n&);
&&&&&&&&printf(&64-bit&process\n&);
5、开源工程pi
下载地址:
usage:&pi&[options]&&proc&name&|&proc&id&
&&&&&&&-d&&&&&&&&&&Wait&after&memory&allocation&before&running&thread
&&&&&&&-e&&cmd&&&&&Execute&command&in&context&of&remote&process&(shows&window)
&&&&&&&-f&&file&&&&Load&a&PIC&file&into&remote&process
&&&&&&&-l&&dll&&&&&Load&a&DLL&file&into&remote&process
&&&&&&&-p&&&&&&&&&&List&available&processes&on&system
&&&&&&&-x&&cpu&&&&&Exclude&process&running&in&cpu&mode,&32&or&64
&&&&pi&-e&&cmd&/c&echo&this&is&a&test&&&test.txt&&&notepad&test.txt&&-x32&iexplore.exe
&&&&pi&-l&ws2_32.dll&notepad.exe
&&&&pi&-f&reverse_shell.bin&chrome.exe
测试系统:
pi32.exe -e &cmd /c start calc.exe& -x32 calc.exe
上述命令将对64位的calc.exe进行注入
payload没有成功执行
0x03 最终代码
虽然pi测试失败,但是代码值得参考,提取关键代码,开发测试程序
测试程序结构如下:
判断当前系统
如果为32位系统,&调用系统api&CreateRemoteThread,对目标进程尝试远程注入,弹出对话框
如果为64位系统,进入下一个分支,对进程判断
判断进程calc.exe
如果为32位,调用系统api&CreateRemoteThread,对目标进程尝试远程注入,弹出对话框
如果为64位,调用自定义api&CreateRemoteThread64,对目标进程尝试远程注入,执行payload:”cmd&/c&start&calc.exe”
完整代码已上传github,下载地址如下:
0x04 实际测试
测试系统:
1、将程序编译成32位,打开64位calc.exe
2、运行测试程序
命令行输出如图
成功执行payload:”cmd /c start calc.exe”,弹出计算器
本文介绍了32位程序对64位进程远程注入的实现方法,参照以上代码可实现Windows 32位/64位系统下进程注入的通用模板。
感谢您的支持,我会继续努力的!
你可能感兴趣的
嘶吼特约作者}

我要回帖

更多关于 64位下运行32位程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信