L19
문제
파일 실행
ExeInfoPE
올리디버거
언패킹
- 수동으로 언패킹한 부분에 timeGetTime 함수 누락된 부분이 있어서 자동으로 권장
OEP - F9
F8 진행해서 오류 부분 찾기
F7로 CALL 19.0040EA50 함수 내부 접속
F8 진행
F7로 CALL 19.0040E940 함수 내부 접속
- lsDebuggerPresent 함수 발견 : Anti - Debugging 기법으로 디버깅을 당하면 1, 당하지 않으면 0 반환
- JNZ 함수에 ZF=0을 반환하여 Operand로 점프
- ZF 제로 플래그는 연산 결과(TEST EAX, EAX)가 0이면 참(1)
- TEST EAX,EAX 는 EAX의 값이 0이냐 아니냐를 판단하는 구문
- JZ는 제로 플래그가 참이면(연산 결과 = 0) Operand로 점프
- JNZ는 제로 플래그가 거짓이면(연산 결과 ≠ 0) Operand로 점프
0040E969 = 19.004338DE
코드 수정
Search for - All Intermodular calls - SetTimer
- 너무 짧은 750ms, 프로그램 종료와 상관없는 부분으로 패스
Search for - All Intermodular calls - timeGetTime
F9
- timeGetTime : systemtime을 ms 단위로 반환하는 함수
- 444C44 ~ 444C4D : 첫 timeGetTime 함수를 호출 할 때의 systemtime을 ESI에 저장
- 444C5F ~ 444C61 : 다시 timeGetTime 함수 호출한 값 EAX에 저장후 ESI와 비교
- CMP EAX, ESI : EAX값이 ESI 보다 크면 444D38로 분기
JNB 19.00444D38
- EAX에서 ESI 뺀 값과
- EBX+0x4와 비교
- EAX가 더 크면 00444C71로 분기하여 종료
- 더 작으면 00444C5F로 분기하여 EAX가 더 커져 종료될 때까지 반복
결론
- EAX(timeGetTime을 호출한 현재시간) - ESI(첫 timeGetTime system시간) > EBX + 0x4
- EBX + 0x4 = 00002B70
- 00002B70 = 11120ms / 11.12초
Search for - All Intermodular calls - Sleep