首页
社区
课程
招聘
[讨论]ExitPorcess退出进程时为什么会出错?[我已经简单的搞定了,设置线程SEH再退一次]
发表于: 2009-2-19 20:55 9181

[讨论]ExitPorcess退出进程时为什么会出错?[我已经简单的搞定了,设置线程SEH再退一次]

2009-2-19 20:55
9181
我已经解决了,公布一下我用的比较简单的方法,设置线程SEH,在SEH中再退一次,就不会弹错误框了。

由于已经解决了没有错误框图片了,等空些时候我重新编译一次,把错误框发上来

=========================================================

我用ASM写的程序,带多窗体,多线程,随便在那个线程用ExitProcess退出进程都完全正常,
但写的DLL给MFC写的程序用,DLL中ExitPorcess时会弹出一个错误对话框!说什么内存读写错误,真是奇怪了!!

ExitProcess的地址完全正确的,我跟踪过了,出错的地方是在调用ExitPorcess后,竟然是MFC的领空出的错!

我又改用TerminateProcess,还是会弹出错误框。

我又设置进程SEH,竟然没拦截下来!ExitPorcess后错误框还是照弹

我又先挂起所有线程(当前线程除外),再TerminateProcess或者ExitPorcess,还是弹错误框!


真是神奇了,网上搜索了下,果然又意外发现:
“ExitProcess作为api函数却bug多多,不得不令人失望。
下面列举两个ExitProcess在使用中存在的bug:
一、如果调用了公用对话框比如CFiledlg之类的,就不可以再用ExitProcess退出程序了,
否则将导致内存的非法访问!用exit却可以正常退出。
二、如果在程序中用ShellExecute等启动了另一个程序,那么就不可以再用ExitProcess退出程序了,否则将导致内存的非法访问!”

那还有什么好的办法可以安全的退出进程啊??

大家R0玩腻了,来点简单的吧

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
呵呵 并不是exitprocess出错啊
2009-2-19 20:56
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
恩,按理说调用ExitPorcess后系统应该优雅的结束一个进程了,为什么会这样呢?

MS推荐的安全结束进程的方式是什么?
2009-2-19 20:58
0
雪    币: 218
活跃值: (129)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我来告诉你为什么...哼!都是析构函数的错...不要以为调用ExitProcess后系统应该“优雅的结束”一个进程了。一点儿也不优雅...在你给出的情况里调用ExitProcess和TerminateProcess对于你自己的进程来讲没什么不同,程序运行了他们中的任何一个后就没有下文了...可是MFC有一大堆析构函数还等着你析构呢...那些公用对话框多数都申请了系统服务,你的进程退出了,当然留下了已被释放而不可读的内存块...

对了,你老是把‘ExitProcess’打成‘ExitPorcess’...嘻嘻
2009-2-19 22:59
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦,呵呵,谢谢!

我以前以为ExitProcess进入内核后就不会出来了。刚才查到点资料,ExitProcess还会通知模块进程准备退出了。

那请问该怎么才能安全的结束啊?
2009-2-19 23:07
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
VOID
WINAPI
ExitProcess(
    UINT uExitCode
    )

/*++

Routine Description:

    The current process can exit using ExitProcess.

    ExitProcess is the prefered method of exiting an application.  This
    API provides a clean application shutdown.  This includes calling
    all attached DLLs at their instance termination entrypoint.  If an
    application terminates by any other method:

        - TerminateProcess

        - TerminateThread of last thread in the process

        - ExitThread of last thread in the process

    The DLLs that the process is attached to will not be notified of the
    process termination.

    After notifying all DLLs of the process termination, this API
    terminates the current process as if a call to
    TerminateProcess(GetCurrentProcess()) were made.

Arguments:

    uExitCode - Supplies the termination status for each thread
        in the process.

Return Value:

    None.

--*/

{
    NTSTATUS Status;
    BASE_API_MSG m;
    PBASE_EXITPROCESS_MSG a = (PBASE_EXITPROCESS_MSG)&m.u.ExitProcess;

    if ( BaseRunningInServerProcess ) {
        ASSERT(!BaseRunningInServerProcess);
        }
    else {

        RtlAcquirePebLock();

        try {
            Status = NtTerminateProcess(NULL,(NTSTATUS)uExitCode);

            LdrShutdownProcess();

#if defined(BUILD_WOW6432)
            CsrBasepExitProcess(uExitCode);
#else
            a->uExitCode = uExitCode;
            CsrClientCallServer( (PCSR_API_MSG)&m,
                                 NULL,
                                 CSR_MAKE_API_NUMBER( BASESRV_SERVERDLL_INDEX,
                                                      BasepExitProcess
                                                    ),
                                 sizeof( *a )
                               );
#endif

            NtTerminateProcess(NtCurrentProcess(),(NTSTATUS)uExitCode);
            }
        finally {
                RtlReleasePebLock();
            }
    }
}
2009-2-19 23:40
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
把可怕的出错框发上来看看~~
2009-2-20 00:27
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
简单的方法就是正常流程走onExit歇菜自己~
复杂方法就是远程线程让别的进程来歇菜自己~
取巧一点的方法:用taskkill方式歇菜自己~
2009-2-20 00:30
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
王小姐果然强悍
2009-2-20 00:56
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
10
mfc的话发消息关吧
2009-2-20 05:00
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看说明:
    ExitProcess is the prefered method of exiting an application.  This
    API provides a clean application shutdown.  This includes calling
    all attached DLLs at their instance termination entrypoint.  If an
    application terminates by any other method:

        - TerminateProcess

        - TerminateThread of last thread in the process

        - ExitThread of last thread in the process

    The DLLs that the process is attached to will not be notified of the
    process termination.

    After notifying all DLLs of the process termination, this API
    terminates the current process as if a call to
    TerminateProcess(GetCurrentProcess()) were made

果然ExitProcess后系统还会在R3做很多事情
2009-2-20 09:30
0
雪    币: 218
活跃值: (129)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
ExitProcess和TerminateProcess在NT中的设计目标:
调用ExitProcess,相当于让应用程序回收已打开的系统资源再退出,而调用TerminateProcess则直接退出而期间不再执行任何用户代码。留下的僵尸资源由系统的应用程序管理器负责回收。
注:ExitProcess不执行用户自己的回收代码,也不回收用户自己定义的非系统资源;不回收进程创建后其他用户模式进程挂接进去的线程及相关系统资源(它们被当作那些进程自己的资源)。
2009-2-21 12:02
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
exit(0);试下。。。呵呵
2009-2-21 23:48
0
游客
登录 | 注册 方可回帖
返回
//