반응형

제가 개발한 InjDll.exe 프로그램을 소개합니다. 
이 프로그램을 이용해서 원하는 DLL 을 대상 프로세스에 Injection/Ejection 시킬 수 있습니다.



DLL Injection 에 관련된 설명을 아래 링크를 참조하세요.




InjDll.exe (Ver 1.0.0)


제 블로그 study 에서 자주 소개되는 프로그램입니다.
소스를 조금 다듬고 기능을 추가시켜서 정식 버전(1.0.0)으로 배포합니다.

이 프로그램은 공개용이며, 자유롭게 사용하실 수 있습니다.


* 주의!
기본적으로 Windows 2000 이상만 지원합니다. (Windows 7, XP 에서 테스트 되었습니다.)
Windows 9X 계열에서는 사용하실 수 없습니다.


사용방법은 아래와 같습니다.

InjDll.exe <procname|pid|*> <-i|-e> <dll path>

<procname|pid|*>
  procname      Process name (ex: explorer.exe, notepad.exe, etc)
  pid           Process ID

<-i|-e>
  -i            Injection Mode
  -e            Ejection Mode

<dll path>      DLL File Path (relative or full)


사용 예
- PID 2840 프로세스에게 dummy.dll 파일을 Injection 시킬 때



- IE 프로세스에게 dummy.dll 파일을 Injection 시킬 때



- 모든 프로세스에게 dummy.dll 파일을 Injection 시킬 때



Ejection 은 –i 대신 –e 를 사용하면 됩니다.



InjDll.exe (Ver 1.1.1)


InjDll.exe 가 버전업 되었습니다. (2010.10.29)




추가/변경 사항


1. 64bit 지원

InjDll64.exe 를 이용하여 64bit 프로세스에 64bit DLL 파일을 인젝션 시킬 수 있습니다. 

* 64bit 프로세스에 DLL Injection 을 하기 위해서는 Injector(InjDll64.exe) & DLL 파일이 모두 64bit(PE32+) 이어야 합니다.


2. <dll path> 의 "상대 경로" 지원 

아래와 같이 Dll 파일 위치를 상대 경로로 입력할 수 있습니다.

InjDll32.exe notepad.exe -i dummy32.dll
InjDll32.exe calc.exe -i ..\hook.dll
...



주의사항


1) 원격 스레드를 실행시켜 LoadLibrary() 를 호출하는 방식이므로 대상 프로세스에 kernel32.dll 이 로딩되어 있지 않다면 Injection/Ejection 작업은 실패합니다.

2) 접근 권한이 제한된 (보호받는) 프로세스나 Anti-Injection 기법이 적용된 프로세스 들에게도 역시 Injection/Ejection 작업은 실패합니다.

3) 원칙적으로 Injection 을 N 번 시켰을 때 Ejection 도 같은 횟수로 호출해 줘야 해당 DLL 이 제대로 unloading 됩니다.



Bugs


사용하시다가 버그가 발견된다면 댓글로 알려주시면 감사하겠습니다.



ReverseCore

위 글이 도움이 되셨다면 추천(VIEW ON) 부탁 드려요~
반응형

'tool' 카테고리의 다른 글

PEView.exe  (21) 2013.01.27
HxD.exe 기능 추가!  (12) 2012.06.14
리버싱 현업에서 사용되는 디버거(Debugger)들  (33) 2010.09.29
InjDll.exe – DLL Injection/Ejection 전용 도구  (43) 2010.03.15
Process Explorer - 최고의 작업 관리자  (1) 2009.05.03
www.virustotal.com  (3) 2009.03.20
www.google.com  (2) 2009.03.06
  1. 이전 댓글 더보기
  2. Alfred 2011.02.04 16:03

    안녕하세요!

    InjDll32.exe notepad.exe -i dummy32.dll 을 실행시키니

    The token does not have the specified privilege. 가 뜨는데요???

    • reversecore 2011.02.09 21:47 신고

      안녕하세요.

      아마 로그인한 계정이 "관리자" 속성이 없어서 그런것 아닐까요?

      계정을 확인해 보시기 바랍니다.

      감사합니다.

  3. Dual 2011.02.20 23:07

    우왕 /('ㅅ')/ 64 injector 네용
    테스트용으로 감사하게 쓰겠습니다~~ 만쉐에

  4. 아침햇살 2011.02.24 16:06

    안녕하세요~^^
    reversecore님의 만드신 dll injection코드를 가지고 여러가지로 공부하고 보안쪽을 위해 개발도
    하고 있는데요~~
    dll 인젝션이 않되는 프로세스가 있어서.. 64bit 윈도우7 인데요~
    프로세스명은 LSSrvc.exe 입니다... 이 프로세스에 대해 조사해 보니 lightscribe.com에서 제공하는
    LightScribe 디스크에 이미지를 인쇄하는 라이트 스크라이브 응용프로그램이라고 하네요~
    (네로 및 레코딩 프로그램 설치시 같이 설치될수 있다고 합니다.)
    왜 이놈에 DLL 인젝션이 안되는지..흠;;;; 프로세스 핸들을 못구해오는 것도 아니고..
    인젝션후 WaitForSingleObject 여기서 무한정 기다리는걸로 설정해놨는데...무한정 기다리네요.
    흠... 뭔가 더 정보가 나오면 다시 글 남기겠습니당 ^^ 수고하세요~

    • 아침햇살 2011.02.25 13:19

      으윽...아니네요..제가 뭔가 실수를 한거 같습니다...
      우선 제가 제작한걸로 인젝션후에 않되길래 reversecore님이 한걸로 했는데도 안되서...제가 그렇게 생각을 한거 같습니다..

      재부팅후 reversecore님이 만들걸로 먼져 시도하였더니 정상 동작됨을 확인하였습니다...

      아무래도 제가 한 부분에 먼저 문제가 있는거 같습니다.~~

      reversecore님이 만든 인젝터는 정상동작합니다^^

    • reversecore 2011.02.28 15:48 신고

      아, 그러셨군요~ ^^

  5. 2011.02.25 17:34

    비밀댓글입니다

  6. 2011.06.24 21:35

    비밀댓글입니다

  7. 2011.07.07 17:23

    비밀댓글입니다

    • reversecore 2011.07.14 05:35 신고

      안녕하세요.

      NtCreateThreadEx() 가 실패할 때 에러값을 확인해보시고요.

      아마 제 생각에는 권한(특권:Privilege) 문제 같습니다.

      BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
      {
      TOKEN_PRIVILEGES tp;
      HANDLE hToken;
      LUID luid;

      if( !OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
      &hToken) )
      {
      _tprintf(L"OpenProcessToken error: %u\n", GetLastError());
      return FALSE;
      }

      if( !LookupPrivilegeValue(NULL, // lookup privilege on local system
      lpszPrivilege, // privilege to lookup
      &luid) ) // receives LUID of privilege
      {
      _tprintf(L"LookupPrivilegeValue error: %u\n", GetLastError() );
      return FALSE;
      }

      tp.PrivilegeCount = 1;
      tp.Privileges[0].Luid = luid;
      if( bEnablePrivilege )
      tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
      else
      tp.Privileges[0].Attributes = 0;

      // Enable the privilege or disable all privileges.
      if( !AdjustTokenPrivileges(hToken,
      FALSE,
      &tp,
      sizeof(TOKEN_PRIVILEGES),
      (PTOKEN_PRIVILEGES) NULL,
      (PDWORD) NULL) )
      {
      _tprintf(L"AdjustTokenPrivileges error: %u\n", GetLastError() );
      return FALSE;
      }

      if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
      {
      _tprintf(L"The token does not have the specified privilege. \n");
      return FALSE;
      }

      return TRUE;
      }

      위 함수를 추가해 주시고요.
      (위 코드는 MSDN 에서 검색 하실 수 있습니다.)

      인젝션 하기 전에 아래와 같이 호출해 주세요.

      SetPrivilege(SE_DEBUG_NAME, TRUE);

      잘 안되시면 다시 질문 올려주시기 바랍니다.

      감사합니다.

  8. 2012.01.07 16:03

    비밀댓글입니다

    • reversecore 2012.01.11 07:20 신고

      안녕하세요.

      OpenProcess() 호출 실패한다는 뜻인가요?

      www.reversecore.com/44 를 참조해서 해보시구요.

      보통 OpenProcess() 호출 실패는 말씀하신 권한 문제인 경우가 많습니다. 바로 위의 댓글을 참고하셔서 작업해 보세요.

      감사합니다.

  9. 2012.03.12 18:12

    비밀댓글입니다

  10. yg 2012.03.14 09:34

    점프코드로 메모장 파일저장 후킹을 하고 있습니다.
    64비트 윈도우7에서 하고 있는데요, 제 컴퓨터에선 잘 동작하는데, 다른 컴퓨터만가면 저장할때 메모장이 죽더라구요...
    그래서 디버깅을 해보니, 제 컴퓨터에선 점프주소를 통해 제가 생성한 함수로 잘 찾아가는데 비해 다른 컴퓨터에서는 그 주소에 Memory Access violation이 발생하더라구요... 혹시 주소값을 DWORD로 지정하여서 그런가 싶어 unsigned __int64로 선언하고 진행하여 보아도 안되구요...
    리버스코어님 소스를 바탕으로 하고 있는데 뭐가 문제인가 싶어 이렇게 질문드립니다.
    정말 미치겠네요ㅠㅠ 며칠째 해결 못하고 있어요...
    참..! 32비트에서는 정상 동작 확인 하였습니다!

  11. 2012.04.19 21:24

    비밀댓글입니다

  12. 지수경 2012.05.14 10:30

    항상 많은 도움을 받고 있습니다.~
    위 소스를 혹시 받을 수 있을까요? 댓글에 올라온 소스를 보니 최신이 아닌듯 해서용~
    부탁드립니다.^_^
    iam1004@gmail.com
    고맙습니다.^_^

  13. 이해림 2012.05.22 01:06

    32 bit 에서 CreateRemoteThread 를 써서 Injection 이 성공적으로 되었다 하더라도,Remote thread 에서 LoadLibrary/FreeLibrary 가 제대로
    성공했는지까지 체킹을 해야 완전한 Injection 관리가 됩니다
    따라서,
    CreateRemoteThread
    WaitForSingleObject
    한 뒤에 끝으로
    GetExitCodeThread
    를 해서 lpExitCode 로 넘어오는 값을 체크하고 있습니다
    그런데 문제는 lpExitCode 가 DWORd 라서 LoadLibrary 의 리턴값인 HMODULE(64bit)을 제대로
    돌려주지 못합니다
    이문제를 어떻게 해결하여야 하나요?

  14. 이해림 2012.05.22 05:51

    InjDll64.exe 와 InjDll32.exe 소스를 보내주시면 고맙겠습니다

  15. 이해림 2012.05.22 05:51

    아 메일주소를 빼먹었네요
    ehaerim@gmail.com 입니다

  16. 이해림 2012.05.22 13:20

    32 bit 에서 정상적으로 잘 작동하던 코드를 Windows 7 64 bit 로 바꾸기 위해 SetPrivilege 와 MyCreateRemoteThread 를 써서 Injection 해 보았습니다
    PFNTCREATETHREADEX 호출 결과가 NULL 이고 에러리턴값은 0xB7 (Cannot create a file when that file already exists) 입니다. 뭐가 문제일까요?
    혹시나 해서 CreateRemoteThread 로 해보니 곧바로 죽어버립니다
    dummy64.dll 은 MyCreateRemoteThread 로는 안되고 CreateRemoteThread 로는 Injection 이 됩니다

    어떻게 해야 실제 필요한 ,dll 을 inject 할 수 있을까요
    이론적 및 dummy64.dll injection 은 되는데 실제 필요한 dll 이 안된다면 아무런 쓸모가 없습니다
    어떻게 하면 실질적 도움을 받을 수 있을가요
    이메일은 ehaerim@gmail.com 입니다

  17. 김혜곤 2013.01.15 17:01

    소스좀 보내주세요!!

    mud0107@chol.com 입니다.

    미리 감사합니다.

    • reversecore 2013.01.18 01:25 신고

      안녕하세요.

      소스코드요?
      제 책의 소스코드에 같이 포함되어 있습니다.

      블로그 우측 메뉴의 "리버싱 핵심 원리 - src&bin" 에서 받으시면 됩니다. ^^

      감사합니다.

  18. 초학도 멍멍이 2013.04.04 10:48

    64비트프로세스에서 64비트 dll을 인젝시키는데 NtCreateThreadEx 함수에서 hProcess pThreadProc pRemoteBuf가 모두
    자기값이 들어가는데 호출하면 hThread값은 NULL이 들어가고
    GetLastError로 오유 얻으면 그것도 0x0으로 나와요.
    32비트프로세스 32비트 dll에서는 잘되는데요
    win7 64비트에서요
    꼭 좀 도와주세요

  19. 아.... 2013.10.05 14:32

    책에서 메모장에 myhack.dll 을 인젝션 시키는 예제가 있던데요..
    분명 책에서 나온것처럼 메모장실행시키고 인젝션을시켯는데...
    책에 있는 그림처럼 빈공백이 출력되면서 인젝션이 성공한것처럼보였지만,
    Process Explore로 메모장의 dll 호출 목록을 보면
    myhack.dll이 보이지가 않고 디버그뷰에도 아무런 이벤트가 생기지 않습니다.
    그니깐 인젝션 되지 않았습니다..
    이게 윈도우 로그인 아이디가 관리자 권한이 아니라서 그런건가요?

  20. 아... 2013.10.05 14:33

    윈도우 로그인 아이디가 관리자 권한인지
    아닌지 확인하는 방법좀 알려주세요;;
    로그인 아이디가 관리자 권한이 맞는것같은데;;

  21. 2019.03.28 18:39

    비밀댓글입니다

+ Recent posts