본문 바로가기

개발 및 운영/프로그래밍31

안전한 IOCP 프로그래밍 GQCS = GetQueuedCompletionStatus 비동기 처리 함수들 (WSARecv, WSASend, WriteFile, ReadFile 등) 비동기 처리 개수만큼 GQCS 결과 발생 GQCS의 return이 FALSE일 경우에도 key 및 lpOverlapped가 NULL이 아닌 경우에는 해당 이벤트에 대한 처리가 필요함 (이런 경우에는 해당 핸들에 오류가 발생한 것으로 GetLastError으로 오류결과 받을 수 있고 해당 핸들에 대한 정리(Cleanup) 처리 등이 필요) PostQueuedCompletionStatus로 비동기 처리에 대한 대체결과 Post가능 (이 경우 기존 작업 취소됨(?)) 예를 들어 비동기 WSARecv받는 중에 closesocket하면 GQCS의 return값이.. 2019. 6. 23.
OpenSSL FIPS 빌드 저의 빌드 환경은 Windows x86 64bit , Visual Studio 2015 환경입니다. 그리고 필요한 프로그램들은 (대략) 아래와 같습니다. (더 필요할 수 있음) nasm (32bit/64bit 둘 다 따로 설치) ActivePerl D:\replace.bat (아래) @echo ON setlocal call :FindReplace %1 %2 %3 exit /b :FindReplace set tmp="%temp%\tmp.txt" If not exist %temp%\_.vbs call :MakeReplace for /f "tokens=*" %%a in ('dir "%3" /s /b /a-d /on') do ( for /f "usebackq" %%b in (`Findstr /mi.. 2019. 6. 19.
WindowsPE에서 디버깅하기 WindowsPE에서 cmd을 켜고 크래시 덤프를 만들기 위해 procdump을 사용하면 작동하지 않고 그냥 꺼져버립니다..그 이유는 explorer에서 procdump을 실행해보면 이유를 알 수 있습니다. explorer실행방법 : cmd에서 notepad열기 -> 파일열기 -> 모든파일 -> exe우클릭 실행! 그럼 pdh.dll이 없다고 나오는데 C:\Windows\System32\pdh.dll을 procdump와 같은 위치에 넣어주면 작동합니다! 2018. 11. 7.
libcef 멈춰버리는 문제 해결 libcef을 사용하던 중...화면을 드래그하거나 특정 작업을 하거나 아니면 그냥... 멈춰버려서 뻗어버리는 경우가 있었습니다.메인스레드는 CPU을 11%정도를 계속 소비하면서... 이런 상황에 제 프로그램은 이런 구조였습니다. main()while(GetMessage(NULL, &msg, NULL, NULL)){TranslateMessage(&msg);DispatchMessage(&msg);} CEF초기화 부분cefSettings.multi_threaded_message_loop = 1; //needed for MFC projects (unless we want to implement custom message-loop)cefSettings.single_process = 1;CefInitialize(c.. 2018. 7. 2.
CodeVirtualizer 주의점 #1 CodeVirtualizer을 한국에서 사용하는 사람들이 별로 없는거 같네요.. 제가 사용해 보면서 겪고있는 일들을 기록합니다.. 1. 중첩 Virtualizer 금지VIRTUALIZER_START....VIRTUALIZER_FISH_WHITE_START....VIRTUALIZER_FISH_WHITE_END....VIRTUALIZER_END 이런 식도 그렇고 void function(){VIRTUALIZER_START...VIRTUALIZER_END} int main(){VIRTUALIZER_START...function();...VIRTUALIZER_END} 이런것도 그렇고 중첩해서 VIRTUALIZER을 하면 CodeVirtualizer프로그램이 Protect적용중에 죽던지 프로그램이 죽던지 합니다... 2017. 12. 26.
효율적인 그리고 안전한 소켓 통신 서버 Thread pool을 이용해서 소켓 서버를 만들 때 recv하는 방법은 대체로 쉽다.Windows에서는 IOCP로, Linux에서는 epoll을 이용하면 된다.이런걸 이용한 예제는 참 많지만... 실제 서버에 적용하면 문제가 생길 가능성이 있다.TCP send의 경우 클라이언트가 데이터를 받는걸 확인해야만 return한다.(물론 전송 실패 시에는 한참 뒤에 return한다.)만약 한정된 Thread pool에서 클라이언트에게 데이터를 전송하는데 마침 전송중인 모든 클라이언트의 연결이 강제로 끊긴 다면?서버는 오랜 시간 Waiting하다가 겨우겨우 다음 데이터를 처리할 것이다.이런일이 발생할까? 고려해야 할까? 할 수도 있지만 충분히 가능한 시나리오고이걸 악용한다면 매우 쉽게 DoS공격을 할 수도 있다... 2017. 11. 13.
반응형