这个调试之后会显示rdpclip.exe无法运行行 为什么!!

以下试题来自:
单项选择题将调试通过的工程经“文件”菜单中的“生成exe文件”编译成为exe文件后,该可执行文件到其他机器上不能运行的主要原因是(
)。A.运行的机器上无VB系统B.缺少.fan窗体文件C.该可执行文件有病毒D.以上原因都不对
为您推荐的考试题库
你可能感兴趣的试题
1A.显示出错信息B.123456C."579"D.5792A.TabStopB.EnabledC.VisibleD.Tablndex34A.输出信息B.定义提示信息C.定义隐含信息D.定义输入的位置
热门相关试卷
最新相关试卷为什么我的NX 6启动时错误:此软件无法运行于被调试状态如需使用本软件请关闭调试器再次运行
       NX 6的这个启动报错我知道是装了SolidWorks 2009 SP0.0的原因造成的,有谁知道在不卸载SolidWorks 2009 SP0.0的前题下,能否解决此问题.谢谢了!
09-11-30 &匿名提问
1. MSDN并没有骗人,CreateProcess的确是在其用户态部分,准确地说是在CreateProcessInternalW中检测dwCreationFlag,当dwCreationFlag中包括DEBUG_PROCESS 或DEBUG_ONLY_THIS_PROCESS时,系统将直接跳过对Image File Execution Options的检测。2. CreateProcessInternalW调用了ntdll.dll导出的LdrQueryImageFileExecutionOptions函数来检测Image File Execution Options项目,而LdrQueryImageFileExecutionOptions调用了ZwOpenKey和(如果ZwOpenKey证实项目存在)ZwQueryKey去检测并获得(如果存在)Debugger键值,之后回到kernel32.dll,把Debugger键值和原程序路径Append,并在堆栈中替换掉原程序路径的地址。3. 以上过程是循环的,即如果此时Debugger键值中的程序又被IFEO了,将再来……直到不再有。但是如果造成了死循环,最后命令行长度越来越长,似乎要等于长度超过系统的限制,才跳出循环并提示“找不到文件”(当然这个提示是Windows在自欺欺人)。4. 根据1及2,我们在程序中要创建进程,如果想不受IFEO的限制,除了干脆加上DEBUG_PROCESS 或DEBUG_ONLY_THIS_PROCESS参数,把自己作为新进程的调试器外,还可以弄些较“猥琐”的方法,比如从前面提到的几个关键跳转处作文章,或者或干脆SSDT HOOK等方法搞掉自身进程空间中的或整个系统级上的ZwOpenKey等(HOOK这些的话,由于一般情况下应用程序CreateProcess都要IFEO检测,HOOK了这个还可以反过来“虚拟”一个Debugger键出来,作为隐蔽的启动自身组件的方法)。5. IFEO的Debugger键结果,并不只是启动另一个程序,而且还把原程序的地址当成参数传递了,这一点是我们这些菜鸟提到这一键的作用时经常忽略的。所以,如果一个病毒利用IFEO劫持的目的,不包括把安全软件禁用掉,而只是为了在原程序被触发时,作为启动病毒自身的方式,那么,就很容易利用这一点,只需要病毒程序自身启动后,GetCommandLine,得到原先要启动的程序地址,再利用上面说的方法,启动原先的正常程序即可。这样做可以让多个程序的IFEO劫持Debugger键指向同一个病毒程序,而每次却都能够正常启动原程序。这样一般用户在触发这一项时,根本不会有感觉,毕竟如果不是用Process Explorer等工具,而是光看任务管理器的话,用户将难以看出自己运行的正常程序,却是建立在一个可疑的有危险的病毒父进程之下的。==================================后记:在调试完之后,写这篇文章的过程中,搜了网上关于Image File Execution Options的文章,发现一篇比较不错的“详解WINDOWS映像劫持技术”,显然作者也是“同道中人”,而且文笔不错。其中提到:这个招数被广大使用“映像劫持”技术的恶意软件所青睐,随着OSO这款超级U盘病毒与AV终结者(随机数病毒、8位字母病毒)这两个灭杀了大部分流行安全工具和杀毒软件的恶意程序肆虐网络以后,一时之间全国上下人心惶惶……呵呵,还有人记得OSO.exe啊,那的确是我印象中最早大规模使用IFEO劫持的U盘病毒,当时我抢先分析了一下,虽然分析得很菜,被MJ狂贬,但是却印象颇深。当时用OD,只会看字符串,跟现在这篇文章的调试比起来,真是差太远了。对于IFEO的检测,该文提到:一个程序启动时是否会调用到IFEO规则取决于它是否“从命令行调用”的……为了与用户操作区分开来,系统自身加载的程序、调试器里启动的程序,它们就不属于“从命令行调用”的范围,从而绕开了IFEO,避免了这个加载过程无休止的循环下去。从编程角度来说明“命令行调用”,那就是取决于启动程序时CreateProcess是使用lpCommandLine(命令行)还是 lpApplicationName(程序文件名)来执行,默认情况下大部分程序员编写的调用习惯是lpCommandLine——命令行调用经过这次调试,我个人觉得这种说法不是很妥当。调试器启动程序仍然是用lpCommandLine启动,区别只不过是dwCreationFlags的值的设置。而就算用lpApplicationName,到了CreateProcessInternalW里面那个判断,以及接下来的步骤,都是一样的,应该是在此之前就已经把整个命令行连起来处理了。所以结果是,仍然受到IFEO限制,没什么不同。上面这几句话,容易让人以为调试器调试程序不是用用lpCommandLine启动的,或是用lpApplicationName就不受IFEO限制,这是误解。
请登录后再发表评论!
可以上屏时电脑显示器中的监视窗口没画面吗?如果是,肯定是设置有问题。在设置菜单/硬件设置/[板卡名称]/视频叠加显示设置中设置一下“叠加显示刷新”就可以了。默认是UpdateOverlay,改成Lock/Unlock,确定并重新启动EDIUS软件。如果监视窗口仍然没有显示,在上述设置中再改回UpdateOverlay,确定并重新启动EDIUS软件就可以解决监视窗口显示问题。如果仍然没有解决,有可能是你的系统中有播放器一类的软件强制占用显示卡资源,必须关闭这类软件释放资源。板卡名称:DVStorm系列~DVStorm-RT、DVStormXA(Plus)~DVX-E1、EDIUS NX~NHX-E1(或E2)、EDIUS SP~E1(或E2)实在着急的话,在设置菜单/工程设置中点击“更改当前设置”,将输出设备选择成General OHCI SD PAL就可以。这是一个应急方法,建议在工作完成后仍照上边的方法调试。 参考资料:
请登录后再发表评论!
1.看看安装路径中有没有中文的,不支持中文路径2.nero8不会影响UG,你的UG安装包本来也是镜像文件,是要你导入到虚拟光驱中进行安装的,这样才能安装完整
请登录后再发表评论!5350人阅读
让EXE文件不能直接启动的方法以防止直接调试的方法
游戏中经常需要这样的技术,即让游戏主程序不能直接启动,通过这样的方式,可以在一定程序上达到防止调试的目的,虽然仅仅是最最简单的防止,但是仍然有一定的作用。
这里讲讲这样的技术。。。。。其实研究甚浅。。。。
基本思路有两种,其一就是直接破坏PE头,那么此文件根本无法加载,自然更没有办法加载了。但是我们自己必须的完全模拟系统加载PE文件的过程,代价有点大。所以,虽然此方案更好,但是我没有深入的研究。其二就是仅仅破坏一段有效的代码,只要你在程序必须执行的地方插入了一堆无效数据,程序自然一运行就崩溃。目的达到了。
这里从破坏《》文中介绍的一个最简单的程序开始。
原程序源代码:
.486&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&; create 32 bit code.model&flat, stdcall&&&&&&&&&&&&&&&&; 32 bit memory modeloption&casemap&:none&&&&&&&&&&&&&&&&; case sensitiveinclude&windows.incinclude&masm32.incinclude&user32.incinclude&kernel32.incincludelib&masm32.libincludelib&user32.libincludelib&kernel32.lib.data&&&&szCaption&db&"A MessageBox !",0&&&&szText&db&"Hello,World !",0.codestart:&&&&invoke&MessageBox,NULL,offset&szText,/&&&&&&&&&&&&offset&szCaption,MB_OK&&&&invoke&ExitProcess,NULLend&start
反汇编的代码:
&/$& 6A 00&&&&&&&& PUSH&&& 0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; /Style = MB_OK|MB_APPLMODAL
& |.& 68 && PUSH&&& helloWor.&&&&&&&&&&&&&&& ; |Title = "A MessageBox !"
& |.& 68 0F304000&& PUSH&&& helloWor.0040300F&&&&&&&&&&&&&&& ; |Text = "Hello,World !"
0040100C& |.& 6A 00&&&&&&&& PUSH&&& 0&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&; |hOwner = NULL
0040100E& |.& E8 && CALL&&& &JMP.&user32.MessageBoxA&&&&&&&& ; /MessageBoxA
& |.& 6A 00&&&&&&&& PUSH&&& 0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; /ExitCode = 0
& /.& E8 && CALL&&& &JMP.&kernel32.ExitProcess&&&&&& ; /ExitProcess
0040101A&& $- FF25
JMP&&&& NEAR DWORD PTR [&&user32.Message&;& user32.MessageBoxA
&& .- FF25
JMP&&&& NEAR DWORD PTR [&&kernel32.ExitP&;& kernel32.ExitProcess
这里我将其前一个字节改为55,那么其前三句将会解析成如下形式:
&/$& 55&&&&&&&&&&& PUSH&&& EBP&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ; |Title = ""
& |.& 0068 00&&&&&& ADD&&&& BYTE PTR [EAX], CH&&&&&&&&&&&&&& ; |
& |.& 3040 00&&&&&& XOR&&&& BYTE PTR [EAX], AL&&&&&&&&&&&&&& ; |
这是再运行这个程序必然是崩溃的。这里必须要我们自己的程序去修复它,然后再运行它才能运行成功,这里以一个字节的修改为例,其实实际中你愿意改多少,改多少段完全是由你自己决定的。
启动程序基本思路及过程如下,首先用CreateProcess启动刚才修改过的应用程序,但是将其挂起,然后用VirtualProctectEx函数将挂起的进程需要修改的代码段属性设为可写,然后再用WriteProcessMemroy函数将正确的结果写入,然后再通过ResumeThread将挂起的进程运行。这时,就可以通过你的启动程序去启动被破坏的程序了,而正常情况下,被破坏的程序只能是由你的启动程序来启动。
全部启动源代码如下:
&1 #include &windows.h&&2 #include &tchar.h&&3 &4 &5 int&main(int&argc, char* argv[])&6 {&7 &&&&STARTUPINFO&8 &&&&PROCESS_INFORMATION&9 &&&&LPTSTR szCmdline=_tcsdup(TEXT("HelloWorld2"));10 &&&&11 &&&&ZeroMemory( &si, sizeof(si) );12 &&&&si.cb = sizeof(si);13 &&&&ZeroMemory( &pi, sizeof(pi) );14 &&&&15 &&&&// Start the child process. 16 &&&&if( !CreateProcess( NULL,&& // No module name (use command line)17 &&&&&&&&szCmdline,&&&&&&// Command line18 &&&&&&&&NULL,&&&&&&&&&& // Process handle not inheritable19 &&&&&&&&NULL,&&&&&&&&&& // Thread handle not inheritable20 &&&&&&&&FALSE,&&&&&&&&&&// Set handle inheritance to FALSE21 &&&&&&&&CREATE_SUSPENDED,&&&&&&&&&&&&&&// Suspended the process, the key!22 &&&&&&&&NULL,&&&&&&&&&& // Use parent's environment block23 &&&&&&&&NULL,&&&&&&&&&& // Use parent's starting directory 24 &&&&&&&&&si,&&&&&&&&&&&&// Pointer to STARTUPINFO structure25 &&&&&&&&&pi )&&&&&&&&&& // Pointer to PROCESS_INFORMATION structure26 &&&&&&&&) 27 &&&&{28 &&&&&&&&printf( "CreateProcess failed (%d)./n", GetLastError() );29 &&&&&&&&return&-1;30 &&&&}31 &&&&32 &&&&DWORD ldwOldPro = 0;33 &&&&if(!VirtualProtectEx(pi.hProcess, (void*)0x401000, 1, PAGE_EXECUTE_READWRITE, &ldwOldPro))34 &&&&{35 &&&&&&&&printf( "VirtualProtectEx failed (%d)./n", GetLastError() );36 &&&&&&&&TerminateProcess(pi.hProcess, -1);37 &&&&&&&&// Close process and thread handles. 38 &&&&&&&&CloseHandle( pi.hProcess );39 &&&&&&&&CloseHandle( pi.hThread );40 &&&&&&&&return&-1;41 &&&&}42 &&&&43 &&&&DWORD ldwWritten = 0;44 &&&&BYTE lbt = 0x6A;45 &&&&if(!WriteProcessMemory(pi.hProcess, (void*)0x401000, &lbt, 1, &ldwWritten))46 &&&&{47 &&&&&&&&printf( "WriteProcessMemory failed (%d)./n", GetLastError() );48 &&&&&&&&TerminateProcess(pi.hProcess, -1);49 &&&&&&&&// Close process and thread handles. 50 &&&&&&&&CloseHandle( pi.hProcess );51 &&&&&&&&CloseHandle( pi.hThread );52 &&&&&&&&return&-1;53 &&&&}54 &&&&55 &&&&if(!VirtualProtectEx(pi.hProcess, (void*)0x401000, 1, ldwOldPro, &ldwOldPro))56 &&&&{57 &&&&&&&&printf( "VirtualProtectEx failed (%d)./n", GetLastError() );58 &&&&&&&&TerminateProcess(pi.hProcess, -1);59 &&&&&&&&// Close process and thread handles. 60 &&&&&&&&CloseHandle( pi.hProcess );61 &&&&&&&&CloseHandle( pi.hThread );62 &&&&&&&&return&-1;63 &&&&}64 &&&&65 &&&&if(-1==ResumeThread(pi.hThread))66 &&&&{67 &&&&&&&&printf( "ResumeThread failed (%d)./n", GetLastError() );68 &&&&&&&&TerminateProcess(pi.hProcess, -1);69 &&&&&&&&// Close process and thread handles. 70 &&&&&&&&CloseHandle( pi.hProcess );71 &&&&&&&&CloseHandle( pi.hThread );72 &&&&&&&&return&-1;73 &&&&}74 75 76 77 &&&&// Wait until child process exits.78 &&&&WaitForSingleObject( pi.hProcess, INFINITE );79 80 &&&&// Close process and thread handles. 81 &&&&CloseHandle( pi.hProcess );82 &&&&CloseHandle( pi.hThread );83 84 &&&&85 &&&&return&0;86 }
再次说明,这里仅仅是示例,所以仅仅修改了一个字节,假如你改动字节比较多的话,直接通过OD或者SoftIce来调试你的应用程序就没有办法了,当然,假如你的启动程序没有任何防护,是可以先调试你的启动程序的。
但是方法有个完全的破坏方法,那就是Dump。
Dump方法:
因为此例实在是太过于简单,所以在程序运行后,也就是弹出对话框后,再调用LordPE载入进程Dump也完全可以,但是在实际中,可能因为程序在启动时修改该了一些全局的数据,此时Dump会有问题。
正确的Dump步骤应该是在程序恢复运行的一瞬间,也就是将要启动却还未启动的时候。以前在一个程序将要启动却还未启动时Dump有个小技巧,那就是将其前一个字节修改为0xCC,那么,启动的一瞬间就会出现调试中断,然后将OD等调试工具设为默认调试工具,就可以在此时中断进程,并进行Dump,但是在此例中比较特殊,因为第一个字节本来就是由程序写入的,所以你没有办法通过修改文件首字节的办法来完成工作:)而且就我注意到,目前所有可以Dump的程序(也许是我见得不多,
一文中介绍的Dump工具我都用过)
都是先遍历进程,然后再Dump的,但是挂起还没有运行的进程它们竟然都检查不出来-_-!这点我很奇怪,我也不知道他们都是用什么来遍历进程的,但是windows的任务管理器就可以遍历出来(Windows的任务管理器其实相当的强悍,以前我做了一个进程占用CPU,内存资源百分比的监视工具,才知道要做好那么多任务不是那么简单的)。
呵呵,可以进行的办法是动态修改首字节,或者自己写一个给出进程ID就可以进行Dump的工具。。。。或者直接修改我比较习惯的LordPE的遍历进程方式,让其可以遍历出挂起的进程。。。。
这里我做个程序用于Dump上述程序。
此程序用于将指定进程ID的进程首字节动态改为CC以出现调试中断,并且将原有的首字节读取出来,并输出,以方便中断出现后,在OD中将其改为原有值,然后Dump。经测试,此方式的确可以做到Dump上述动态修改的挂起进程的目的:)
此程序也起到了很方便的作用:)
源代码如下:
&1 #include "windows.h"&2 int main(int argc, char* argv[])&3 {&4 &&&&printf("Give me a Process ID: ");&5 &6 &&&&DWORD ldwPid = 0;&7 &&&&scanf("%d", &ldwPid);&8 &9 &&&&HANDLE lhPro = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,10 &&&&&&&&FALSE, ldwPid);11 12 &&&&if(lhPro == NULL)13 &&&&{14 &&&&&&&&printf( "Error Process ID(%u) or OpenProcess failed (%d)./n",ldwPid, GetLastError() );15 &&&&&&&&return -1;16 &&&&}17 18 &&&&DWORD ldwOldPro = 0;19 &&&&if(!VirtualProtectEx(lhPro, (void*)0x, PAGE_EXECUTE_READWRITE, &ldwOldPro))20 &&&&{21 &&&&&&&&printf( "VirtualProtectEx failed (%d)./n", GetLastError() );22 &&&&&&&&CloseHandle( lhPro );23 &&&&&&&&return -1;24 &&&&}25 26 &&&&DWORD ldwReaded = 0;27 &&&&BYTE lbtFirst = 0;28 &&&&if(!ReadProcessMemory(lhPro, (void*)0x401000, &lbtFirst, 1, &ldwReaded))29 &&&&{30 &&&&&&&&printf( "ReadProcessMemory failed (%d)./n", GetLastError() );31 &&&&&&&&CloseHandle( lhPro );32 &&&&&&&&return -1;33 &&&&}34 35 36 &&&&DWORD ldwWritten = 0;37 &&&&BYTE lbt = 038 &&&&if(!WriteProcessMemory(lhPro, (void*)0x401000, &lbt, 1, &ldwWritten))39 &&&&{40 &&&&&&&&printf( "WriteProcessMemory failed (%d)./n", GetLastError() );41 &&&&&&&&CloseHandle( lhPro );42 &&&&&&&&return -1;43 &&&&}44 45 &&&&printf( "First BYTE Changed to CC,and origin first BYTE is %X./n", lbtFirst);46 47 &&&&if(!VirtualProtectEx(lhPro, (void*)0x, ldwOldPro, &ldwOldPro))48 &&&&{49 &&&&&&&&printf( "VirtualProtectEx failed (%d)./n", GetLastError() );50 &&&&&&&&CloseHandle( lhPro );51 &&&&&&&&return -1;52 &&&&}53 &&&&// Close process handles. 54 &&&&CloseHandle( lhPro );55 56 57 &&&&58 &&&&return 0;59 }
因为此程序已经有一定的实用性,方便了目前不是太方便的动态修改头字节为CC以实现Dump动态修改并挂起的进程,为了方便不喜欢编译的兄弟,我将其编译后放到,名字为DynamicChangeFirstBYTE.exe
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2838291次
积分:30870
积分:30870
排名:第166名
原创:376篇
转载:22篇
评论:1976条
此博客将为的编程相关内容的镜像站. 扫描二维码, 关注作者:
(1)(1)(1)(1)(1)(2)(2)(6)(1)(1)(4)(1)(2)(2)(4)(1)(1)(4)(4)(7)(3)(9)(28)(8)(4)(9)(2)(9)(10)(10)(18)(9)(18)(6)(24)(12)(5)(15)(14)(7)(15)(18)(11)(1)(1)(7)(2)(1)(7)(1)(3)(4)(2)(6)(4)(6)(15)(8)(26)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'求助!!!!!!VS2013不能调试和运行程序!!!!!!!!!!!【visualstudio吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,286贴子:
求助!!!!!!VS2013不能调试和运行程序!!!!!!!!!!!收藏
今天第一次装了VS2013 编写完了点F5
就闪了一下,出现以下信息:“Project1.exe”(Win32):
已加载“D:\C语言程序\Project1\Debug\Project1.exe”。已加载符号。“Project1.exe”(Win32):
已加载“C:\Windows\SysWOW64\ntdll.dll”。已加载符号。“Project1.exe”(Win32):
已加载“C:\Windows\SysWOW64\kernel32.dll”。已加载符号。“Project1.exe”(Win32):
已加载“C:\Windows\SysWOW64\KernelBase.dll”。已加载符号。“Project1.exe”(Win32):
已加载“C:\Windows\SysWOW64\msvcr120d.dll”。已加载符号。程序“[11504] Project1.exe”已退出,返回值为 0 (0x0)。
点ctrl+f5也是闪一下
什么都没出来~程序编的肯定没问题,是最简单那种,请问如何解决呢!~?????
私人教练,全民健身先驱者,引领健康新潮流的行业
一切正常啊,闪一下就是运行完了啊,运行完就退出了啊。估计楼主期待运行完就停着,“按任意键继续”……这个东西早就没了→_→,想停的话,要不用CB,Dev……要不在return 0那里加个断点
建立的是win32控制台工程吗?
求大神,我也是闪一下就什么都看不见
加一个系统暂停
那如果是C#呢,求大神指导呀
楼主我新装的VS2013,也出现了和你类似的问题,但用了你的方法仍不起作用,请问是什么问题!
登录百度帐号推荐应用

我要回帖

更多关于 exe文件无法运行 的文章

 

随机推荐