현재 회사에서 작성한 응용 프로그램을 테스트하고 있습니다. 시나리오 중 하나는 응용 프로그램이 중단 될 경우 시스템 상태에 어떤 변화가 발생했는지 확인하는 것입니다. 내 응용 프로그램을 강제로 강제 실행할 수있는 응용 프로그램이 있습니까? 차라리 코드 자체에 충돌을 작성하지 않을 것입니다 (즉, null 포인터 비 참조). 작업 관리자를 사용하여 프로세스를 종료해도 동일한 결과가 발생하지 않습니다.응용 프로그램 강제 종료
답변
Windows를 사용하는 경우 Application Verifier을 참조하십시오.
구성 가능한 속도로 다양한 API 호출을 실패하게하는 결함 주입 (낮은 리소스 시뮬레이션)을 수행 할 수 있습니다. 예 : 힙 할당, 가상 Alloc, WaitForXxx, 레지스트리 API, 파일 시스템 API 등.
시작 중에 오류가 삽입되지 않을 경우 유예 기간 (밀리 초)을 지정할 수도 있습니다.
니스,이 도구에 대해 몰랐습니다. 그것은 매우 유용 할 것 같아! –
코드에서 abort()
함수를 호출하십시오. 다른 프로그램은 프로그램을 안정적으로 "크래시"할 수 없습니다. 프로그램의 컨텍스트와 분리 된 고유 한 프로세스 컨텍스트를가집니다. Windows API 또는 다른 플랫폼 관련 기능에서 TerminateProcess()
과 같은 것을 사용할 수는 있지만 작업 관리자를 사용하는 것과 거의 비슷합니다.
실행중인 OS가 명시되지 않았지만 Linux (또는 다른 UNIX 계열 시스템) 인 경우 kill -9
프로세스 만 가능합니다. 이 신호는 잡힐 수 없으므로 양탄자가 공정에서 빠져 나오게됩니다.
유닉스와 비슷한 시스템을 사용하지 않는다면, 도움이되지 않습니다. 유용한 정보는 here입니다 ("taskkill"을 찾으십시오).
"시스템 상태"는 어디에 정의되어 있습니까? 이것이 유닉스라면, 당신은 프로세스에 신호 9를 보낼 수 있습니다 ...
정말로 필요하다면, 당신은 다른 프로세스 (또는 쓰레드)와 모든 애플리케이션 메모리를 공유 할 수 있고, 그 쓰레드가 무작위로 무작위 데이터를 쓸 수 있습니다 불행한 기억 장소 - 나는 NASA가 우주 프로젝트의 일부로 이것을했다고 생각하지만, 나는 정말로 참고 자료를 줄 수 없었다.
진짜 질문은 당신이 왜 이것을하고 싶은지입니다 - 당신/진짜/테스트는 무엇입니까?
예를 들어 마약을 처방하는 일부 의료 서비스를 제어하는 일부 프로그램 인 경우 ... 대신 서비스를 제공하고 API를 분석하고 결함을 찾는 단위 테스트.
직접 버퍼 오버 플로우를 만드십시오.
#include <string.h>
void doSomething(char *Overflow)
{
char Buffer[1];
strcpy(Buffer, Overflow);
}
int main()
{
doSomething("Muhaha");
}
그리고 시스템이 유닉스/리눅스에서 실행되는 경우 프로그램은 당신이 그것에게 신호를 보낼 수 있습니다
안타깝게도 신뢰할 수있는 방법은 아닙니다. 이것은 정의되지 않은 동작 일 뿐이며 항상 충돌을 보장하지는 않습니다. –
을 충돌합니다 : SIGQUIT는 코어 덤프를 생성해야합니다, 당신은 또한 당신이 테스트하려는 경우가 SIGSEGV 보낼 수 있습니다 그것은 "분할 결함"을 얻는다. 그것들은 각각 신호 3과 신호 11입니다.
Windows의 경우 다른 응용 프로그램에서 신호를 발생시키는 방법을 모르지만 raise()를 호출 할 특정 Windows 메시지 번호를 처리하도록 응용 프로그램을 수정할 수 있으면이를 에뮬레이션 할 수 있습니다. raise()는 실제로 불법적 인 동작을 수행하는 코드를 작성하지 않고 신호를 발생시킵니다. 그런 다음이 신호를 발생시키는 핸들러가있는 응용 프로그램에 메시지를 게시 할 수 있습니다.
RaiseException에 대한 내 게시물을 참조하십시오. 프로세스를 열거 나 원시 함수 포인터를 얻거나 힙을 손상시킬 수 있습니다. –
전역 새 연산자를 재정의 할 수 있습니다.그런 다음 카운터를 사용할 수 있으며 특정 값에서 널 포인터 참조 취소를 수행하여 응용 프로그램을 강제 종료 할 수 있습니다. 역 참조를 수행하는 시점의 값을 단순히 변경함으로써 충돌의 시간을 쉽게 바꿀 수 있습니다.
좋은 디버거에서 응용 프로그램을 실행하고 특정 코드 줄에 중단 점을 설정 한 다음 비올라로 응용 프로그램을 "충돌"시킬 수도 있습니다. 이제는 사용중인 디버거에 따라 모든 스레드가 실행을 중지하지 않을 수도 있습니다. 또는 디버거에서 응용 프로그램을 실행하고 시간이 지나면 단순히 응용 프로그램을 "중지"할 수 있습니다.
이것은 커널이 응용 프로그램을 죽이고 (코어를 덤프 할 수도 있음) 반드시 충돌을 일으키는 것은 아니지만 상관없이 원하는대로 할 수 있습니다.
는가장 좋은 방법은
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!
}
하면, 프로세스에 WinDbg를 첨부 손상 일부 레지스터 또는 메모리와 분리 할 수 있습니다. 예를 들어, 일부 활성 응용 프로그램 스레드에 대해 명령 포인터를 0으로 설정할 수 있습니다.
windbg -pn notepad.exe
직후 부착, 현재의 thread 디버그 스레드로 설정, 그래서 당신은 그것으로 실행 가능한 경로가 될 수있는 DLL 인젝션을 사용하여 RIP 레지스터 업데이트
0:008> ~0s
0:000> rrip=0
0:000> qd
두 번째 명령에서 오류가 발생하면 'rip = 0'을 대신 사용하십시오. – ScottRhee
- 1. 응용 프로그램 강제 종료 (.net)
- 2. iPhone에서 강제 종료 응용 프로그램
- 3. SQLITE 쿼리 강제 종료 응용 프로그램 닫기
- 4. 강제 종료 응용 프로그램 - 설정된 경보를 취소합니다.
- 5. GPS가 활성화되지 않은 경우 응용 프로그램 강제 종료
- 6. C++을 사용하여 Windows CE에서 응용 프로그램 강제 종료
- 7. 강제 종료 처리
- 8. Android에서 응용 프로그램 종료
- 9. 응용 프로그램 충돌시 종료
- 10. 응용 프로그램 종료 이벤트
- 11. ApplicationContext에서 응용 프로그램 종료
- 12. 출구에서 응용 프로그램 종료
- 13. Blackberry : 응용 프로그램 종료
- 14. 응용 프로그램 종료
- 15. 종료 응용 프로그램 iOS
- 16. 응용 프로그램 풀 종료
- 17. 출시 즉시 강제 종료
- 18. 응용 프로그램 강제 호출이 닫힙니다
- 19. 앱 도움말 (강제 종료)
- 20. iPhone 강제 종료
- 21. 연결 강제 종료 오류
- 22. MediaPlayer 강제 종료 서비스
- 23. Android : onclicklistener 강제 종료?
- 24. android : 강제 종료 처리 방법
- 25. 신청지도 표시 중에 강제 종료
- 26. 자바 OSX 강제 종료 비활성화
- 27. 응용 프로그램 종료 C# Windows
- 28. NSTimer를 사용하여 응용 프로그램 종료
- 29. App.xaml.cs에서 WPF 응용 프로그램 종료
- 30. Android 개발 종료 응용 프로그램
와 충돌 할 응용 프로그램 스레드로 변경해야한다 이 문제를 해결하려면 이미이 문제를 처리 할 수있는 앱을 모른다. –
대구의 중간에 간단한 exit()를 넣을 수 없습니까? 아니면 "부서지기"로 간주되지 않습니까? – Raveline
시스템 상태 란 무엇입니까? 일반적으로 프로세스가 충돌하면 시스템은 사용 된 모든 리소스를 정리합니다. 그러나 이것은 데이터베이스 핸들과 같은 것으로 확장되지 않을 수도 있습니다. 시스템 상태를 어떻게 점검 할 것입니까? – Nick