이렇게.. 답변 계속해 주셔서 대단히 감사드립니다... ㅠ.ㅠ
유영인님 말씀대로.. --;
메모리를 해제 시켜 버리더군요.. --;
그래서 제가 확인해 본 결과 네트워크 상에서 읽어들여서
뿌려주는 데이터는 확인이 되는것 같습니다.. ㅠ.ㅠ
흠.. 결국 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 도 아니도 디자인이 예쁘더군요..)
: : : : : : : : 흠.. 그리고 안에서 돌아가는 값들도 보고 제어해야 될 부분이 생기더군요.. ㅠ.ㅠ
: : : : : : : :
: : : : : : : : 핸들만 가지고 그 프로그램의 값들을 가져 올려고 했는데 안되고 있습니다...
: : : : : : : : 어떻게 하면 그 프로그램 내부에 돌고 있는 값들을 읽어들여서 분석해서
: : : : : : : :
: : : : : : : : 제가 원하는 데이터로 변경 할 수 있을지 정말 막막합니다... ㅠ.ㅠ
: : : : : : : : 처음 이런 일을 당해서... 저도 후킹이라는 것도 보고 있지만... 어떻게 하면 좋을지
: : : : : : : :
: : : : : : : : 질문드려 봅니다.... 핸들 가지고 이전에 답변 올려져 있는 것들을 보고 적용해 보았는데
: : : : : : : : 안되더군요... --;; 어떤 방법이 있는지 답변 부탁드립니다...
: : : : : : : :
: : : : : : : :
|