Electron 앱에서 날짜 속이기
이것을 검색하면 모든 답이 자기 코드를 바꾸는 이야기뿐입니다. Date 객체를 모킹하거나 테스트 프레임워크의 가짜 타이머를 쓰라는 식입니다. 이미 빌드된 앱만 있을 때는 그중 어느 것도 도움이 되지 않습니다. 이 도구는 이미 가진 앱을 그대로 실행합니다.
인젝션이 닿지 않는 이유
이 모드는 구체적인 실패 때문에 생겼습니다. Electron으로 만든 포모도로 타이머를 x60 세션에서 실행했는데 카운트다운이 전혀 움직이지 않았습니다. 앱의 번들을 뜯어 보니 서로 독립적인 두 가지 이유가 나왔고, 어느 것도 네이티브 쪽에서는 해결책이 없었습니다.
- 카운트다운은 시계를 읽고 있지 않았습니다. Web Worker 안에서 실행되는
setInterval이 증가시키는 카운터였습니다. 앱이 지금 몇 시인지 한 번도 묻지 않으니 가로챌 시간 호출이 없었습니다. - 그 Worker는 샌드박스된 렌더러 프로세스 안에 있으며, 외부에서 인젝션한 라이브러리가 들어가지 못하는 바로 그 자리입니다.
그래서 Windows 쪽 메커니즘은 여기서 도움이 되지 못하고, 대신 앱 자신의 JavaScript 엔진과 직접 이야기하는 것이 해답입니다.
대신 일어나는 일
앱은 디버깅 포트와 깨끗한 일회용 프로필로 시작되며, 앱 자신의 시간 API가 DevTools 프로토콜을 통해 세션 시계로 바뀝니다. Date.now, new Date() 생성자, performance.now, setTimeout, setInterval이 대상입니다.
이 덮어쓰기는 앱이 여는 모든 컨텍스트에, Web Worker를 포함해서 설치됩니다. 타이머가 보통 들어 있는 곳이며, 네이티브 인젝션이 결코 닿을 수 없는 유일한 곳입니다.
조작하는 방식은 아무것도 달라지지 않습니다. 같은 명령, 같은 창, 두 시계와 판정이 있는 같은 세션 패널입니다.
# 네이티브 앱과 같은 명령 - 모드는 자동으로 감지됨 chrono run "%LOCALAPPDATA%\Programs\your-app\YourApp.exe" --at 2038-01-01T00:00:00 --mode x60
시작하기 전에 알아 둘 두 가지 제한
실행 방식은 침습적이며, 일부러 그 사실을 크게 알립니다.
앱은 원격 디버깅 포트가 열린 채, %TEMP% 아래의 새로운 격리 프로필로 시작됩니다. 실제 프로필에서 실행되지 않으며, 시스템 트레이에 이미 떠 있는 사본도 아닙니다. 프로필은 세션이 끝나면 삭제되고, 삭제하지 못했다면 조용히 남겨 두지 않고 세션 요약이 그 사실을 알립니다.
직접 지정한 --user-data-dir나 --remote-debugging-port는 덮어쓰기 대신 거부됩니다. 세션을 실제 브라우저 프로필로 향하게 하는 뻔한 사고는 허용할 가치가 없기 때문입니다.
페이지는 세션의 시간대를 읽습니다.
모든 페이지와 워커는 서머타임이 없는 고정 오프셋인 세션 시간대에 놓이고, 자신이 읽는 오프셋을 확인하므로 다른 시간대를 읽은 페이지는 보고됩니다. 한계가 둘 있습니다. Intl은 그 시간대를 도시가 아니라 GMT+02:00 같은 오프셋으로 부르고, Electron 애플리케이션의 메인 프로세스는 세션이 닿지 않는 Node에서 JavaScript를 실행하므로 실제 시계를 유지하며 보고서가 이를 알려 줍니다.
사람들이 놀라는 점이 하나 더 있습니다. 세션 도중 속도를 바꿔도 이미 예약된 인터벌은 원래 속도를 유지합니다. Date.now, new Date(), performance.now는 즉시 반응하지만 실행 중인 setInterval은 반응하지 않으며, 변경이 아무 일도 하지 않았다고 결론짓지 않도록 세션이 이를 경고합니다.
얼마나 잘 테스트되었나요
실험적이며, 이 말에는 여기서 정해진 의미가 있습니다. 만들어질 때 대상으로 삼은 앱에서는 동작하고, 폭넓게 테스트되지는 않았으며, 신뢰할 수 있는 출처는 이 페이지가 아니라 내장된 감사입니다. 자동화된 테스트 모음이 아니라, 64비트 Windows의 실제 Electron 애플리케이션을 대상으로 직접 확인했습니다.
커버리지는 프로세스 단위가 아니라 JavaScript 컨텍스트 단위로 보고됩니다. 여기서 존재하는 단위가 그것이기 때문입니다. 가만히 있으며 시간을 한 번도 묻지 않는 앱은 솔직하게 판단 불가를 냅니다. 시계를 읽지 않았으므로 올바른 시계를 보았을지에 대해 아무것도 주장할 수 없습니다. 판정의 의미 →