Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[9766] Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을
만신창이 [] 1510 읽음    2004-07-19 22:43
대단히 감사드립니다.. ㅠ.ㅠ
현재 API Hook 보고 있습니다...
노력하면 끝이 보이겠죠... 감사드립니다...
혹시라도...나중에라도.. 다른 자료가 혹시 찾아지시면.. 알려주세요..
저도 열심히 노력해 보겠습니다.
다시한번더 감사드립니다.

유영인  Cuperido 님이 쓰신 글 :
: 안잡히는군요.. :(
:
: API Hook 정도가 그럼 최선책이 아닐까요?
: VC 자료중에 API Hooking 관련 자료가 있어 첨부해 드립니다.
:
: 이거 이전에 컴파일 해서 돌려봤을때는 조금 에러 나는 것만 빼고서는
: 잘 동작을 했었습니다. (예외 처리 같은 부분들의 미비함)
:
: 책의 예제인데, 델파이 용으로는 아직 본적이 없어서 .. :(
: 그대로 사용하시는것 보다 여기에 나와있는 흐름만 보시고 델파이로
: 다시 코딩을 하시는 것이 좋을것 같습니다. API 같은 것은 그대로 많이
: 사용할 것이니깐요... :)
:
:
: cuperido
:
:
: 만신창이 님이 쓰신 글 :
: : 네.. ㅠ.ㅠ
: : 텍스트가 잡히지 않습니다..
: : 말씀하신데로.. --; 부분 API 후킹을 해야할지도...
: : 메모리에는 Free 해 주었지만.. 실제로 화면상에는 계속적으로
: : 표시가 됩니다.. 흠...
: :
: : 지금까지도 헤매면서 이것 저것 하고 있습니다..
: : 정말 이제는 미치겠군요..
: :
: :
: :
: :
: : 유영인  Cuperido 님이 쓰신 글 :
: : : 프로그램에 올라오는 데이터들을 계속적으로 긁어오는 방법이라는 것이
: : : 무슨 뜻인지 조금 애매합니다. 모든 변수들을 다 긁어오는 방법을 말씀
: : : 하시는 것인가요? 아니면 찍어내는 텍스트를 전부 말씀하시는 것인지요?
: : :
: : : 찍어내는 텍스트를 전부 긁어오는 방법은 API 후킹을 하는 수밖에 없습니다.
: : : 물론 찍어내는 API들에 관해서 전부 해주어야 겠지요.
: : :
: : : 변수를 전부 긁어오는 방법은 없는것으로 알고 있습니다. 일일히 검사 한다고
: : : 해도 그 엄청난 크기의 Heap에서 원하시는 데이터를 찾기란 거의 불가능이며,
: : : 또한, GameHack 같은 프로그램처럼 프로세스를 맵핑해서 변화값을 찾아낸다
: : : 하더라도 Heap 영역의 메모리 주소는 계속 변화되기 때문에 거의 불가능이라도
: : : 해도 과언이 아닙니다.
: : :
: : : 네트워크 데이터를 캡쳐하는 방법은 있습니다. C++ Builder Component 란에 보시면
: : : ( http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_comp&no=310 )
: : : 이경문 님이 델파이5로 제작하신 컴포넌트가 있습니다.
: : :
: : : 하지만, 보조 설치 모듈이 필요하며, 이러한 컴포넌트 특성상 어댑터에 따라서 좀 영향을
: : : 받을 수 밖에 없어서 불특정 다수에게의 배포용으로는 적합하지는 않는것 같습니다.
: : :
: : : 첨부해드린 프로그램으로는 텍스트가 안잡히는지요?
: : :
: : :
: : : cuperido
: : :
: : :
: : : 만신창이 님이 쓰신 글 :
: : : : 이렇게.. 답변 계속해 주셔서 대단히 감사드립니다... ㅠ.ㅠ
: : : : 유영인님 말씀대로.. --;
: : : : 메모리를 해제 시켜 버리더군요.. --;
: : : : 그래서 제가 확인해 본 결과 네트워크 상에서 읽어들여서
: : : : 뿌려주는 데이터는 확인이 되는것 같습니다.. ㅠ.ㅠ
: : : :
: : : : 흠.. 결국 2가지... 결론입니다..
: : : :
: : : : 1. 프로그램에 올라오는 데이터들을 계속적으로 긁어오는 방법
: : : : 2. 네트워크 데이터를 캡춰링 하는 방법
: : : :
: : : : 이렇게 두가지 답변이 나오더군요.. ㅠ.ㅠ
: : : : 그래서... 프로그램의 데이터들을 계속적으로 긁어오는 방법은 없는지
: : : : 궁금합니다... ㅠ.ㅠ
: : : :
: : : : memo 컨포넌트를 하나 붙이고 제가 지정한 핸들의 프로그램 내부에서
: : : : 올라오는 데이터를 강제적으로 memo 에 계속적으로 쓰는 방법같은건 없는지 궁금합니다.. ㅠ.ㅠ
: : : : 에궁...
: : : :
: : : : 이것때문에 머리 빠지네요....
: : : : 도움 대단히 감사드립니다...
: : : :
: : : :
: : : : 유영인  Cuperido 님이 쓰신 글 :
: : : : : 아마도 해당 스타일을 가지고 만들어 진것이 아닌것 같습니다.
: : : : : 이러한 경우에는 글자를 찍고, 메모리에서 해제를 시켜버려서 접근이 불가능 한것으로
: : : : : 알고 있습니다.
: : : : :
: : : : : 만약, 그렇지 않은 경우에는 텍스트를 등록하는 API를 알아내서 그 API를 후킹하는
: : : : : 쪽으로 해야 할텐데요, 우선 그 전에 첨부해 드린 파일로 마우스를 갔다 대었을때
: : : : : 텍스트가 읽혀지는지 테스트를 해봐 주셨으면 합니다.
: : : : :
: : : : : 이 프로그램은 윈도우 메세지를 이용해서 테스트를 읽는 방법으로, ITEM을 추출하는 방식과는
: : : : : 다른 방식으로, 이 프로그램으로 읽혀진다면 조금 더 쉽게 접근할 수 있을것 같습니다.
: : : : :
: : : : : 만약 읽혀진다면, 소스를 Pascal로 다시 포팅해서 올려드리겠습니다.
: : : : :
: : : : :
: : : : : cuperido
: : : : :
: : : : :
: : : : : 만신창이 님이 쓰신 글 :
: : : : : : 그런데... 제작되어져 있던 프로그램이 알고보니 VC++ 로 제작되어져 있었습니다.. --;
: : : : : : 아래 소스로 가져오는게 같이 적용되는지 모르겠습니다.....
: : : : : :
: : : : : : 흠.. 긁어올 수 없는 item 이라고 나옵니다.. ㅠ.ㅠ
: : : : : : 흠... 이미지가 리스트 박스와 같이 구성되어 있는데...
: : : : : : 내부 데이터 들은 전부 텍스트 입니다..
: : : : : :
: : : : : : 화면상은
: : : : : :
: : : : : : +-----------+----------+----------+
: : : : : : | 고객성명  | 고객등급 | 등록여부 |
: : : : : : +-----------+----------+----------+
: : : : : : | 아무개    | 실버     | 등록     | <- 이 한줄이 다 선택되어져 있습니다.
: : : : : : | 홍길동    | 골드     | 거부     |
: : : : : :
: : : : : : 이런 형식으로 리스트 업이 되어 있는데
: : : : : : 이게 리스트박스 처럼 보입니다. 물론 DB Grid 일수도 있겠지만.. ㅠ.ㅠ
: : : : : : 흠... 제가 관과한게 이것일지도 모르겠습니다... ㅠ.ㅠ
: : : : : : 흠... 한줄 allow 가 되니... 흠...
: : : : : : DB 에서 긁어오는거 아니면 텍스트를 DB 에서 가져와서 LISTBOX 에 뿌려 주는거
: : : : : : 두가지 경우가 있을것 같은데...
: : : : : : 어찌되었던지... 데이터를 가지고 오는게 문제가 있습니다..
: : : : : : 핸들은 잘 찾아 놓았는데... 저놈의 데이터를 가지고만 오면 제가
: : : : : : 어떻게든지 제가 짜는 프로그램에서 어떤 액션을 취할 수 있을것 같은데...
: : : : : : 이렇게 어려운 방법을 사용하게 될 줄 꿈에도 몰랐습니다.. ㅠ.ㅠ
: : : : : : 정말 답답하기 그지 없습니다...
: : : : : :
: : : : : : 제가 제일 힘들때 이렇게 도와 주셔서 대단히 감사드립니다..
: : : : : : ㅠ.ㅠ
: : : : : : 조금만 더 도와주십시오..ㅠ.ㅠ
: : : : : :
: : : : : :
: : : : : : 유영인  Cuperido 님이 쓰신 글 :
: : : : : : : 간단히 포팅을 하고 핸들 구하는 것을 추가 시키긴 하였는데,
: : : : : : : 왠지 별로 깨끗한 방법은 아니라 좀 그렇네요. GameHack과 같은 프로그램 원리인데
: : : : : : : 이것이 NT 계열 운영체제에서도 말끔히 돌아갈 수 있을지 (Write 등의 문제)
: : : : : : : 차라리 EXE 파일의 텍스트 부분을 수정하거나 말씀하신대로 API Hook 정도가 더 쉽지는
: : : : : : : 않을런지 라는 생각도 드네요. :)
: : : : : : :
: : : : : : :
: : : : : : : cuperido
: : : : : : :
: : : : : : :
: : : : : : : procedure TForm1.Button1Click(Sender: TObject);
: : : : : : : Var
: : : : : : :  hdApplicationHandle, hdHandle, hdProcessHandle : HWND;
: : : : : : :  lpProcess : LPDWORD;
: : : : : : :  itListItemHold : integer;
: : : : : : :  itReadBytes : Cardinal;
: : : : : : :  caEntry : array[0..200] of Char;
: : : : : : : begin
: : : : : : :
: : : : : : :  // ListBox 핸들 구하기 (TestForm에 TListBox1 이라는 클래스가 있다고 가정)
: : : : : : :  hdHandle := 0;
: : : : : : :
: : : : : : :  hdApplicationHandle := FindWindow(Nil, 'TestForm');
: : : : : : :  If hdApplicationHandle > 0 Then hdHandle := FindWindowEx(hdApplicationHandle, 0, 'TListBox', '');
: : : : : : :
: : : : : : :  If hdHandle = 0 Then exit;
: : : : : : :
: : : : : : :  // ListBox의 핸들이 아래임을 가정
: : : : : : :  GetWindowThreadProcessId(hdHandle, @lpProcess);
: : : : : : :  hdProcessHandle := OpenProcess(PROCESS_VM_READ or STANDARD_RIGHTS_REQUIRED, false, DWORD(lpProcess));
: : : : : : :  If hdProcessHandle = 0 Then exit;
: : : : : : :
: : : : : : :  itListItemHold := SendMessage(hdHandle, LB_GETITEMDATA, 0, 0);
: : : : : : :  If itListItemHold = 0 Then
: : : : : : :  Begin
: : : : : : :    MessageBox(0, 'Item을 긁어올 수 없는 형식의 Style', '', MB_OK);
: : : : : : :    exit;
: : : : : : :  End;
: : : : : : :
: : : : : : :  itListItemHold := itListItemHold + SendMessage(hdHandle, LB_GETCOUNT, 0, 0);
: : : : : : :
: : : : : : :  ReadProcessMemory(hdProcessHandle, @itListItemHold, @caEntry[0], 4, itReadBytes);
: : : : : : :  MoveMemory(@itListItemHold, @caEntry, 4);
: : : : : : :
: : : : : : :  itListItemHold := itListItemHold + 6;
: : : : : : :  ReadProcessMemory(hdProcessHandle, @itListItemHold, @caEntry[0], strlen(caEntry), itReadBytes);
: : : : : : :
: : : : : : :  CloseHandle(hdProcessHandle);
: : : : : : :  MessageBox(0, caEntry, '', MB_OK);
: : : : : : :
: : : : : : : end;
: : : : : : :
: : : : : : :
: : : : : : : 만신창이 님이 쓰신 글 :
: : : : : : : : 답변해 주셔서 대단히 감사드립니다...
: : : : : : : : ㅠ.ㅠ 델파이용으로 포팅된 소스는 없는지요.. ㅠ.ㅠ
: : : : : : : : C++ 을 어떻게 델파이로 포팅할 수 있을까요?... --;
: : : : : : : : 소스를 잘 못보는지라.. ㅠ.ㅠ
: : : : : : : : 에휴... 저도 계속 포팅해 보다가 안되어서 올려 봅니다.. ㅠ.ㅠ
: : : : : : : : 한번더 부탁드리겠습니다...
: : : : : : : : 감사합니다...
: : : : : : : :
: : : : : : : : 유영인  Cuperido 님이 쓰신 글 :
: : : : : : : : : LVS_OWNERDRAWFIXED, LVS_OWNERDATA, LBS_HASSTRINGS
: : : : : : : : : 라는 Window style 을 함께 포함하고 있는 객체인가요?
: : : : : : : : :
: : : : : : : : : 제 소스는 아니지만, 이러한 식으로 위 플래그가 있는 객체에서 긁어오는데는 문제가 없다는군요.
: : : : : : : : : (델파이용 소스를 못구해서 C++ Builder 용으로. ^^)
: : : : : : : : :
: : : : : : : : :
: : : : : : : : : cuperido
: : : : : : : : :
: : : : : : : : :
: : : : : : : : : char *entry = new char[200];
: : : : : : : : : long ListItemHold=0;
: : : : : : : : : long ListEntryHold=0;
: : : : : : : : : LPDWORD ReadBytes=0;
: : : : : : : : : LPDWORD Process=0;
: : : : : : : : : HANDLE ProcessThread;
: : : : : : : : :
: : : : : : : : : GetWindowThreadProcessId( +++ListBox handle+++ ,Process);
: : : : : : : : : ProcessThread = OpenProcess(PROCESS_VM_READ|STANDARD_RIGHTS_REQUIRED,false,(DWORD)Process);
: : : : : : : : :
: : : : : : : : : ListItemHold = ::SendMessage(+++ListBox handle+++, LB_GETITEMDATA,0,0);
: : : : : : : : :
: : : : : : : : : ListItemHold += ::SendMessage(+++ListBox handle+++,LB_GETCOUNT,0,0);
: : : : : : : : : ReadProcessMemory(ProcessThread,(LPCVOID)ListItemHold,(LPVOID)entry,4,ReadBytes);
: : : : : : : : :
: : : : : : : : : MoveMemory((PVOID)ListEntryHold,(CONST VOID *)entry,4);
: : : : : : : : : ListEntryHold+=6;
: : : : : : : : : ReadProcessMemory(ProcessThread,(LPCVOID)ListEntryHold,(LPVOID)entry, strlen(entry), ReadBytes);
: : : : : : : : : CloseHandle(ProcessThread);
: : : : : : : : :
: : : : : : : : : MessageBox(0, entry,"",MB_OK);
: : : : : : : : :
: : : : : : : : :
: : : : : : : : : 만신창이 님이 쓰신 글 :
: : : : : : : : : : SysListView32 라는 클레스를 가지고 있습니다.
: : : : : : : : : :
: : : : : : : : : :
: : : : : : : : : : 유영인  Cuperido 님이 쓰신 글 :
: : : : : : : : : : : LB_GETITEMDATA 이라는 윈도우 메시지로 ItemData를 얻어올 수 있는 방법이 있습니다.
: : : : : : : : : : : 하지만, ListBox가 LBS_HASSTRINGS 이라는 속성을 가진채로, OwnerDraw 되었을 때만
: : : : : : : : : : : 가능한 방법이고요. (Item 갯수가 32768개 미만일 경우에만 가능합니다)
: : : : : : : : : : :
: : : : : : : : : : : 그렇지 않은 경우에는 별도의 어플리케이션 영역이라 메모리 접근이 불가능 합니다.
: : : : : : : : : : : 말씀하신 대로 후킹을 하든지 해야할텐데, 찍어내는 방법이 여러가지라 어떤 API를
: : : : : : : : : : : 후킹할지도 모호하네요.
: : : : : : : : : : :
: : : : : : : : : : : 어떤 객체인지 확실히 분석이 가능하다면 더 큰 도움을 드릴 수 있을텐데요.. :(
: : : : : : : : : : :
: : : : : : : : : : :
: : : : : : : : : : : cuperido
: : : : : : : : : : :
: : : : : : : : : : :
: : : : : : : : : : : 망신창이 님이 쓰신 글 :
: : : : : : : : : : : : 안녕하세요.
: : : : : : : : : : : :
: : : : : : : : : : : : 제가 모 회사에 취직을 하게 되었는데
: : : : : : : : : : : : 이전에 있다가 나간 사람이 어플리케이션을 개발하고 퇴사해 버렸습니다.
: : : : : : : : : : : : 다른 정보도 없이... --;; 더군다나 소스도 날라간 상태... --;;;;;
: : : : : : : : : : : : 소스도 없는 상황에서.. --;
: : : : : : : : : : : :
: : : : : : : : : : : : 이놈을 제어 아닌 제어 해야 될 일이 생겨 버렸습니다.. ㅠ.ㅠ
: : : : : : : : : : : : 제가 만든 프로그램으로 그 프로그램(폼 디자인 예쁩니다)의 분석을 시작했었는데
: : : : : : : : : : : :
: : : : : : : : : : : : 핸들 찾아서 그 핸들 가진 부분의 ListBox 에 있는 값들을 가지고 와서
: : : : : : : : : : : : 수정해야 될 일이 생겼습니다... (일반 ListBox 도 아니도 디자인이 예쁘더군요..)
: : : : : : : : : : : : 흠.. 그리고 안에서 돌아가는 값들도 보고 제어해야 될 부분이 생기더군요.. ㅠ.ㅠ
: : : : : : : : : : : :
: : : : : : : : : : : : 핸들만 가지고 그 프로그램의 값들을 가져 올려고 했는데 안되고 있습니다...
: : : : : : : : : : : : 어떻게 하면 그 프로그램 내부에 돌고 있는 값들을 읽어들여서 분석해서
: : : : : : : : : : : :
: : : : : : : : : : : : 제가 원하는 데이터로 변경 할 수 있을지 정말 막막합니다... ㅠ.ㅠ
: : : : : : : : : : : : 처음 이런 일을 당해서... 저도 후킹이라는 것도 보고 있지만... 어떻게 하면 좋을지
: : : : : : : : : : : :
: : : : : : : : : : : : 질문드려 봅니다.... 핸들 가지고 이전에 답변 올려져 있는 것들을 보고 적용해 보았는데
: : : : : : : : : : : : 안되더군요... --;; 어떤 방법이 있는지 답변 부탁드립니다...
: : : : : : : : : : : :
: : : : : : : : : : : :

+ -

관련 글 리스트
9740 [질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 변경하고 싶습니다. 망신창이 1263 2004/07/15
9742     Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 변경하고 싶습니다 유영인 Cuperido 1709 2004/07/16
9744         Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 변경하고 싶습 만신창이 1305 2004/07/17
9745             Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 변경하고 유영인 Cuperido 1765 2004/07/17
9746                 Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 변경 만신창이 1338 2004/07/17
9747                     Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와서 유영인 Cuperido 1410 2004/07/17
9749                         Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁어와 만신창이 1269 2004/07/17
9751                             Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으로 긁 유영인 Cuperido 1195 2004/07/17
9754                                 Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그램으 만신창이 1317 2004/07/18
9756                                     Re:Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프로그 유영인 Cuperido 1424 2004/07/18
9761                                         Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 프 만신창이 1167 2004/07/19
9765                                             Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 저의 유영인 Cuperido 1483 2004/07/19
9766                                                 Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:Re:[질문] 다른 어플리케이션의 내부에 돌아가는 값들을 만신창이 1510 2004/07/19
9748                         Re:Re:Re:Re:Re:Re:[질문] 내용을 좀 수정하였습니다... 만신창이 1457 2004/07/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.