2010-11-26 15 views
6

현재 회사에서 작성한 응용 프로그램을 테스트하고 있습니다. 시나리오 중 하나는 응용 프로그램이 중단 될 경우 시스템 상태에 어떤 변화가 발생했는지 확인하는 것입니다. 내 응용 프로그램을 강제로 강제 실행할 수있는 응용 프로그램이 있습니까? 차라리 코드 자체에 충돌을 작성하지 않을 것입니다 (즉, null 포인터 비 참조). 작업 관리자를 사용하여 프로세스를 종료해도 동일한 결과가 발생하지 않습니다.응용 프로그램 강제 종료

+0

와 충돌 할 응용 프로그램 스레드로 변경해야한다 이 문제를 해결하려면 이미이 문제를 처리 할 수있는 앱을 모른다. –

+0

대구의 중간에 간단한 exit()를 넣을 수 없습니까? 아니면 "부서지기"로 간주되지 않습니까? – Raveline

+0

시스템 상태 란 무엇입니까? 일반적으로 프로세스가 충돌하면 시스템은 사용 된 모든 리소스를 정리합니다. 그러나 이것은 데이터베이스 핸들과 같은 것으로 확장되지 않을 수도 있습니다. 시스템 상태를 어떻게 점검 할 것입니까? – Nick

답변

9

Windows를 사용하는 경우 Application Verifier을 참조하십시오.

구성 가능한 속도로 다양한 API 호출을 실패하게하는 결함 주입 (낮은 리소스 시뮬레이션)을 수행 할 수 있습니다. 예 : 힙 할당, 가상 Alloc, WaitForXxx, 레지스트리 API, 파일 시스템 API 등.

시작 중에 오류가 삽입되지 않을 경우 유예 기간 (밀리 초)을 지정할 수도 있습니다.

+0

니스,이 도구에 대해 몰랐습니다. 그것은 매우 유용 할 것 같아! –

-1

코드에서 abort() 함수를 호출하십시오. 다른 프로그램은 프로그램을 안정적으로 "크래시"할 수 없습니다. 프로그램의 컨텍스트와 분리 된 고유 한 프로세스 컨텍스트를가집니다. Windows API 또는 다른 플랫폼 관련 기능에서 TerminateProcess()과 같은 것을 사용할 수는 있지만 작업 관리자를 사용하는 것과 거의 비슷합니다.

1

실행중인 OS가 명시되지 않았지만 Linux (또는 다른 UNIX 계열 시스템) 인 경우 kill -9 프로세스 만 가능합니다. 이 신호는 잡힐 수 없으므로 양탄자가 공정에서 빠져 나오게됩니다.

유닉스와 비슷한 시스템을 사용하지 않는다면, 도움이되지 않습니다. 유용한 정보는 here입니다 ("taskkill"을 찾으십시오).

0

"시스템 상태"는 어디에 정의되어 있습니까? 이것이 유닉스라면, 당신은 프로세스에 신호 9를 보낼 수 있습니다 ...

정말로 필요하다면, 당신은 다른 프로세스 (또는 쓰레드)와 모든 애플리케이션 메모리를 공유 할 수 있고, 그 쓰레드가 무작위로 무작위 데이터를 쓸 수 있습니다 불행한 기억 장소 - 나는 NASA가 우주 프로젝트의 일부로 이것을했다고 생각하지만, 나는 정말로 참고 자료를 줄 수 없었다.

진짜 질문은 당신이 왜 이것을하고 싶은지입니다 - 당신/진짜/테스트는 무엇입니까?

예를 들어 마약을 처방하는 일부 의료 서비스를 제어하는 ​​일부 프로그램 인 경우 ... 대신 서비스를 제공하고 API를 분석하고 결함을 찾는 단위 테스트.

0

직접 버퍼 오버 플로우를 만드십시오.

#include <string.h> 

void doSomething(char *Overflow) 
{ 
    char Buffer[1]; 
    strcpy(Buffer, Overflow); 
} 

int main() 
{ 
    doSomething("Muhaha"); 
} 

그리고 시스템이 유닉스/리눅스에서 실행되는 경우 프로그램은 당신이 그것에게 신호를 보낼 수 있습니다

+1

안타깝게도 신뢰할 수있는 방법은 아닙니다. 이것은 정의되지 않은 동작 일 뿐이며 항상 충돌을 보장하지는 않습니다. –

0

을 충돌합니다 : SIGQUIT는 코어 덤프를 생성해야합니다, 당신은 또한 당신이 테스트하려는 경우가 SIGSEGV 보낼 수 있습니다 그것은 "분할 결함"을 얻는다. 그것들은 각각 신호 3과 신호 11입니다.

Windows의 경우 다른 응용 프로그램에서 신호를 발생시키는 방법을 모르지만 raise()를 호출 할 특정 Windows 메시지 번호를 처리하도록 응용 프로그램을 수정할 수 있으면이를 에뮬레이션 할 수 있습니다. raise()는 실제로 불법적 인 동작을 수행하는 코드를 작성하지 않고 신호를 발생시킵니다. 그런 다음이 신호를 발생시키는 핸들러가있는 응용 프로그램에 메시지를 게시 할 수 있습니다.

+0

RaiseException에 대한 내 게시물을 참조하십시오. 프로세스를 열거 나 원시 함수 포인터를 얻거나 힙을 손상시킬 수 있습니다. –

1

전역 새 연산자를 재정의 할 수 있습니다.그런 다음 카운터를 사용할 수 있으며 특정 값에서 널 포인터 참조 취소를 수행하여 응용 프로그램을 강제 종료 할 수 있습니다. 역 참조를 수행하는 시점의 값을 단순히 변경함으로써 충돌의 시간을 쉽게 바꿀 수 있습니다.

0

좋은 디버거에서 응용 프로그램을 실행하고 특정 코드 줄에 중단 점을 설정 한 다음 비올라로 응용 프로그램을 "충돌"시킬 수도 있습니다. 이제는 사용중인 디버거에 따라 모든 스레드가 실행을 중지하지 않을 수도 있습니다. 또는 디버거에서 응용 프로그램을 실행하고 시간이 지나면 단순히 응용 프로그램을 "중지"할 수 있습니다.

이것은 커널이 응용 프로그램을 죽이고 (코어를 덤프 할 수도 있음) 반드시 충돌을 일으키는 것은 아니지만 상관없이 원하는대로 할 수 있습니다.

2

가장 좋은 방법은

RaiseException(0x0000DEAD,0,0,0); 

WINDOWS.H RaiseException 연구를 에서 API를 호출하는 것입니다 또는 당신은 NTOSKRNL.EXE에서을 KeBugCheckEx() 에 연결하는 런타임을하고 그것을 호출 할 수 있습니다 당신의 코드.

예 : Windows에서

#include <windows.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    HINSTANCE h = LoadLibrary("ntoskrnl.exe"); 
    cout<<h<<endl; 
    void* a; 
    a = (void*) GetProcAddress(h,"KeBugCheckEx"); 
    int(*KeBugCheckEx)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR); 
    KeBugCheckEx = (int(*)(ULONG,ULONG_PTR,ULONG_PTR,ULONG_PTR,ULONG_PTR))a; 

    cout << a; 
    KeBugCheckEx(0,0,0,0,0); //crash in module ntoskrnl.exe means that call success! 
} 
5

하면, 프로세스에 WinDbg를 첨부 손상 일부 레지스터 또는 메모리와 분리 할 수 ​​있습니다. 예를 들어, 일부 활성 응용 프로그램 스레드에 대해 명령 포인터를 0으로 설정할 수 있습니다.

windbg -pn notepad.exe 

직후 부착, 현재의 thread 디버그 스레드로 설정, 그래서 당신은 그것으로 실행 가능한 경로가 될 수있는 DLL 인젝션을 사용하여 RIP 레지스터 업데이트

0:008> ~0s 
0:000> rrip=0 
0:000> qd 
+0

두 번째 명령에서 오류가 발생하면 'rip = 0'을 대신 사용하십시오. – ScottRhee