여러 프로세스에 attach된 dll에서 하나의 jni JavaVM 포인터 접근하기

rlj1202의 이미지

인터넷에 자바를 위한 키보드 후킹 라이브러리가 돌아다니고 있기는 하지만 직접 만들어 보고픈 마음에 c언어와 jni라는 것을 배우면서 작업중에 있습니다.

dll에서 키보드 후킹 메소드(KeyboardProc)이 호출되면 자바 머신의 어떤 메소드를 호출하여서 값을 넘겨주어야 겠죠?
그러려면 JNIEnv 라는 포인터가 필요한데, 쓰레드 하나당 하나만 유효하다고 해서 JavaVM 이라는 값을 공유 하라고 하더군요.

메모리 맵핑으로 여러 dll 이 메모리를 공유할 수 있게 하였습니다. int 변수로 실험을 해 보았더니 값이 공유가 되니까, 포인터도 공유가 되겠죠?
그런데 JavaVM 포인터를 공유하고, 그놈에 접근해서 메소드를 실행하려고 하면 dll 이 detach 됩니다. 에러 메세지를 확인할수도 없고 참 난감합니다.

dll이 접근 가능한 메모리에 한계가 있는건가요?

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

rlj1202의 이미지

ㅋㅋ 불법적인 일을 하려는건 아니구, 자바에서 전역 키보드를 후킹해서 입력을 취소시켜 버리고 싶은 일이 있는데 다른 분들이 만들어둔 후킹 라이브러리는 입력 키보드 값만 받아올 수 있어서... 그동안 관심도 안가졌던 c언어를 배우면서 찾아보고 있는 중입니다. :D

익명 사용자의 이미지

소프트웨어는 일반적으로 이용허락(라이센스)의 형태로 제공되므로, 그 과정에서 배포자와 사용자 사이에 어떤 종류의 계약(Terms of Use라던가 EULA 등의 이름을 갖고 있죠)이 있기는 하지요.

법조인이 아니라면 거의 아무도 읽지 않을 그 내용에 대체로 리버스 엔지니어링 금지라던가 코드/데이터 변경금지와 같은 조항들이 종종 발견됩니다만, 여기에 얽힌 각종 논쟁들은 일단 제쳐놓고

하지 말라는 짓 하다가 걸리면 이용허락이 취소될 수 있다는 뭐 그런 종류의 경고 조항들도 있는데, 뭐 예컨대 스타크래프트에서 맵핵 쓰다가 걸려서 시디키 짤린다던가 하는 일을 생각해보시면 되겠습니다만,

아무튼 간에 설령 그런 게 있다고 해도 그냥 계약위반일 뿐 불법이라고 단정지을 수 있는 건 아닌 것 같은데 너무 쉽게 말씀하시는 것 같네요. 혹시 제가 모르는 법률 조항이 어디 있습니까?

질문 글 맥락은 무시하시곤 단어 몇 개 긁어다가 검색결과만 나열해놓는 답변을 쓰시는 것까지야 남이 뭐라 할 일은 아니겠습니다만, 불법이라는 말씀은 왜 하셨는지 모르겠네요.

======================================================================================

어찌됐든 간에 저도 이 스레드에 끼게 됐으니 질문자님 질문에 대해 조금이라도 논하는 게 예의겠지요.

저는 jni에 대해서는 거의 모릅니다만 윈도우즈 시스템이나 전역 후킹에 대해서는 조금 압니다.
혹시 모든 프로세스에 dll을 집어넣어 후킹하는 형태로 가고 계신 거라면, 프로세스간에 공유 메모리를 통해 포인터를 공유하는 건 제법 어려운 일이라고 말씀드리지 않을 수 없네요.
포인터 값 자체는 int 변수의 값처럼 공유되는 게 맞습니다. 문제가 되는 것은, 포인터가 가리키는 곳(메모리 주소공간 상의 다른 곳)은 공유되지 않을 수 있다는 거에요.
특히 dll에 속하는 데이터나 코드들은 서로 다른 프로세스의 주소공간에서 꼭 동일한 주소에 올라간다는 보장이 없어서 문제가 됩니다.

주소공간을 상당히 세밀하게 제어할 수 있는 상황이라면 필요한 모든 코드/데이터를 똑같은 주소에 올려서 포인터가 공유되게 만들 수도 있지만, 모든 프로세스를 후킹할 때처럼 통제하기 어려운 환경에서는 거의 불가능합니다.
이럴 때는 비록 상당히 제한적이긴 하지만 인터프로세스 통신 등을 통하여 필요한 기능을 구현하는 것이 안전합니다.

rlj1202의 이미지

오오!!! 제가 궁금했던게 바로 그거였어요.
말씀하신데로 모든 프로세스에 dll이 들어가서 jni를 통해서 자바 머신으로 콜백을 주는건데, 어떻게 하던간에 dll이 자바 머신에 접근?할 수 있어야 겠더라구요.
인터프로세스 통신이라면, 자바가상머신의 프로세스와 dll이 장착된 프로세스와의 통신을 하는건가요?

==추가
그런데, jni에 대한 설명에 보면 JavaVM이라는 포인터는 모든 쓰레드에 대해서 공유 가능하다 라고 되어 있어서 thread-safe라고 들었습니다. 이거랑 관련이 있을까요? 사실 정확히 무슨 소린지 모르겠습니다;;

shint의 이미지

DLL DETACH 문제일까? 초기화는 했을까? DETACH 가 2번 호출되지는 않을까?
MSAA의 Accessibility 는 적용 가능할까?
포인터 주소값은 있을까?
웹 접근의 Accessibility 는 허용될까?
ActiveX 의 OCX 로 처리가 가능할까?
COM DLL 로딩이 문제가 될까?
리턴값 오류를 확인할 수 있을까?

Virtual Keyboard. IME. IMM. GetCursor. UI Automation. AccessibleObjectFromPoint. 는 쓸모가 있을까?
Hook. SubClass. SendMessage 는 위법일까?

그리고. 윈도우32비트에서는 각 프로세스당 2GB 에 사용자 메모리를 확인하실 수 있습니다.
전체는 4GB 이구요. 확장이 가능합니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon MSAA Accessibility 검색.txt14.01 KB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.