KR20140123521A - 실행 중인 프로세스로의 동적 코드 주입 기법 - Google Patents

실행 중인 프로세스로의 동적 코드 주입 기법 Download PDF

Info

Publication number
KR20140123521A
KR20140123521A KR1020147022177A KR20147022177A KR20140123521A KR 20140123521 A KR20140123521 A KR 20140123521A KR 1020147022177 A KR1020147022177 A KR 1020147022177A KR 20147022177 A KR20147022177 A KR 20147022177A KR 20140123521 A KR20140123521 A KR 20140123521A
Authority
KR
South Korea
Prior art keywords
code
module
target process
arbitrary
message
Prior art date
Application number
KR1020147022177A
Other languages
English (en)
Other versions
KR102023223B1 (ko
Inventor
마이클 씨 패닝
크리스토퍼 엠에이치 파우콘
앤드류 알 스터랜드
티모시 에스 라이스
Original Assignee
마이크로소프트 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 마이크로소프트 코포레이션 filed Critical 마이크로소프트 코포레이션
Publication of KR20140123521A publication Critical patent/KR20140123521A/ko
Application granted granted Critical
Publication of KR102023223B1 publication Critical patent/KR102023223B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

본 명세서에는 실행 프로세스에 코드를 동적으로 주입할 수 있는 기법들이 기술된다. 예를 들어, 그 기법들은 프로세스가 실행되고 있는 도중에 프로세스 밖으로부터 임의 코드에 대한 동적 실행 요청을 받음에 따라 임의 코드가 프로세스 실행 중에 프로세스에서 활성화될 수 있게 한다.

Description

실행 중인 프로세스로의 동적 코드 주입 기법{DYNAMIC INJECTION OF CODE INTO RUNNING PROCESS}
컴퓨터 프로그램(예를 들어, 소프트웨어 애플리케이션)이나 그 일부와 같은 프로세스는 다른 프로세스에 대해 동작들을 수행할 수 있다. 그러한 동작들을 수행하는 프로세스를 요청 프로세스라 지칭하고, 상기 동작들이 수행되는 프로세스를 타깃 프로세스라 지칭한다. 전통적으로, 요청 프로세스가 타깃 프로세스에 첨부되기 위해, 타깃 프로세스가 실행되는 런타임 환경에 대한 기여자(contributer)가 요청 프로세스를 위한 타깃 서비스 집합이나 타깃 프로세스에 코드를 인스턴스화(instantiate)하기 위한 활성 메커니즘을 제공한다. 예를 들어, 상기 기여자는 운영체제, 단계적 런타임(예를 들어, 마이크로소프트사에서 배포한 CLR(Common Language Runtime), 오라클사에서 배포한 JVM(Java Virtual Machine) 등), 호스트 실행자(예를 들어, 브라우저), 통합 프레임워크(예를 들어, WPF(Windows Presentation Foundation)) 등일 수 있다. 활성 매커니즘이 타깃 프로세스에 코드(예를 들어, 객체)를 인스턴스화할 때, 그 코드는 통상적으로 통지를 받거나 데이터 및/또는 서비스에 대한 액세스를 제공하는 호스트 오브젝트를 참조하여 호출되는 콜백(callback) 코드이다. 그러한 활성 메커니즘은 전통적으로 타깃 프로세스 시동 시 레지스트리나 환경적 변수와 같은 머신 설정 정보를 조회함으로써 제공된다. 그러면, 관련 코드가 이 정보에 기초하여 인스턴스화되고 관련 호스트 제공 데이터에 의해 초기화된다.
그러나, 타깃 프로세스의 시동 시 타깃 프로세스 내의 코드를 활성화하기 위한 기법들은 한계가 있다. 예를 들어, 타깃 프로세스가 코드를 참조하는 설정으로 시작되지 않으면, 그 타깃 프로세스는 통상적으로 해당 코드를 참조하는 설정이 세팅된 후 재시작된다. 타깃 프로세스를 재시작하는 것은 코드를 활성화하는 사용자 경험에 추가 비용 및/또는 단계들을 부가할 수 있다. 또한, 타깃 프로세스가 실행되는 동안에 존재하는 환경들은 일단 타깃 프로세스가 재시작되면 재생성이 어려울 수 있다. 예를 들어, 스레드 경주 조건(thread race condition), 에러를 강제로 해결하는 데 수일이 걸리게 하는 느린 메모리 누수 등과 같은 문제들은 상대적으로 심각하지만 잠재적으로 재생성하기 어렵다. 다른 예에서, 타깃 프로세스를 재설정함으로써 수반되는 실행 환경의 변경은 문제가 재생성되는 것을 아예 방지할 수 있다.
요청 프로세스의 코드에 API(application programming interface)를 제공하는 것은 상대적으로 비용이 많이 들 수 있다. 예를 들어, 문서의 생성 및 유지, 순방향 호환성 등은 플랫폼 제공 API의 비용에 영향을 줄 수 있다. 플랫폼이나 프레임워크의 툴링(tooling) 기능과 같은 기능은 보통 플랫폼이나 프레임워크의 중심 기능보다 상대적으로 낮은 우선순위를 가진다고 간주된다. 그에 따라, 보조 기능을 제공하기 위해 수행되어야 하는 작업이 연기될 수 있다. 상대적으로 복잡한 플랫폼들이나 프레임워크들에 대해, 코어 플랫폼 서비스들을 제공하는 전문 지식 대 보조 서비스들을 제공하는 전문 지식은 중복되지 않을 수 있다. 그러한 사안들은 보조 서비스들과 관련하여 발전 및/또는 쇄신을 제한할 수 있다. 공공 확장 포인트들의 경우에 그러한 것처럼, 엄격하게 플랫폼을 목적으로 하는 것이 아니고/아니거나 아마 임의 코드(예를 들어, 임의 툴 코드)의 실행을 필요로 하는 코드는 주의깊은 검토 및/또는 구현에 의해 완화될 수 있는 실질적 보안 위험을 수반한다. 최종적으로, 애플리케이션이나 프레임워크에 의해 제공되는 API는 서비스 및/또는 버전관리 문제를 수반할 수 있다. 예를 들어, 요청 프로세스의 제공자들은 보통 플랫폼에 대한 변화들에 대해 계속 동기를 유지하기 위한 노력으로 그들의 코드를 조정하여, 잠재적으로 그러한 변화들을 설명하기 위해 해당 코드를 재컴파일 및/또는 재작성한다.
여러 가지 중에서, 본 명세서에서는 실행 프로세스에 코드를 동적으로 주입하는 다양한 시도들이 기술된다. 예를 들어, 그러한 시도들은 프로세스가 실행되고 있는 도중에 프로세스 밖으로부터 임의 코드에 대한 동적 실행 요청을 받음에 따라 임의 코드가 프로세스 실행 중에 프로세스에서 활성화될 수 있게 한다. 이 시도들은 비한정적인 것으로서, 운영체제(OS) 애플리케이션 프로그래밍 인터페이스(API)가 레지스트리로부터 상기 임의 코드를 포함하는 코드 컨테이너의 위치를 찾도록 하고, 코드 컨테이너로부터의 상기 임의 코드를 메시지에 의해 나타낸 경로를 통해 메시지에 의해 나타낸 위치에 있는 공유 라이브러리에 로딩하고, 상기 공유된 라이브러리를 호출하여 상기 임의 코드 값을 실행하도록 하고, 상기 메시지에 의해 나타낸 코드 컨테이너로부터 상기 임의 코드를 획득하고, 상기 메시지에 의해 특정된 상기 프로세스의 엔트리 지점에서 상기 임의 코드를 활성화하는 등을 포함하는 다양한 방식들 중 어느 하나를 통해 상기 임의 코드가 상기 프로세스에서 활성화되게 할 수 있다.
실행 중인 프로세스에 동적으로 코드를 주입하는 방법이 기술된다. 상기 방법에 따르면, 타깃 프로세스가 실행되는 동안에 타깃 프로세스 외부에 있는 요청 프로세스로부터 어느 메시지가 타깃 프로세스에서 수신된다. 상기 메시지는 타깃 프로세스에서 임의 코드의 동적 실행을 요구한다. 상기 메시지는 임의 코드를 식별하는 코드 식별자를 포함한다. 임의 코드는 활성화된 코드를 제공하기 위해 코드 식별자에 기반하여 타깃 프로세스가 실행되는 동안 타깃 프로세스에서 위치 확인되고 활성화되도록 유도된다.
인터페이스 모듈 및 인과 관계 모듈을 포함하는 시스템이 기술된다. 인터페이스 모듈은 타깃 프로세스가 실행되는 동안에 타깃 프로세스 외부에 있는 요청 프로세스로부터 타깃 프로세스에서 메시지를 수신하도록 구성된다. 상기 메시지는 타깃 프로세스에서 임의 코드의 동적 실행을 요구한다. 상기 메시지는 임의 코드를 식별하는 코드 식별자를 포함한다. 인과 관계 모듈(causation module)은 활성화된 코드를 제공하기 위해 코드 식별자에 기반하여 타깃 프로세스가 실행되는 동안 임의 코드가 타깃 프로세스에서 위치 확인되고 활성화되도록 구성된다.
프로세서 기반 시스템이 실행 중인 프로세스에 동적으로 코드를 주입할 수 있도록 컴퓨터 프로그램 로직이 기록된 컴퓨터 판독가능 매체를 포함하는 컴퓨터 프로그램 제품이 기술된다. 컴퓨터 프로그램 제품은 프로그램 로직 모듈을 포함한다. 프로그램 로직 모듈은 프로세스 기반 시스템이, 타깃 프로세스가 실행되는 동안에 타깃 프로세스 외부의 요청 프로세스로부터 타깃 프로세스에서의 메시지 수신에 기반하여 활성화된 코드를 제공하기 위해 타깃 프로세스가 실행되는 동안 임의 코드가 타깃 프로세스에서 위치 확인되고 활성화되게 할 수 있게 한다. 상기 메시지는 타깃 프로세스에서 임의 코드의 동적 실행을 요구한다. 상기 메시지는 임의 코드를 식별하는 코드 식별자를 포함한다. 코드 식별자는 임의 코드를 위치 확인하고 활성화하는데 사용될 수 있다.
본 요약은 이하의 상세한 설명에 자세히 기술되는 개념들의 발췌를 간략한 형식으로 소개하기 위해 제공된다. 본 요약은 청구된 발명 대상의 주요 특징이나 필수적 특징을 확인하도록 의도되거나 청구된 주제의 범위를 한정하는 데 사용되도록 의도된 것이 아니다. 또한 본 발명은 본 문서의 상세한 설명 및/또는 다른 부분에 기술된 특정 실시예들에 국한되지 않는다는 것을 알아야 한다. 그러한 실시예들은 본 명세서에서 예시적 목적만을 위해 제시된다. 본 명세서에 포함된 가르침에 따라 당업자들에게는 추가적인 실시예들이 자명할 것이다.
본 명세서에 통합되고 명세서의 일부를 형성하는 첨부 도면들은 본 발명의 실시예들을 예시하고, 또한 설명과 함께 포함된 원리들을 설명하고 당업자가 개시된 기술들을 제작하고 이용할 수 있게 하도록 돕는 역할을 한다.
도 1은 일 실시예에 따른 예시적 컴퓨터 시스템의 블록도이다.
도 2는 일 실시예에 따른 타깃 프로세스의 동적 코드 활성화의 예시적 방법의 흐름도이다.
도 3은 일 실시예에 따라 도 1에 도시된 요청 모듈의 예시적 구현예의 블록도이다.
도 4 및 6은 실시예들에 따라 실행 프로세스에 동적으로 코드를 주입하기 위한 예시적 방법들의 흐름도들을 도시한다.
도 5 및 7은 실시예들에 따라 도 1에 도시된 인프로세스 주입 모듈의 예시적 구현예들에 대한 블록도들이다.
도 8 및 9는 실시예들에 따라 임의 코드가 위치 확인 및 실행되게 하기 위한 예시적 방법들의 흐름도들을 도시한다.
도 10은 일 실시예에 따라 도 7에 도시된 인과 관계 모듈의 예시적 구현예의 블록도이다.
도 11은 실시예들이 구현될 수 있는 예시적 컴퓨터를 도시한다.
개시된 기술들의 특성들 및 장점들은 전반에 걸쳐 참조 부호들이 대응하는 구성요소들을 식별하는 도면들과 연계하여 해석될 때 이하에 기술되는 상세한 설명으로부터 보다 자명해질 것이다. 도면에서 유사한 참조 부호들은 일반적으로 동일하고 기능적으로 유사하고/하거나 구조적으로 유사한 구성요소들을 나타낸다. 구성요소가 최초로 나타나는 도면은 해당하는 참조 부호의 맨왼쪽 숫자(들)로 표시된다.
Ⅰ. 서론
이하의 상세한 설명은 본 발명의 예시적 실시예들을 도시한 첨부 도면들을 참조한다. 그러나, 본 발명의 범위는 이러한 실시예들에 국한되지 않고 첨부된 청구범위에 의해 정의된다. 따라서, 도시된 실시예들의 변형된 버전들과 같이 첨부 도면에 도시된 것들 이외의 실시예들은 그럼에도 불구하고 본 발명에 의해 포괄될 수 있다.
"일 실시예", "한 실시예", "예시적 실시예" 등에 대한 명세서 상의 언급들은 기술된 실시예가 특정한 특성, 구조, 또는 특징을 포함할 수 있으나, 모든 실시예가 반드시 특정한 특성, 구조, 또는 특징을 포함하지 않을 수도 있다. 게다가 그러한 무구들이 반드시 같은 실시예를 지칭하는 것은 아니다. 또한, 특정한 특성, 구조, 또는 특징이 일 실시예와 관련하여 기술될 때, 그것은 명시적으로 기술되는지 여부와 무관하게 다른 실시예들과 관련하여 그러한 특성, 구조, 또는 특징을 구현하는 당업자(들)의 지식 내에 있다고 제시된다.
Ⅱ. 예시적 실시예들
본 명세서에 기술된 예시적 실시예들은 실행 프로세스 내에 코드를 동적으로 주입할 수 있다. 예를 들어 예시적 실시예들은 프로세스가 실행되고 있는 도중에 프로세스 밖으로부터 임의 코드에 대한 동적 실행 요청을 받음에 따라 임의 코드가 프로세스 실행 중에 프로세스에서 활성화될 수 있게 한다. 예시적 실시예들은 비한정적인 것으로서, 운영체제(OS) 애플리케이션 프로그래밍 인터페이스(API)가 레지스트리로부터 상기 임의 코드를 포함하는 코드 컨테이너의 위치를 찾도록 하고, 위치를 판단함에 따라 코드 컨테이너로부터 임의 코드를 활성화하도록 하고, 상기 요청을 제공했던 호출자(caller)에게 임의 코드에 대한 참조를 제공하도록 하고; 코드 컨테이너로부터의 상기 임의 코드를 메시지에 의해 나타낸 경로를 통해 메시지에 의해 나타낸 위치에 있는 공유 라이브러리에 로딩하고, 상기 공유된 라이브러리를 호출하여 상기 임의 코드 값을 활성화하도록 하고; 상기 메시지에 의해 나타낸 코드 컨테이너로부터 상기 임의 코드를 획득하고, 상기 메시지에 의해 특정된 상기 프로세스의 엔트리 지점에서 상기 임의 코드를 활성화하는 것을 포함하는 다양한 방법들 중 어느 하나를 통해 프로세스 내에서 상기 임의 코드가 활성화되게 할 수 있다.
본 명세서에 기술된 예시적 기법들은 어떤 프로세스에서 코드를 실행하기 위한 종래의 기법들과 비교할 때 다양한 이점들을 가진다. 예를 들어, 예시적 기법들은 타깃 프로세스에 대해 취해질 요청 프로세스의 코드를 가져오기 위해 실행 중인 타깃 프로세스에 애드호크 기반으로 "첨부"할 수 있다. 예시적 기법들은 임의 코드의 매개변수화된 활동을 가능하게 하도록 임의 코드의 인스턴스화를 취득하는 데이터를 패스할 수 있다. 인스턴스화는 다양한 임의의 방식들 중 하나(예컨대, 요청 프로세스로부터 수신된 데이터를 액세스함)로 취득될 수 있다. 임의 코드가 실행 중인 타깃 프로세스에 주입되면, 그 임의 코드는 타깃 프로세스 및/또는 타깃 프로세스가 실행되는 환경(예를 들어, 프로그래밍 런타임 환경)과 관련하여 대역 밖(즉, 타깃 프로세스 및/또는 상술한 환경)에서 서비스(예를 들어, 업데이트)될 수 있다.
예시적 기법들은 프로세스에서 코드를 실행하는 종래의 기법들과 비교할 때, 코드를 활성화하는 사용자 경험 및/또는 개발자 경험에 대한 비용 및/또는 여러 단계들을 줄일 수 있다. 예를 들어, 예시적 기법들이 반드시 요청 프로세스의 코드에 API 기능을 제공할 필요는 없다. 이 예에 따르면, 그러한 API 기능과 관련하여 문서의 생성 및 관리, 순방향 호환성 등이 필수적이지 않을 수 있다. 추가로 이 예에 따르면, 그러한 API 기능과 관련된 서비스 및/또는 버전관리 문제들이 회피될 수 있다. 실행 중인 프로세스에 주입되는 임의 코드는 임의 코드의 동적 실행에 대한 요청을 제공했던 호출자가 통신할 수 있는 API를 제공할 수 있다. 이것은 임의 코드가 주입되는 프로세스와 관련하여 보다 많은 융통성 및/또는 제어를 제공할 수 있다. 다른 예에서는 타깃 프로세스의 시동 시 어떤 특정한 설정도 필요로 되지 않는다. 예를 들어 타깃 프로세스가 코드를 참조하는 설정을 이용하여 시작되면, 그 타깃 프로세스는 해당 코드를 참조하는 설정으로 재시작되지 않아도 된다. 그에 따라 타깃 프로세스가 실행 중일 때 존재하는 환경들(예를 들어, 문제들)이 재생성될 필요가 없다. 또 다른 예에서, 요청 프로세스의 제공자는 타깃 프로세스에 대한 변환들과 계속 동기를 유지하기 위해 요청 프로세스의 코드에 반드시 조절될 필요는 없다.
도 1은 일 실시예에 따른 예시적 컴퓨터 시스템의 블록도이다. 일반적으로, 컴퓨터 시스템(100)은 사용자들로부터 수신되는 요청들(예를 들어, HTTP(HTTP) 요청들)에 따라 사용자들(예를 들어, 애플리케이션 개발자들)에게 정보를 제공하도록 동작한다. 상기 정보는 문서들(예를 들어, 웹 페이지들, 이미지들, 비디오 파일들 등), 실행자들의 출력, 및/또는 어떤 다른 적절한 유형의 정보를 포함할 수 있다. 본 명세서에 기술된 예시적 실시예들에 따르면, 컴퓨터 시스템(100)은 실행 중인 프로세스(들)에 코드를 동적으로 주입한다. 예를 들어, 애플리케이션 개발자가 컴퓨터 시스템(100)을 이용하여 애플리케이션을 개발할 경우, 컴퓨터 시스템(100)은 애플리케이션에 대한 문제해결(trouble-shooting)을 용이하게 하기 위해 애플리케이션이 실행중일 때 애플리케이션에 코드를 동적으로 주입할 수 있다. 실행 중인 프로세스(들)에 코드를 동적으로 주입하기 위한 기법들에 대한 상세내용이 이하의 논의를 통해 제공된다.
도 1에 도시된 바와 같이, 컴퓨터 시스템(100)은 복수의 사용자 시스템들(102A-102M), 네트워크(104) 및 복수의 서버들(106A-106N)을 포함한다. 사용자 시스템들(102A-102M) 및 서버들(106A-106N) 사이의 통신이 잘 알려진 네트워크 통신 프로토콜들을 사용하여 네트워크(104)를 통해 수행된다. 네트워크(104)는 광역 네트워크(예를 들어, 인터넷), 랜(local area network), 다른 유형의 네트워크 또는 이들의 조합일 수 있다.
사용자 시스템들(102A-102M)은 서버들(106A-106N)과 통신할 수 있는 프로세싱 시스템들이다. 프로세싱 시스템의 일례가 일련의 명령어들에 따라 데이터를 조작할 수 있는 적어도 하나의 프로세서를 포함하는 시스템이다. 예를 들어 프로세싱 시스템은 컴퓨터, PDA(personal digital assistant) 등일 수 있다. 사용자 시스템들(102A-102M)은 서버들(106A-106N) 상에 저장된(또는 그와 달리 그들을 통해 액세스 가능한) 정보를 요청하는 요청들을 서버들(106A-106N)로 제공하도록 구성된다. 예를 들어 사용자는 사용자에 의하거나 사용자가 액세스 가능한 사용자 시스템(102) 상에 배치되는 클라이언트(예를 들어, 웹 브라우저, 웹 크로울러, 또는 다른 타입의 클라이언트)를 사용하여 컴퓨터 프로그램을 실행하라는 요청을 일으킬 수 있다. 일부 예시적 실시예들에 따르면, 사용자 시스템들(102A-102M)은 서버들(104A-104N)에 의해 호스팅되는 도메인들(예를 들어, 웹 사이트들)을 액세스할 수 있어, 사용자 시스템들(102A-102M)이 그 도메인들을 통해 입수가능한 정보를 액세스할 수 있다. 그러한 도메인은 HTML(hypertext markup language) 문서들 및 그에 링크되는 오브젝트들(예를 들어, 파일들)로서 제공될 수 있는 웹 페이지들을 포함할 수 있다.
어떤 하나 이상의 사용자 시스템들(102A-102M)은 어떤 하나 이상의 서버들(106A-106N)과 통신할 수 있다. 사용자 시스템들(102A-102M)이 도 1에서는 데스크탑 컴퓨터들로서 도시되고 있지만 당업자(들)은 사용자 시스템들(102A-102M)이 비한정적으로 랩탑 컴퓨터, 테블릿 컴퓨터, PDA, 셀룰라 전화 등을 포함하는 어떤 클라이언트 기능 시스템 또는 장치를 포함할 수 있다.
서버들(106A-106N)은 사용자 시스템들(102A-102M)과 통신할 수 있는 프로세싱 시스템들이다. 서버들(106A-106N)은 사용자들로부터 요청을 수신함에 따라 사용자들에게 정보를 제공하는 컴퓨터 프로그램들을 실행하도록 구성된다. 예를 들어, 상기 정보는 문서들(예를 들어, 웹 페이지들, 이미지들, 비디오 파일들 등), 실행자들의 출력, 또는 어떤 다른 적절한 유형의 정보를 포함할 수 있다. 어떤 예시적 실시예들에 따르면, 서버들(106A-106N)은 각자의 웹 사이트들을 호스팅하도록 구성되어, 웹 사이트들이 컴퓨터 시스템(100)의 사용자들에게 액세스될 수 있도록 한다.
제1서버(106A)는 예시할 목적으로 요청 모듈(112) 및 타깃 모듈(114)을 포함하는 것으로 도시된다. 요청 모듈(112)은 타깃 모듈(114)에 의해 실행되는 타깃 프로세스 외부에 있는 요청 프로세스(예를 들어, 요청 소프트웨어 프로그램)를 실행하도록 구성된다. 요청 프로세스는 타깃 모듈(114)에 의해 실행되는 타깃 프로세스에 임의 코드의 동적 실행을 요청하는 메시지(들)을 생성할 수 있다. 요청 프로세스의 한 예시적 유형을 툴(tool) 프로세스라 칭한다. 툴 프로세스는 타깃 프로세스에 대해 진단 동작들(예를 들어, 문제의 근원 식별, 디버깅, 프로파일링, 제어 등)을 수행하는데 사용될 수 있는 요청 프로세스이다. 툴 프로세스의 예들은 비한정적으로, 웹 개발 프로그램(예를 들어, 윈도우즈 아주어 플랫폼(Windows Azure Platform), 아마존 웹 서비스, 구글 앱 엔진, VMWare, Force.com 등) 및 통합 개발 환경(예를 들어, 마이크로소프트 비주얼 스튜디오, JDeveloper, NetBeans, 이클립스 플랫폼 등)을 포함한다.
타깃 모듈(114)은 타깃 프로세스(예를 들어, 타깃 소프트웨어 애플리케이션)를 실행하도록 구성된다. 타깃 프로세스의 예들에는 비한정적으로, 웹 브라우저(예를 들어, 인터넷 익스플로러, 파이어폭스, 구글 크롬, 사파리 등), 게임(예를 들어, 온라인 게임이나 콘솔 게임) 등을 포함한다. 예시적 실시예에서 타깃 프로세스는 프로그래밍 런타임 환경 내에서 실행된다. 예를 들어 프로그래밍 런타임 환경은 타깃 모듈(114)을 포함하는 런타임 모듈에 의해 실행될 수 있다. 프로그래밍 런타임 환경은 중간 언어(IL) 명령어들을 기계어 명령들로 변환함으로써 지정된 컴퓨터 프로그래밍 언어(들)로 작성된 컴퓨터 프로그램들의 실행을 지원하는 소프트웨어 성분이다. 예를 들어, 선 마이크로시스템사에 의해 개발되어 배포된 자바 런타임 환경(JRE)은 자바 프로그래밍 언어로 작성된 컴퓨터 프로그램들의 실행을 지원하는 프로그래밍 런타임 환경의 예이다. 마이크로소프트사에 의해 개발되어 배포된 커몬 랭귀지 런타임(CLR)은 다양한 언어들로 작성된 컴퓨터 프로그램들의 실행을 지원하는 프로그래밍 런타임 환경의 예이다. 그러나, 타깃 프로세스가 반드시 프로그래밍 런타임 환경에서 실행될 필요는 없다는 것을 알아야 한다.
타깃 모듈(114)은 인프로세스(in-process) 주입 모듈(110)을 포함한다. 인프로세스 주입 모듈(110)은 요청 모듈(112)로부터의 요청(들)을 만족하기 위해 타깃 모듈(114)에 의해 실행되는 타깃 프로세스에 임의 코드를 동적으로 주입하도록 구성된다. 예를 들어 인프로세스 주입 모듈(110)은 타깃 프로세스가 실행되는 동안 임의 코드가 타깃 프로세스에서 위치 확인되어 활성화될 수 있게 하여 활성화된 코드를 생성한다. 이러한 예에 따라, 타깃 프로세스가 실행되는 동안에 요청 프로세스로부터의 타깃 프로세스 내 메시지(들)의 수신에 기반하여 임의 코드가 타깃 프로세스에서 위치 확인되어 활성화된다. 요청 프로세스로부터의 메시지(들)은 타깃 프로세스 내에서 임의 코드의 동적 실행을 요구한다. 또한 이 예에 따르면, 메시지(들)은 각자의 임의 코드를 식별하고 그 임의 코드를 위치 확인하여 활성화하는데 사용할 수 있는 코드 식별자(들)을 포함할 수 있다. 요청 프로세스로부터의 메시지(들)은 요청 프로세스로부터 직접, 혹은 요청 프로세스로부터 간접적으로 타깃 프로세스에 의해 수신될 수 있다. 예를 들어 메시지(들) 중 하나 이상은 하나 이상의 중간 프로세스들 및/또는 모듈들을 통해 수신될 수 있다. 그러한 중간 프로세스들 및/또는 모듈들은 요청 프로세스로부터나 다른 중간 프로세스, 모듈 및/또는 머신으로부터 메시지들의 수신 시 그 메시지(들)을 타깃 프로세스로 포워딩할 수 있다. 실행 중인 프로세스에 코드를 동적으로 주입하기 위한 일부 예시적 기법들이 도 2-10을 참조하여 이하에서 보다 상세히 논의된다.
인프로세스 주입 모듈(110), 요청 모듈(112) 및 타깃 모듈(114)은 한정하는 것이 아닌 예시의 목적으로 제1서버(들)(106A)에 포함되는 것으로 도시된다. 인프로세스 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)(또는 그것의 일부(들))은 사용자 시스템들(102A-102M) 중 어떤 하나 이상에 포함될 수 있다는 것을 알아야 한다. 예를 들어 인프로세스 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)의 클라이언트측 양태들이 사용자 시스템들(102A-102M) 중 하나 이상에 포함될 수 있고, 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)의 서버측 양태들은 제1서버(들)(106A)에 포함될 수 있다. 다른 예에서, 인프로세스 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)은 사용자 시스템들(102A-102M) 사이에서 분산될 수 있다. 또 다른 예에서, 인프로세스 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)은 사용자 시스템들(102A-102M) 중 한 개에 포함될 수 있다. 또 다른 예에서, 인프로세스 주입 모듈(110), 요청 모듈(112) 및/또는 타깃 모듈(114)(또는 그 일부(들))은 유선 또는 무선 연결을 통해 사용자 시스템에 국지적으로 연결된 장치에 포함될 수 있다. 예를 들어, 타깃 모듈(114)(인프로세스 주입 모듈(110)을 포함함)은 통신 링크를 통해 사용자 시스템(102A)에 연결되는 모바일 장치에 포함될 수 있고, 요청 모듈(112)은 사용자 시스템(102A)에 포함될 수 있다.
인프로세스 주입 모듈(110)은 하드웨어, 소프트웨어, 펌웨어 또는 이들의 조합으로 구현되는 것을 포함하여, 실행 중인 프로세스에 코드를 동적으로 주입하기 위한 다양한 방식들로 구현될 수 있다. 예를 들어 인프로세스 주입 모듈(110)은 하나 이상의 프로세서들에서 실행되도록 구성된 컴퓨터 프로그램 코드로서 구현될 수 있다. 다른 예에서 인프로세스 주입 모듈(110)은 하드웨어 로직/전기 회로로서 구현될 수 있다. 일 실시예에서 인프로세스 주입 모듈(110)은 SoC(system-on-chip)으로 구현될 수 있다. 각각의 SoC는 프로세서(예를 들어, 마이크로컨트롤러, 마이크로프로세서, 디지털 신호 처리기(DSP) 등), 메모리, 하나 이상의 통신 인터페이스들 및/또는 그것의 기능들을 수행할 추가 회로들 및/또는 내장 펌웨어 중 하나 이상을 포함하는 집적 회로 칩을 포함할 수 있다.
다음은 컴퓨터 시스템(100)이 사용될 수 있는 두 가지 예시적 시나리오들이다. 제1시나리오에서, 한 고객이 요청 모듈(112)에 의해 실행되는 요청 프로세스를 이용하고 있을 수 있다. 그 고객은 요청 프로세스와 관련하여 제공되는 "디버그" 메뉴 내 "네트워킹된 머신 상에서 실행 중인 프로세스에 첨부" 엔트리를 선택할 수 있다. 요청 모듈(112)은 네트워킹된 머신 상에서 실행 중인 프로세스들의 리스트를 검색할 수 있다. 사용자는 프로세스들의 리스트로부터 타깃 프로세스를 선택하고 예컨대 "첨부" 버튼을 누를 수 있다. 요청 모듈(112)은 실행 중인 타깃 프로세스에서 디버깅 성분을 활성화하기 위해 메시지를 패키징하여 실행 중인 타깃 프로세스로 보낼 수 있다. 인프로세스 주입 모듈(110)은 요청 모듈(112)로부터의 메시지 수신에 따라 요청 모듈(112)이 디버깅 성분에 액세스(예를 들어, 첨부)할 수 있도록 디버깅 성분과 관련한 글로벌 등록 동작을 수행할 수 있다.
제2시나리오에서, 요청 모듈(112)은 USB(universal serial bus) 케이블을 통해 로컬 컴퓨터에 부착된 태블릿상에서 실행되는 모든 프로세스들을 열거한다. 이 시나리오에서는 어떤 툴 코드도 태블릿 자체에 다운되지 않았다. 요청 모듈(112)은 태블릿 상에서 실행 중인 타깃 프로세스를 선택하고, 태블릿으로 보낼 활성 메시지를 패키징한다. 활성 메시지는 코드 컨테이너의 위치를 특정하는 코드 위치 식별자를 포함한다. 예를 들어 코드 위치 식별자는 태블릿으로부터 보여질 수 있는 정보에 대응하는 URL(uniform resource locator)을 특정할 수 있다. 활성 메시지의 수신 시, 인프로세스 주입 모듈(110)은 코드 위치 식별자에 의해 특정된 위치로부터 코드 컨테이너를 검색하고, 인스턴스화된 코드를 제공하기 위해 코드 컨테이너에 포함된 임의 코드를 활성화한다. 인프로세스 주입 모듈(110)은 인스턴스화된 코드에 대한 포인터를 요청 모듈(112)로 제공한다. 요청 모듈(112)은 인스턴스화된 코드가 마샬링(marshalling)을 지원하는 컴포넌트 오브젝트 모델(COM) 오브젝트로서 표현되는 경우 인스턴스화된 코드로 바로 호출할 수 있다. 인프로세스 주입 모듈(110)은 그 실행 환경에 유용할 수 있는 인스턴스화된 코드에 관한 정보를 이용하여 인스턴스화된 코드를 초기화할 수 있다.
상술한 예시적 시나리오들은 예를 들 목적으로 제공된 것으로 한정하고자 하는 것이 아니다. 본 명세서에 기술되는 예시적 기법들은 다양한 시나리오들 중 어느 하나에 적용될 수 있다는 것을 알아야 한다.
도 2는 일 실시예에 따른 타깃 프로세스의 동적 코드 활성화의 예시적 방법의 흐름도(200)이다. 흐름도(200)는 예컨대, 도 1에 도시된 시스템(100)의 요청 모듈(112)에 의해 수행될 수 있다. 예시의 목적으로, 흐름도(200)는 일 실시예에 따른 요청 모듈(112)의 예인 도 3에 도시된 요청 모듈(300)과 관련하여 기술된다. 도 3에 도시된 바와 같이, 요청 모듈(300)은 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 및 수신 모듈(308)을 포함한다. 흐름도(200)에 관한 논의에 기반하여 당업자들에게는 추가적인 구조 및 동작 실시예들이 자명해 보일 것이다.
도 2에 도시된 바와 같이, 흐름도(200)의 방법은 단계 202로 시작된다. 단계 202에서 타깃 프로세스가 식별된다. 예시적 구현예에서, 식별 모듈(302)이 타깃 프로세스를 식별한다.
단계 204에서, 코드에 관한 활성 데이터를 포함하는 메시지가 생성된다. 예시적 구현예에서, 생성 모듈(304)이 그 메시지를 생성한다.
단계 206에서, 상기 메시지가 타깃 프로세스로 전송된다. 예시적 구현예에서, 제공 모듈(306)이 상기 메시지를 타깃 프로세스로 전송한다.
단계 208에서 활성이 성공적인지 여부를 나타내는 응답이 수신된다. 예를 들어 활성이 성공적이지 않으면 에러 메시지가 수신될 수 있다. 이 예에 따르면, 에러 메시지는 코드의 활성과 관련하여 발생한 에러를 특정할 수 있다. 다른 예에서, 활성이 성공적이면 성공 메시지가 수신될 수 있다. 이 예에 따르면, 성공 메시지는 코드가 요청 모듈(300)에 대해 액세스 가능하다는 것을 나타낼 수 있다. 예를 들어 성공 메시지는 코드로 호출하는데 사용할 수 있는 코드에 대한 참조를 포함할 수 있다. 예시적 구현예에서, 수신 모듈(308)이 그 응답을 수신한다.
일부 예시적 실시예들에서 흐름도(200)의 하나 이상의 단계들(202, 204, 206 및/또는 208)은 수행되지 않을 수 있다. 또한, 단계들(202, 204, 206 및/또는 208)에 추가하거나 그들을 대신하여 단계들이 수행될 수 있다.
요청 모듈(300)은 식별 모듈(302), 생성 모듈(304), 제공 모듈(306) 및/또는 수신 모듈(308) 중 하나 이상을 포함하지 않을 수 있다. 또한, 요청 모듈(300)은 식별 모듈(302), 생성 모듈(304), 제공 모듈(306) 및/또는 수신 모듈(308)에 더하거나 그들을 대신하여 모듈들을 포함할 수 있다.
도 4는 일 실시예에 따라 실행 중인 프로세스로 코드를 동적으로 주입하는 예시적 방법의 흐름도(400)이다. 흐름도(400)는 예컨대 도 1에 도시된 시스템(100)의 인프로세스 주입 모듈(110)에 의해 수행될 수 있다. 예시의 목적으로, 흐름도(400)는 일 실시예에 따라, 인프로세스 주입 모듈(110)의 예인 도 5에 도시된 인프로세스 주입 모듈(500)과 관련하여 기술된다. 도 5에 도시된 바와 같이, 인프로세스 주입 모듈(500)은 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱(pushing) 모듈(510), 언패킹(unpacking) 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526) 및 상태 팝핑(popping) 모듈(528)을 포함한다. 흐름도(400)에 관한 논의에 기반하여 당업자들에게는 추가적인 구조 및 동작 실시예들이 자명해 보일 것이다.
도 4에 도시된 바와 같이, 흐름도(400)의 방법은 단계 402에서 시작된다. 단계 402에서, 코드에 관한 활성 데이터를 포함하는 메시지가 수신된다. 예시적 구현예에서, 인터페이스 모듈(502)이 그 메시지를 수신한다.
단계 404에서 활성화가 불능인지 여부에 대한 판단이 내려진다. 활성화가 불능이면, 코드는 활성화될 수 없다. 활성화가 불능이 아니면, 본 명세서에 기술된 기법(들)에 따라 적절한 활성화 동작이 수행되는 경우 코드가 활성화될 수 있다. 활성화가 불능이면, 흐름도는 단계 406으로 진행한다. 그렇지 않은 경우 흐름도는 단계 408로 진행한다. 예시적 실시예에서 활성화 결정 모듈(504)이 활성화가 불능인지 여부를 판단한다. 일부 실시예들에서 활성화는 시스템 관리자와 같은 개체에 의해 "가능" 및 "불능" 사이에서 토글될 수 있다. 이러한 실시예들에 따라, "불능"에서 "가능"으로의 토글은 본 명세서에 기술된 기법(들)에 따라 적절한 활성화 동작들이 수행되는 경우 코드를 활성화될 수 있는 상태로 놓을 수 있다.
단계 406에서 실패 메시지가 제공된다. 실패 메시지는 활성화가 불능임을 나타낸다. 예시적 구현예에서, 제공 모듈(506)이 그 실패 메시지를 제공한다. 단계 406의 완료 시, 흐름도(400)가 종료된다.
단계 408에서 설정 상태가 존재하는지 여부에 대한 판단이 내려진다. 예를 들어, 설정 상태는 코드와 관련된 환경 변수(들)에 의해 특정될 수 있다. 이러한 예에 따라, 그러한 환경 변수(들)가 설정 상태를 특정하면, 설정 상태가 존재하는 것으로 언급된다. 그러한 환경 변수(들)가 존재하지 않거나 그러한 환경 변수(들)가 설정 상태를 특정하지 않으면, 설정 상태는 존재하지 않는 것으로 언급된다. 설정 상태가 존재하면, 흐름도는 단계 410으로 진행한다. 그렇지 않으면, 흐름도는 단계 412로 진행한다. 예시적 구현예에서, 상태 결정 모듈(508)이 설정 상태가 존재하는지 여부를 판단한다.
단계 410에서 설정 상태가 푸시된다. 설정 상태를 "푸시"한다는 것은 설정 상태가 미래의 어느 시점에 복구될 수 있게 "푸싱"한다는 것을 의미한다. 예를 들어 설정 상태의 푸싱은 코드 시동 시 제공되는 동일한 코드 위치 및/또는 활성화 메커니즘의 재사용을 가능하게 하는 것과 같은 코딩 편의를 가져올 수 있다. 예시적 구현예에서 상태 푸싱 모듈(510)이 설정 상태를 푸시한다. 단계 410의 완료에 따라, 흐름도가 단계 412로 진행한다.
단계 412에서 활성화 데이터가 메시지로부터 언패킹된다. 예시적 구현예에서 언패킹 모듈(512)이 활성화 데이터를 메시지로부터 언패킹한다.
단계 414에서 코드를 식별하는 식별자가 이용 가능한지 여부에 대한 판단이 이루어진다. 코드를 식별하는 식별자가 이용 가능하면, 흐름도는 단계 416으로 진행한다. 그렇지 않으면 흐름도는 단계 406으로 진행한다. 예시적 구현예에서 이용 가능성 결정 모듈(514)이 코드를 식별하는 식별자가 이용 가능한지 여부를 판단한다.
단계 416에서 해당 코드에 대한 경로를 나타내는 지시자가 이용 가능한지 여부에 대한 판단이 이루어진다. 예를 들어, 상기 경로는 네트워크 위치, 로컬 머신에 대한 정보, 네트워크(예를 들어, 인터넷)을 통해 다운로드될 수 있는 파일로의 URI(uniform resource identifier) 등일 수 있다. 이 예에 따라, URI는 URL(uniform resource locator)이나 URN(uniform resource name)일 수 있다. 코드에 대한 경로를 나타하는 지시자가 이용 가능하면, 흐름도는 단계 418로 진행한다. 그렇지 않으면 흐름도는 단계 420으로 진행한다. 예시적 구현예에서 경로 결정 모듈(516)이 코드로의 경로를 나타내는 지시자가 이용 가능한지 여부를 판단한다.
단계 418에서 코드는 경로에 의해 특정된 위치로부터 활성화된다(예를 들어, 로딩 및/또는 적어도 부분적으로 실행된다). 예시적 구현예에서 활성화 모듈(518)은 경로에 의해 특정된 위치로부터 코드를 활성화한다. 단계 418의 완료에 따라, 흐름도가 단계 422로 진행한다.
단계 420에서 코드는 그 코드를 식별하는 식별자에 기반하여 활성화된다. 예시적 구현예에서 활성화 모듈(518)은 코드를 식별하는 식별자에 기반하여 코드를 활성화한다. 단계 420의 완료에 따라, 흐름도가 단계 422로 진행한다.
단계 418, 420 및/또는 422를 수행에 대한 성공하지 못한 시도는 오류 상태로 이어지고, 이 경우 흐름도는 단계 406으로 진행한다. 예를 들어, 코드의 활성화가 단계 418이나 420에서 실패할 수 있다. 다른 예에서, 활성화된 코드의 초기화가 단계 422에서 실패할 수 있다. 이 예에 따르면, 활성화 코드는 초기화 실패 시 "제거될(cleaned up)" 수 있다.
단계 422에서 활성화된 코드가 초기화된다. 예를 들어, 초기화는 코드의 활성화 부여 정보에 대한 환경 변수들을 검토하고, 활성화 코드가 특정 인터페이스를 구현할 것을 요구하고, 활성화 코드와 관련된 코드 컨테이너가 호출될 수 있는 이름들의 엔트리 지점들을 노출하도록 요청하고, 메시지로부터 임의의 초기화 데이터를 언패킹하는 등의 동작을 수반할 수 있다. 예시적 구현예에서, 초기화 모듈(520)이 활성화된 코드를 초기화한다.
단계 424에서 활성화된 코드가 등록된다. 예시적 구현예에서, 등록 모듈(522)이 그 활성화된 코드를 등록한다.
단계 426에서 활성화 결과가 패키징된다. 예시적 구현예에서 패킹 모듈(524)이 활성화 결과를 패키징한다.
단계 428에서 설정 상태가 팝핑되어야 하는지 여부에 대한 판단이 내려진다. 설정 상태가 팝핑되어야 하는 경우, 흐름도는 단계 430으로 진행한다. 그렇지 않으면 흐름도는 단계 432로 진행한다. 예시적 구현예에서 팝 결정 모듈(526)이 설정 상태가 팝핑되어야 하는지 여부를 판단한다.
단계 430에서 설정 상태가 팝핑된다. 설정 상태를 "팝핑(popping)"한다는 것은 단계 410에서 푸시된 설정 상태를 "복구"한다는 것을 의미한다. 예시적 구현예에서 상태 팝핑 모듈(528)이 설정 상태를 팝핑한다. 단계 430의 완료에 따라, 흐름도가 단계 432로 진행한다.
단계 432에서 활성화 결과가 반환된다. 예시적 구현예에서 제공 모듈(506)이 활성화 결과를 반환한다. 단계 432의 완료 시, 흐름도(400)가 종료된다.
일부 예시적 실시예들에서 흐름도(400)의 하나 이상의 단계들 402, 404, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, and/or 432은 수행되지 않을 수 있다. 또한, 단계들 402, 404, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 및/또는 432에 더하거나 그들을 대신하여 단계들이 수행될 수 있다.
인프로세스 주입 모듈(500)은 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱(pushing) 모듈(510), 언패킹(unpacking) 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526) 및 상태 팝핑(popping) 모듈(528) 중 하나 이상을 포함하지 않을 수 있다는 것을 알아야 한다. 인프로세스 주입 모듈(500)은 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱(pushing) 모듈(510), 언패킹(unpacking) 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526) 및 상태 팝핑(popping) 모듈(528)에 더하거나 그들을 대신하여 모듈들을 포함할 수 있다.
도 6은 일 실시예에 따라 실행 중인 프로세스로 코드를 동적으로 주입하는 또 다른 예시적 방법의 흐름도(600)를 도시한다. 흐름도(600)는 예컨대, 도 1에 도시된 시스템(100)의 인프로세스 주입 모듈(110)에 의해 수행될 수 있다. 예시의 목적으로, 흐름도(600)는 일 실시예에 따라, 인프로세스 주입 모듈(110)의 다른 예인 도 7에 도시된 인프로세스 주입 모듈(700)과 관련하여 기술된다. 도 7에 도시된 바와 같이, 인프로세스 주입 모듈(700)은 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 및 시동 모듈(710)을 포함한다. 흐름도(600)에 관한 논의에 기반하여 당업자들에게는 추가적인 구조 및 동작 실시예들이 자명해 보일 것이다.
도 6에 도시된 바와 같이, 흐름도(600)의 방법은 단계 602로 시작된다. 단계 602에서, 타깃 프로세스가 실행되는 동안에 타깃 프로세스 외부에 있는 요청 프로세스로부터 어느 메시지가 타깃 프로세스에서 수신된다. 메시지는 요청 프로세스로부터 직접 또는 간접적으로 타깃 프로세스에서 수신될 수 있다. 상기 메시지는 코드 식별자를 포함하며 타깃 프로세스에서 임의 코드의 동적 실행을 요구한다. 코드 식별자는 임의 코드를 식별한다. 코드 식별자는 임의 코드를 위치 확인하고 활성화하는데 사용될 수 있다. 요청 프로세스는 웹 개발 프로그램이나 통합 개발 환경과 같은 툴 프로세스일 수 있으나, 예시적 실시예들의 범위가 이와 같은 것에 국한되는 것은 아니다. 예시적 구현예에서, 인터페이스 모듈(702)은 타깃 프로세스가 실행 중일 때 요청 프로세스로부터 타깃 프로세스에서 메시지를 수신한다.
예시적 실시예에서 코드 식별자는 컴파일된 후 타깃 프로세스에서 실행될 소스 코드를 포함한다. 다른 예시적 실시예에서 코드 식별자는 컴파일될 소스 코드를 반환하는 URL 및/또는 웹 서비스 콜이다. 또 다른 예시적 실시예에서, 코드 식별자는 타깃 프로세스에서 실행될 컴파일되지 않은 스크립트 코드를 포함한다.
단계 604에서, 임의 코드는 활성화된 코드를 제공하기 위해 코드 식별자에 기반하여 타깃 프로세스가 실행되는 동안 타깃 프로세스에서 위치 확인되고 활성화되도록(예를 들어, 로딩되고/거나 적어도 부분적으로 활성화되도록) 유도된다. 예시적 구현예에서, 인과 관계 모듈(704)은 임의 코드가 타깃 프로세스가 실행 중일 때 타깃 프로세스에서 위치 확인되어 활성화되도록 한다.
예시적 실시예에서 단계 604는 운영체제(OS) 애플리케이션 프로그래밍 인터페이스(API)가 코드 식별자에 기반하여 레지스트리로부터 상기 임의 코드를 포함하는 코드 컨테이너의 위치를 찾도록 하는 단계를 포함한다. 예를 들어 운영체제 애플리케이션 프로그래밍 인터페이스는 코드 컨테이너의 위치를 찾는 키로서 코드 식별자를 사용하도록 될 수 있다. 코드 식별자는 예컨대 글로벌 고유 식별자(GUID)를 사용하여 표현될 수 있다. 운영체제 애플리케이션 프로그래밍 인터페이스는 예를 들어, COM(CoCreatelnstance component object model)일 수 있다. 코드 컨테이너는 이진 컨테이너나 캡(cab), 또는 코드가 추출되어야 하는 다른 압축된 컨테이너일 수 있다. 이 실시예에 따르면, 코드 식별자는 운영체제 애플리케이션 프로그래밍 인터페이스로 제공된다.
다른 예시적 실시예에서, 단계 604는 임의 코드를 초기화하기 위해 임의 코드로 임의 데이터를 제공하는 단계를 포함한다. 이 실시예에 따르면, 임의 데이터는 단계 602에서 타깃 프로세스에서 수신되는 메시지에 포함된다.
또 다른 실시예에서 단계 604는 활성화된 코드와 관련된 스레드를 제외한 타깃 프로세스의 모든 스레드들을 정지시키는 단계를 포함한다.
또 다른 예시적 실시예에서, 메시지 내 코드 식별자 및/또는 다른 데이터는 임의 코드의 단일 인스턴스를 특정한다. 예를 들어 코드 식별자 및/또는 다른 데이터는 임의 코드의 인스턴스가 그 인스턴스가 이미 존재하고 있지 않은 경우 생성되고/거나 임의 코드의 앞서 구성된 인스턴스가 그와 달리 보내질 것을 요청할 수 있다. 오브젝트 등록 메커니즘이 이러한 목적으로 재사용될 수 있다.
단계 606에서 타깃 프로세스와 관련하여 인스턴스화된 인스턴스화 코드가 식별된다. 인스턴스화 코드는 활성화된 코드를 포함한다. 예시적 구현예에서, 식별 모듈(706)은 타깃 프로세스와 관련하여 인스턴스화된 인스턴스화 코드를 식별한다.
단계 608에서 무효 메시지가 수신된다. 예를 들어 무효 메시지는 타깃 프로세스나 요청 프로세스에 의해 생성될 수 있다. 한 양태에서, 무효 메시지는 타깃 프로세스나 요청 프로세스에서 에러가 일어났음을 나타낼 수 있다. 다른 양태에서, 무효 메시지는 타깃 프로세스나 요청 프로세스가 중단되어야 한다는 것을 나타낼 수 있다. 예를 들어 무효 메시지는 사용자가 타깃 프로세스를 빠져나감에 따라 수신될 수 있다. 이 예에 따르면, 무효 메시지는 타깃 프로세스의 셧다운 시퀀스 중에 수신될 수 있다. 예를 들어 타깃 프로세스는 사용자가 타깃 프로세스를 빠져나갔음을 검출하여 그에 따라 무효 메시지를 생성할 수 있다. 예시적 구현예에서, 인터페이스 모듈(702)이 무효 메시지를 수신한다.
단계 610에서 인스턴스화 코드가 무효화된다. 예를 들어, 인스턴스화 코드는 무시되거나, 메로리로부터 제거되거나, 인스턴스화 코드가 그 자체의 비초기화(un-instalization) 및/또는 셧다운 작업을 수행할 수 있도록 내부로 호출될 수 있다. 이 예에 따르면, 인스턴스화 코드에 대한 참조(들)은 삭제, 비활성화 등이 될 수 있다. 예시적 구현예에서, 비활성화 모듈(708)이 그 인스턴스화 코드를 무효화한다.
예시적 실시예에서, 메시지는 임의 코드의 캐싱과 관련된 퀄리파이어(들)(qualifier(s))을 포함할 수 있다. 예를 들어 메시지는 임의 코드가 이미 검색되고 내부적으로 캐싱되었더라도, 임의 코드가 검색되어야 한다는 것을 가리킬 수 있다. 이 예에 따르면, 코드 식별자는 URL나 URN과 같은 URI를 일컬을 수 있다. 한 양태에서, 인과 관계 모듈(704)은 그 임의 코드가 이미 검색되어 내부적으로 캐싱되었는지 여부를 가리키는 테이블을 조회할 수 있다. 인과 관계 모듈(704)은 임의 코드가 이미 검색되지도 내부적으로 캐싱되어 있지도 않은 경우 상기 테이블로부터 임의 코드를 검색할 수 있다. 다른 양태에서, 인과 관계 모듈(704)은 인과 관계 모듈(704)이 이전 메시지에 소스 코드로서 전달되었던 코드 컨테이너를 이미 컴파일했는지 여부를 알 수 있다. 메시지는 임의 코드가 GUID에 의해 식별되게 하는 소스 코드와 함께 임의 코드와 관련될 GUID를 포함할 수 있다.
각각의 메시지와 함께 소스 코드를 전송하는 비용 때문에, 요청 프로세스는 지정된 GUID의 활성화를 요청할 수 있다. 활성화는 코드 컨테이너가 위치 확인될 수 없기 때문에 실패할 수 있다. 요청 프로세스는 같은 GUID 활성화를 요구하고, 이때 소스 코드를 메시지와 함께 포함시키는 메시지를 연달아 보낼 수 있다. 인과 관계 모듈(704)은 임의 코드를 컴파일하고 캐싱하고 활성화할 수 있다. 요청 프로세스는 소스 코드 없이 GUID를 제공하는 임의 코드를 요청하는 다른 메시지로 이어질 수 있다. 이때, 인과 관계 모듈(704)이 임의 코드의 그 캐싱되고 컴파일된 버전을 위치 확인하고 활성화할 수 있다. 상술한 방식을 구현하는 한 잠정적 이유는 다수의 요청 프로세스들이 타깃 프로세스 내에서의 같은 임의 코드의 동적 실행을 요청하는 메시지를 제공하고 있을 수 있다는 것이다.
타깃 프로세스에 의해 수신된 메시지는 단일 코드 컨테이너에 포함되거나 여러 코드 컨테이너들에 걸칠 수 있는 둘 이상의 코드 오브젝트를 인스턴스화(예를 들어, 초기화)하라는 요청을 포함할 수 있다는 것을 알아야 한다. 리턴(return) 참조가 제공되는 경우, 결과를 보유하는 데이터 구조가 다양한 인스턴스화된 오브젝트들의 정렬된 집합을 포함할 수 있다.
일부 예시적 실시예들에서 흐름도(600)의 하나 이상의 단계들(602, 604, 606, 608 및/또는 610)은 수행되지 않을 수 있다. 또한, 단계들(602, 604, 606, 608 및/또는 610)에 추가하거나 그들을 대신하여 단계들이 수행될 수 있다. 예를 들어, 예시적 실시예에서 흐름도(600)는 타깃 프로세스에 포함되는 코드의 접근성을 활성화 코드에 부여하는 단계를 포함한다. 타깃 프로세스에 포함된 코드의 일부가 예컨대 타깃 프로세스 이외의 개체들에 대해 액세스될 수 없도록 설정됨에도 불구하고, 타깃 프로세스에 포함되는 코드의 접근성이 활성화 코드에 부여될 수 있다. 이 실시예에 따르면, 인과 관계 모듈(704)은 타깃 프로세스에 포함되는 코드의 접근성을 활성화 코드에 부여할 수 있다.
다른 예시적 실시예에서 흐름도(600)는 임의 코드와 관련된 환경 변수들을 결정하는 단계를 포함한다. 환경 변수들은 임의 코드의 로딩을 매개변수화하도록 구성된다. 예를 들어, 시동 모듈(710)은 임의 코드와 관련된 환경 변수들을 결정할 수 있다. 이 실시예에 따르면, 임의 코드는 환경 변수들에 따라 타깃 프로세스의 시동 중에 활성화된다. 예를 들어 시동 모듈(710)은 타깃 프로세스의 시동 중에 임의 코드를 활성화할 수 있다. 또한 이 실시예에 따르면, 단계 604는 타깃 프로세스의 시동 중에 임의 코드 활성화 종료에 반응하여 수행된다. 예를 들어 인과 관계 모듈(704)이 타깃 프로세스의 시동 중에 임의 코드 활성화 종료에 반응하여 단계 604를 수행할 수 있다.
또 다른 예시적 실시예에서 흐름도(600)는 활성화 코드를 참조하는 값을 제공하는 단계를 포함한다. 이 값은 타깃 프로세스가 계속 실행될 때 타깃 프로세스와 상호 작용하기 위해 요청 프로세스에 의해 호출될 수 있다. 요청 프로세스에 의해 제공된 데이터 구조는 상기 값으로 채워질 수 있지만, 예시적 실시예들의 범위가 이러한 것에 국한되지 않는다. 일례에서 인과 관계 모듈(704)은 활성화 코드를 참조하는 값을 제공할 수 있다. 이 예에 따르면, 인과 관계 모듈(704)이 상기 값을 생성할 수 있다.
상술한 실시예의 한 양태에서, 요청 프로세스는 답례로 활성화 코드에 대해 호출가능한 참조로서 기능하는 값에 대한 요청 프로세스 액세스(예를 들어, 상대적으로 즉각적인 액세스)를 부여하는 동기 코드 활성화 경험을 가질 수 있다. 다른 양태에서, 활성화 코드는 활성화 코드가 요청 프로세스에서 액세스될 수 있게 하는 방식으로 등록될 수 있다. 예를 들어 활성화 코드는 타깃 프로세스와 요청 프로세스 사이에서 공유되는 메모리 부분을 이용하여 등록된다.
인프로세스 주입 모듈(700)은 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708) 및/또는 시동 모듈(710) 중 하나 이상을 포함하지 않을 수 있다는 것을 알아야 한다. 또한, 인프로세스 주입 모듈(700)은 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708) 및/또는 시동 모듈(710)에 더하거나 그들을 대신하여 모듈들을 포함할 수 있다.
도 8 및 9는 실시예들에 따라 임의 코드가 위치 확인 및 실행되게 하기 위한 예시적 방법들의 흐름도들(800 및 900)을 도시한다. 그에 따라, 흐름도들(800 및 900)은 흐름도(600)의 단계(604)가 수행될 수 있는 예시적 방식들을 도시한다. 흐름도들(800 및 900)은 예컨대 도 7에 도시된 인프로세스 주입 모듈(700)의 인과 관계 모듈(704)에 의해 수행될 수 있다. 예시의 목적으로, 흐름도들(800 및 900)은 일 실시예에 따른 인과 관계 모듈(704)의 예인 도 10에 도시된 인과 관계 모듈(1000)과 관련하여 기술된다. 도 1에 도시된 바와 같이, 도 10에 도시된 바와 같이 인과 관계 모듈(1000)은 활성화 로직(1002), 호출 로직(1004) 및 획득 로직(1006)을 포함한다. 흐름도들(800 및 900)에 관한 논의에 기반하여 당업자들에게는 추가적인 구조 및 동작 실시예들이 자명해 보일 것이다.
도 8에 도시된 바와 같이, 흐름도(800)의 방법은 단계 802로 시작된다. 단계 802에서, 임의 코드는 메시지 내 위치 식별자에 의해 지시된 위치 및 메시지 내 경로 정보에 의해 지시된 경로에 기반하여 코드 컨테이너로부터 공유 라이브러리에 로딩된다. 예를 들어, 공유 라이브러리는 다이내믹 링크 라이브러리(DLL)일 수 있다. 다른 예에서, 위치 식별자는 URL(uniform resource locator)이나 URN(uniform resource name)과 같은 URI(uniform resource identifier)일 수 있다. 예시적 구현예에서, 활성화 로직(1002)은 임의 코드를 코드 컨테이너로부터 공유 라이브러리 로 로딩한다. 예를 들어 활성화 로직(1002)은 인과 관계 모듈(1000)을 포함하는 장치 외부의 소스로부터 공유 라이브러리를 다운로드할 수 있다.
단계 804에서, 임의 코드를 실행하기 위해 공유 라이브러리로 호출이 이루어진다. 예시적 구현예에서, 호출 로직(1004)이 임의 코드를 실행하기 위해 공유 라이브러리로 호출한다.
일부 예시적 실시예들에서 흐름도(800)의 하나 이상의 단계들(802 및/또는 804)은 수행되지 않을 수 있다. 또한, 단계들(802 및/또는 804)에 추가하거나 그들을 대신하여 단계들이 수행될 수 있다.
도 9에 도시된 바와 같이, 흐름도(900)의 방법은 단계 902로 시작된다. 단계 902에서, 임의 코드가 코드 식별자에 의해 지시된 코드 컨테이너로부터 획득된다. 코드 식별자는 예컨대 MyDll.dll#MyCodeActivatingEntryPoint로서 특정될 수 있다. 예시적 구현예에서, 활성화 로직(1006)이 코드 컨테이너로부터 임의 코드를 획득한다.
단계 904에서 임의 코드는 타깃 프로세스의 엔트리 지점에서 활성화된다. 엔트리 지점은 코드 식별자에 의해 특정된다. 예를 들어 코드 식별자는 메모리로 로딩될 DLL, 임의 코드를 액세스하도록 호출들이 이루어져야 하는 엔트리 지점, 및 임의 코드에 호출하는 데 사용될 인터페이스를 식별하는 계약명(contract name)을 포함할 수 있다. 이 예에 따르면, DLL이 엔트리 지점을 드러낸다. 엔트리 지점은 예컨대, MyDll.dll#MyCodeActivatingEntryPoint와 같은 식별자에 의해 특정될 수 있다. 이 예에서 식별자의 초기 부분 "MyDU"은 한정하는 것이 아닌 예시의 목적으로 파일명을 나타낸다. 식별자의 초기 부분은 디스크 상의 어떤 바이너리로 전체 주소(fully-qualified) 경로나 임의 코드의 위치에 대응하는 다른 URL일 수 있다는 것을 알아야 한다. 예시적 구현예에서, 활성화 로직(1002)은 코드 식별자에 의해 특정된 타깃 프로세스의 엔트리 지점에서 임의 코드를 활성화한다.
일부 예시적 실시예들에서 흐름도(900)의 하나 이상의 단계들(902 및/또는 904)은 수행되지 않을 수 있다. 또한, 단계들(902 및/또는 904)에 추가하거나 그들을 대신하여 단계들이 수행될 수 있다.
인과 관계 모듈(1000)은 활성화 로직(1002), 호출 로직(1004) 및/또는 획득 로직(1006) 중 하나 이상을 포함하지 않을 수 있다. 또한, 인과 관계 모듈(1000)은 활성화 로직(1002), 호출 로직(1004) 및/또는 획득 로직(1006)에 더하거나 그들을 대신하여 모듈들을 포함할 수 있다.
인프로세스 주입 모듈(110), 요청 모듈(112), 타깃 모듈(114), 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 수신 모듈(308), 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱 모듈(510), 언패킹 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526), 상태 팝핑 모듈(528), 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 시동 모듈(710), 활성화 로직(1002), 호출 로직(1004), 획득 로직(1006), 흐름도(200), 흐름도(400), 흐름도(600), 흐름도(800) 및 흐름도(900)는 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 어떤 조합으로 구현될 수 있다.
예를 들어, 인프로세스 주입 모듈(110), 요청 모듈(112), 타깃 모듈(114), 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 수신 모듈(308), 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱 모듈(510), 언패킹 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526), 상태 팝핑 모듈(528), 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 시동 모듈(710), 활성화 로직(1002), 호출 로직(1004), 획득 로직(1006), 흐름도(200), 흐름도(400), 흐름도(600), 흐름도(800) 및/또는 흐름도(900)는 하나 이상의 프로세서들에서 실행되도록 구성된 컴퓨터 프로그램 코드로서 구현될 수 있다.
다른 예에서, 인프로세스 주입 모듈(110), 요청 모듈(112), 타깃 모듈(114), 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 수신 모듈(308), 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱 모듈(510), 언패킹 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526), 상태 팝핑 모듈(528), 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 시동 모듈(710), 활성화 로직(1002), 호출 로직(1004), 획득 로직(1006), 흐름도(200), 흐름도(400), 흐름도(600), 흐름도(800) 및/또는 흐름도(900)는 하드웨어 로직/전기 회로로서 구현될 수 있다.
예를 들어, 일 실시예에서, 인프로세스 주입 모듈(110), 요청 모듈(112), 타깃 모듈(114), 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 수신 모듈(308), 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱 모듈(510), 언패킹 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526), 상태 팝핑 모듈(528), 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 시동 모듈(710), 활성화 로직(1002), 호출 로직(1004), 획득 로직(1006), 흐름도(200), 흐름도(400), 흐름도(600), 흐름도(800) 및/또는 흐름도(900) 중 하나 이상은 SoC(system-on-chip)으로 구현될 수 있다. SoC는 프로세서(예를 들어, 마이크로컨트롤러, 마이크로프로세서, 디지털 신호 처리기(DSP) 등), 메모리, 하나 이상의 통신 인터페이스들 및/또는 그것의 기능들을 수행할 추가 회로들 및/또는 내장 펌웨어 중 하나 이상을 포함하는 집적 회로 칩을 포함할 수 있다.
도 11은 실시예들이 구현될 수 있는 예시적 컴퓨터(1100)를 도시한다. 도 1에 도시된(또는 도 1, 3, 5, 7 및 10에 도시된 어떤 하나 이상의 하위 구성요소들)클라이언트들(102A-102M) 중 어느 하나 이상 또는 서버들(106A-106N) 중 어떤 하나 이상이 컴퓨터(1100)의 하나 이상의 특성들 및/또는 다른 특성들을 포함하는 컴퓨터(1100)를 이용하여 구현될 수 있다. 컴퓨터(1100)는 예컨대 보편적 퍼스널 컴퓨터, 모바일 컴퓨터, 또는 워크스테이션의 형태인 범용 컴퓨팅 장치일 수 있고, 혹은 컴퓨터(1100)가 특수 목적 컴퓨팅 장치일 수 있다. 본 명세서에서 제공되는 컴퓨터(1100)에 대한 내용은 한정하는 것이 아닌 예시의 목적으로 제공된다. 실시예들은 당업자에게 알려진 바와 같이 컴퓨터 시스템들의 다른 유형들로 구현될 수 있다.
도 11에 도시된 바와 같이, 컴퓨터(1100)는 프로세싱 유닛(1102), 시스템 메모리(1104), 및 시스템 메모리(1104)를 프로세싱 유닛(1102)에 연결시키는 버스(1106)를 포함한다. 버스(1106)는 다양한 버스 구조들 중 어느 하나를 이용하는 메모리 버스나 메모리 제어기, 주변기기 버스, 가속화 그래픽 포트, 및 프로세서나 로컬 버스를 포함하는 여러 유형의 버스 구조들 중 어느 하나 중 하나 이상을 나타낸다. 시스템 메모리(1104)는 ROM(read only memory)(1108) 및 RAM(random access memory)(1110)을 포함한다. 베이직 입출력 시스템(1112)(BIOS)이 ROM(1108)에 저장된다.
컴퓨터(1100)는 또한 하드 디스크에 읽고 쓰기를 하기 위한 하드 디스크 드라이브(1114), 착탈형 마그네틱 디스크(1118)에 읽고 쓰기를 하는 마그네틱 디스크 드라이브(1116), 및 CD ROM, DVD ROM 또는 다른 광 매체 같은 착탈형 광 디스크(1122)에 읽기 쓰기를 하는 광 디스크 드라이브(1120) 중 하나 이상을 가진다. 하드 디스크 드라이브(1114), 마그네틱 디스크 드라이브(1116) 및 광 디스크 드라이브(1120)는 각기 하드 디스크 드라이브 인터페이스(1124), 마그네틱 디스크 드라이브 인터페이스(1126) 및 광 드라이브 인터페이스(1128)에 의해 버스(1106)로 연결된다. 드라이브들 및 그 관련 컴퓨터 판독가능 매체는 컴퓨터에 컴퓨터 판독가능 명령어, 데이터 구조, 프로그램 모듈 및 기타 데이터의 비휘발성 저장을 지원한다. 하드 디스크, 착탈형 자기 디스크 및 착탈형 광 디스크가 기술되었으나, 플래시 메모리 카드, 디지털 비디오 디스크, RAM(random access memories), ROM(read only memories) 등과 같은 다른 유형의 컴퓨터 판독가능 저장 매체가 데이터 저장에 사용될 수 있다.
다수의 프로그램 모듈들이 하드 디스크, 자기 디스크, 광 디스크, ROM 또는 RAM 상에 저장될 수 있다. 이러한 프로그램들은 운영체계(1130), 하나 이상의 애플리케이션 프로그램(1132), 기타 프로그램 모듈들(1134), 및 프로그램 데이터(1136)를 포함한다. 애플리케이션 프로그램들(1132)이나 프로그램 모듈들(1134)은 예를 들어, 본 명세서에 기술된 바와 같이 인프로세스 주입 모듈(110), 요청 모듈(12), 타깃 모듈(114), 식별 모듈(302), 생성 모듈(304), 제공 모듈(306), 수신 모듈(308), 인터페이스 모듈(502), 활성화 결정 모듈(504), 제공 모듈(506), 상태 결정 모듈(508), 상태 푸싱 모듈(510), 언패킹 모듈(512), 이용 가능성 결정 모듈(514), 경로 결정 모듈(516), 활성화 모듈(518), 초기화 모듈(520), 등록 모듈(522), 패키징 모듈(524), 팝 결정 모듈(526), 상태 팝핑 모듈(528), 인터페이스 모듈(702), 인과 관계 모듈(704), 식별 모듈(706), 무효화 모듈(708), 시동 모듈(710), 활성화 로직(1002), 호출 로직(1004), 획득 로직(1006), 흐름도(200)(흐름도(200)의 어떤 단계를 포함), 흐름도(400)(흐름도(400)의 어떤 단계를 포함), 흐름도(600)(흐름도(600)의 어떤 단계를 포함), 흐름도(800)(흐름도(800)의 어떤 단계를 포함) 및/또는 흐름도(900)(흐름도(900)의 어떤 단계를 포함)를 구현하기 위한 컴퓨터 프로그램 로직을 포함할 수 있다.
사용자는 키보드(1138) 및 포인팅 장치(1140) 같은 입력 장치들을 통해 컴퓨터(1100)에 명령과 정보를 입력할 수 있다. 다른 입력 장치들(미도시)에는 마이크로폰, 조이스틱, 게임 패드, 위성 접시, 스캐너, 터치 스크린, 카메라, 가속계, 자이로스코프 등이 포함될 수 있다. 이들 및 기타 입력 장치들은 흔히 버스(1106)에 연결된 직렬 포트 인터페이스(1142)를 통해 프로세싱 유닛(1102)에 연결되나, 병렬 포트나 게임 포트 또는 유니버설 시리얼 버스(USB) 같은 다른 인터페이스들에 의해 연결될 수도 있다.
디스플레이 장치(1144)는 또한 비디오 어댑터(1146)와 같은 인터페이스를 통해 버스(1106)에 연결된다. 디스플레이 장치(1144) 외에, 컴퓨터(1100)는 스피커 및 프린터와 같은 다른 주변 출력 기기(미도시)를 포함할 수 있다.
컴퓨터(1100)는 네트워크 인터페이스나 어댑터(1150), 모뎀(1152) 또는 네트워크를 통한 통신을 설정하기 위한 다른 수단을 통해 네트워크(1148)(예를 들어, 인터넷)에 연결된다. 내장형 또는 외장형일 수 있는 모뎀(1152)이 직렬 포트 인터페이스(1142)를 통해 시스템 버스(1106)에 연결된다.
본 명세서에 사용되는 것과 같이 "컴퓨터 프로그램 매체" 및 "컴퓨터 판독가능 매체"라는 용어들은 일반적으로, 하드 디스크 드라이브(1114)와 관련된 하드 디스크, 착탈형 자기 디스크(1118), 착탈형 광 디스크(1122)와 같은 비일시적 매체뿐 아니라 플래시 메모리 카드들, 디지털 비디오 디스크들, RAM들, ROM들 등과 같은 다른 비일시적 매체를 칭하는 데 사용된다. 그러한 컴퓨터 판독가능 저장 매체는 통신 매체와 구별되며 그들과 중복되지 않는다. 통신 매체는 통상적으로 반송파와 같은 변조된 데이터 신호를 통해 컴퓨터 판독가능 명령어, 데이터 구조, 프로그램 모듈 또는 다른 데이터를 구현한다. "변조된 데이터 신호"라는 용어는 신호에 정보를 인코딩하기 위한 방식으로 세팅되거나 변경되는 신호의 특성들 중 한 개 이상을 가지는 신호를 의미한다. 한정이 아닌 예로서, 통신 매체는 음향, RF, 적외선 및 기타 무선 매체와 같은 무선 매체를 포함한다. 예시적 실시예들은 또한 그러한 통신 매체에 대한 것이다.
상술한 바와 같이, 컴퓨터 프로그램들 및 모듈들(애플리케이션 프로그램들(1132) 및 다른 프로그램 모듈들(1134)을 포함)은 하드 디스크, 자기 디스크, 광 디스크, ROM 또는 RAM에 저장될 수 있다. 그러한 컴퓨터 프로그램들은 또한 네트워크 인터페이스(1150)나 직렬 포트 인터페이스(1142)를 통해 수신될 수 있다. 그러한 컴퓨터 프로그램들은 애플리케이션에 의해 실행되거나 로딩될 때, 컴퓨터(1100)가 본 명세서에서 논의된 실시예들의 특성들을 구현할 수 있게 한다. 그에 따라 그러한 컴퓨터 프로그램들은 컴퓨터(1100)의 제어기들을 나타낸다.
예시적 실시예들은 또한 어떤 컴퓨터 사용가능 매체 상에 저장된 소프트웨어(예를 들어, 컴퓨터 판독가능 명령어들)을 포함하는 컴퓨터 프로그램 제품들에 관한 것이다. 그러한 소프트웨어는 하나 이상의 데이터 프로세싱 장치들에서 실행될 때, 데이터 프로세싱 장치(들)이 본 명세서에 기술된 바와 같이 동작하게 한다. 실시예들은 현재나 앞으로 알려지는 어떤 컴퓨터 사용가능 또는 컴퓨터 판독가능 매체를 이용할 수 있다. 컴퓨터 판독가능 매체들의 예들은 비한정적인 것으로서, RAM, 하드 드라이브들, 플로피 디스크들, CD ROM들, DVD ROM들, 집(zip) 디스크들, 테이프들, 자기 저장 장치들, 광 저장 장치들, MEMS 기반 저장 장치들, 나노기술 기반 저장 장치들 등과 같은 저장 장치들을 포함한다.
Ⅲ. 결론
다양한 실시예들이 위에서 기술되었지만, 그것들은 한정이 아닌 단지 예로서 제시된 것임을 이해해야 한다. 본 발명의 사상과 범위로부터 벗어나지 않으면서 본 명세서에서 형식과 세부사항에 있어 다양한 변경이 이뤄질 수 있다는 점은 당업자에게 자명하다. 따라서, 본 발명의 폭과 범위는 상술한 예시적 실시예들 중 어느 것에 의해 한정되지 않아야 하고 이하의 청구범위 및 그 균등물에 따라서만 정의될 수 있다.

Claims (10)

  1. 타깃 프로세스가 실행되는 동안에 상기 타깃 프로세스에서 상기 타깃 프로세스 외부에 있는 요청 프로세스로부터 메시지를 수신하는 단계와 - 상기 메시지는 상기 타깃 프로세스에서 임의 코드의 동적 실행을 요청하고, 상기 메시지는 상기 임의 코드를 식별하는 코드 식별자를 포함하고, 상기 코드 식별자는 상기 임의 코드를 위치 확인하고 활성화하는데 사용될 수 있음 -,
    활성화된 코드를 제공하기 위해 상기 타깃 프로세스가 실행되는 동안에 상기 코드 식별자에 기반하여 상기 임의 코드가 상기 타깃 프로세스에서 위치 확인되고 활성화되도록 하는 단계
    를 포함하는 방법.
  2. 제1항에 있어서,
    상기 임의 코드가 위치 확인되고 활성화되도록 하는 단계는
    운영체제 애플리케이션 프로그래밍 인터페이스가 상기 코드 식별자에 기반하여 레지스트리로부터 상기 임의 코드를 포함하는 코드 컨테이너의 위치를 찾도록 하는 단계를 포함하고,
    상기 운영체제 애플리케이션 프로그래밍 인터페이스가 상기 코드 컨테이너를 찾도록 하는 단계는
    상기 운영체제 애플리케이션 프로그래밍 인터페이스에 상기 코드 식별자를 제공하는 단계를 포함하는
    방법.
  3. 제1항에 있어서,
    상기 메시지를 수신하는 단계는
    경로 정보 및 위치 식별자를 수신하는 단계 - 상기 경로 정보는 코드 컨테이너에 대한 경로를 표시하고, 상기 위치 식별자는 공유 라이브러리의 위치를 표시함 - 를 포함하고,
    상기 임의 코드가 위치 확인되고 활성화되도록 하는 단계는
    상기 위치 식별자에 의해 표시된 상기 위치에 기반하고 또한 상기 경로 정보에 의해 표시된 상기 경로에 기반하여 상기 코드 컨테이너로부터의 상기 임의 코드를 상기 공유 라이브러리로 로딩하는 단계와,
    상기 임의 코드를 실행하기 위해 상기 공유 라이브러리로 호출하는 단계
    를 포함하는
    방법.
  4. 제1항에 있어서,
    상기 코드 식별자는, 컴파일되어 상기 타깃 프로세스 내에서 실행될 소스 코드를 포함하는
    방법.
  5. 제1항에 있어서,
    상기 활성화된 코드를 참조하는 값을 제공하는 단계 - 상기 값은 상기 타깃 프로세스가 계속 실행되는 동안 상기 타깃 프로세스와 상호 작용하도록 상기 요청 프로세스에 의해 호출될 수 있음 - 를 더 포함하는
    방법.
  6. 시스템에 있어서,
    타깃 프로세스가 실행되는 동안에 상기 타깃 프로세스에서 상기 타깃 프로세스 외부에 있는 요청 프로세스로부터 메시지를 수신하는 인터페이스 모듈과 - 상기 메시지는 상기 타깃 프로세스에서 임의 코드의 동적 실행을 요청하고, 상기 메시지는 상기 임의 코드를 식별하는 코드 식별자를 포함하고, 상기 코드 식별자는 상기 임의 코드를 위치 확인하고 활성화하는데 사용될 수 있음 -,
    활성화된 코드를 제공하기 위해 상기 타깃 프로세스가 실행되는 동안에 상기 코드 식별자에 기반하여 상기 임의 코드가 상기 타깃 프로세스에서 위치 확인되고 활성화되도록 구성된 인과 관계 모듈(causation module)
    을 포함하는 시스템.
  7. 제6항에 있어서,
    상기 인과 관계 모듈은
    상기 코드 식별자에 의해 표시된 코드 컨테이너로부터 상기 임의 코드를 획득하도록 구성된 획득 로직과,
    상기 타깃 프로세스의 엔트리 지점에서 상기 임의 코드를 활성화하도록 구성된 활성화 로직 - 상기 엔트리 지점은 상기 코드 식별자에 의해 특정됨 -
    을 포함하는
    시스템.
  8. 제6항에 있어서,
    상기 타깃 프로세스와 관련하여 인스턴스화되고 상기 활성화된 코드를 포함하는 인스턴스화된 코드를 식별하도록 구성된 식별 모듈과,
    무효화 메시지의 수신에 응답하여 상기 인스턴스화 코드를 무효화하도록 구성된 무효화 모듈
    을 더 포함하는
    시스템.
  9. 제6항에 있어서,
    상기 인과 관계 모듈은 상기 타깃 프로세스에서의 상기 임의 코드의 로딩 중에 상기 활성화된 코드와 관련된 스레드를 제외한 상기 타깃 프로세스의 모든 스레드를 정지시키도록 구성되는
    시스템.
  10. 프로세서 기반 시스템이 실행 중인 프로세스에 동적으로 코드를 주입할 수 있도록 하는 컴퓨터 프로그램 로직이 기록되어 있는 컴퓨터 판독가능 매체를 포함하는 컴퓨터 프로그램 제품으로서,
    상기 프로세스 기반 시스템이 타깃 프로세스가 실행되는 동안에 상기 타깃 프로세스 외부에 있는 요청 프로세스로부터 상기 타깃 프로세스로의 메시지 수신에 기반하여 활성화된 코드를 제공하기 위해 상기 타깃 프로세스가 실행되는 동안 임의 코드가 상기 타깃 프로세스에서 위치 확인되고 활성화되게 할 수 있도록 할 수 있는 제1프로그램 로직 모듈과 - 상기 메시지는 상기 타깃 프로세스 내 상기 임의 코드의 동적 실행을 요청하고, 상기 메시지는 상기 임의 코드를 식별하는 코드 식별자를 포함하고, 상기 코드 식별자는 상기 임의 코드를 위치 확인하고 활성화하는데 사용될 수 있음 - ,
    상기 프로세서 기반 시스템이 상기 활성화된 코드를 참조하는 값을 제공할 수 있게 하는 제2프로그램 로직 모듈 - 상기 값은 상기 타깃 프로세스가 계속 실행되는 동안에 상기 타깃 프로세스와 상호 작용하도록 상기 요청 프로세스에 의해 호출될 수 있음 -
    을 포함하는 컴퓨터 프로그램 제품.
KR1020147022177A 2012-02-09 2013-02-04 실행 중인 프로세스로의 동적 코드 주입 기법 KR102023223B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/370,126 US8539506B2 (en) 2012-02-09 2012-02-09 Dynamic injection of code into running process
US13/370,126 2012-02-09
PCT/US2013/024558 WO2013119481A1 (en) 2012-02-09 2013-02-04 Dynamic injection of code into running process

Publications (2)

Publication Number Publication Date
KR20140123521A true KR20140123521A (ko) 2014-10-22
KR102023223B1 KR102023223B1 (ko) 2019-11-04

Family

ID=48946753

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020147022177A KR102023223B1 (ko) 2012-02-09 2013-02-04 실행 중인 프로세스로의 동적 코드 주입 기법

Country Status (6)

Country Link
US (1) US8539506B2 (ko)
EP (1) EP2812794A4 (ko)
JP (1) JP6182160B2 (ko)
KR (1) KR102023223B1 (ko)
CN (1) CN104137062B (ko)
WO (1) WO2013119481A1 (ko)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9720809B2 (en) 2012-02-17 2017-08-01 Microsoft Technology Licensing, Llc Dynamically enabling debugging over the internet
US20150007156A1 (en) * 2013-06-26 2015-01-01 Sap Ag Injecting patch code at runtime
US10516733B2 (en) 2014-11-25 2019-12-24 Auth0, Inc. Multi-tenancy via code encapsulated in server requests
CN108664390B (zh) * 2017-03-31 2021-10-01 华为技术有限公司 一种内存泄露检测方法及设备
CN107153536B (zh) * 2017-03-31 2021-05-07 北京三快在线科技有限公司 一种应用处理方法及装置
WO2019021064A1 (en) * 2017-07-25 2019-01-31 Aurora Labs Ltd CONSTRUCTION OF SOFTWARE DELTA UPDATES FOR VEHICLE ECU SOFTWARE AND TOOL-BASED ANOMALY DETECTION
US11169858B2 (en) * 2018-06-15 2021-11-09 Nvidia Corporation Faster game enablement utilizing virtual machine reuse
US11983094B2 (en) 2019-12-05 2024-05-14 Microsoft Technology Licensing, Llc Software diagnostic context selection and use
CN111475229B (zh) * 2020-04-09 2021-01-15 广州锦行网络科技有限公司 一种Windows平台下的dll注入方法及系统
CN111488282B (zh) * 2020-04-13 2023-11-07 龙芯中科技术股份有限公司 业务功能处理方法、装置、电子设备及存储介质
CN112631891A (zh) * 2021-01-05 2021-04-09 网易(杭州)网络有限公司 性能剖析方法及装置、电子设备、存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5802367A (en) * 1995-07-07 1998-09-01 Microsoft Corporation Method and system for transparently executing code using a surrogate process
US20070113218A1 (en) * 2005-11-16 2007-05-17 Sun Microsystems, Inc. Debugging applications at resource constrained virtual machines using dynamically installable lightweight agents
KR100958967B1 (ko) * 2004-10-15 2010-05-20 인텔 코오퍼레이션 외부 에이전트에 의해 cpu 데이터 프리페치들을개시하기 위한 방법 및 장치
JP2010191658A (ja) * 2009-02-18 2010-09-02 Meidensha Corp アプリケーション・プログラムのメンテナンス方法
KR20110048670A (ko) * 2009-11-03 2011-05-12 주식회사 안철수연구소 악성 사이트 검출 장치, 방법 및 컴퓨터 프로그램이 기록된 기록매체

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6463583B1 (en) 1999-04-08 2002-10-08 Novadigm, Inc. Dynamic injection of execution logic into main dynamic link library function of the original kernel of a windowed operating system
US7886287B1 (en) 2003-08-27 2011-02-08 Avaya Inc. Method and apparatus for hot updating of running processes
US20060206585A1 (en) 2005-03-07 2006-09-14 Nextwave Media Group, Llc System and method for publishing targeted copy in a previously opened document independent of a user-initiated submission
US7694341B2 (en) 2005-06-03 2010-04-06 Apple Inc. Run-time code injection to perform checks
US8769672B2 (en) * 2006-08-03 2014-07-01 Symantec Corporation Code injection prevention
US8151277B2 (en) 2007-05-15 2012-04-03 Dynatrace Software Gmbh Method and system for dynamic remote injection of in-process agents into virtual machine based applications
US8060858B2 (en) * 2006-12-29 2011-11-15 Sap Ag Injection library
US8095910B2 (en) 2007-04-10 2012-01-10 Microsoft Corporation Interruptible client-side scripts
US20080307391A1 (en) 2007-06-11 2008-12-11 Microsoft Corporation Acquiring coverage data from a script
US20090024986A1 (en) 2007-07-19 2009-01-22 Microsoft Corporation Runtime code modification
CN105278963A (zh) * 2009-09-10 2016-01-27 联想(北京)有限公司 一种任务栏按钮的管理方法及装置
CN102314561B (zh) * 2010-07-01 2014-07-23 电子科技大学 基于api hook的恶意代码自动分析方法和系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5802367A (en) * 1995-07-07 1998-09-01 Microsoft Corporation Method and system for transparently executing code using a surrogate process
KR100958967B1 (ko) * 2004-10-15 2010-05-20 인텔 코오퍼레이션 외부 에이전트에 의해 cpu 데이터 프리페치들을개시하기 위한 방법 및 장치
US20070113218A1 (en) * 2005-11-16 2007-05-17 Sun Microsystems, Inc. Debugging applications at resource constrained virtual machines using dynamically installable lightweight agents
JP2010191658A (ja) * 2009-02-18 2010-09-02 Meidensha Corp アプリケーション・プログラムのメンテナンス方法
KR20110048670A (ko) * 2009-11-03 2011-05-12 주식회사 안철수연구소 악성 사이트 검출 장치, 방법 및 컴퓨터 프로그램이 기록된 기록매체

Also Published As

Publication number Publication date
US20130212595A1 (en) 2013-08-15
US8539506B2 (en) 2013-09-17
EP2812794A4 (en) 2016-05-18
CN104137062A (zh) 2014-11-05
JP6182160B2 (ja) 2017-08-16
CN104137062B (zh) 2017-08-15
JP2015507298A (ja) 2015-03-05
EP2812794A1 (en) 2014-12-17
WO2013119481A1 (en) 2013-08-15
KR102023223B1 (ko) 2019-11-04

Similar Documents

Publication Publication Date Title
KR102023223B1 (ko) 실행 중인 프로세스로의 동적 코드 주입 기법
US10162624B1 (en) Web shell for dynamically generated cross-platform applications
CN108027722B (zh) 在编译和部署中动态更新应用
EP2831726B1 (en) Dynamic plugin(s) for cloud application(s)
US9015702B2 (en) Determining compatibility of an application with different versions of an operating system
US9274768B2 (en) Runtime code hooking for print driver and functionality testing
CA2761563C (en) Annotating virtual application processes
US8683462B2 (en) Handling calls to native code in a managed code environment
EP2531914B1 (en) Extensible application virtualization subsystems
US20160232017A1 (en) System and Method for Reloading Constructors
CN110187910B (zh) 一种热更新方法、装置、设备及计算机可读存储介质
US9983869B2 (en) Adaptive interface for cross-platform component generation
US11061695B2 (en) Unikernel provisioning
US8200938B2 (en) Computer system and method providing a memory buffer for use with native and platform-independent software code
US7721278B2 (en) Modular server architecture for multi-environment HTTP request processing
US20070180433A1 (en) Method to enable accurate application packaging and deployment with optimized disk space usage
US20080141219A1 (en) Multiple inheritance facility for java script language
US11599342B2 (en) Pathname independent probing of binaries
US20090049423A1 (en) Javascripttm programming extension
JP2006276939A (ja) 仮想マシンのプログラム起動方法およびクライアントサーバシステム
US8793663B2 (en) Smart cache for a server test environment in an application development tool
CN114816445A (zh) 系统平台架构、函数发布方法及装置、平台及存储介质
US11423148B2 (en) Preventing discovery of unique identifiers in firmware
US20210303316A1 (en) Unikernel provisioning
CN110569641A (zh) 一种处理接口访问限制的方法、装置及电子设备

Legal Events

Date Code Title Description
N231 Notification of change of applicant
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right