가끔 보면 이것저것 분석할 일이 생기는데 불편함을 느낄때가....

 API Monitor 같은 도구는 말 그대로 API만 모니터링 해준다.

IDA로 분석 후 올리로 확인하면 되지만 너무 귀찮고 매번 쫏아가서 확인하기도 귀찮고...해서 열심히 찾아봤지만

API가 아닌 사용자 정의 함수(USER Function)에 대한 모니터링 도구가 없었다.

그래서 하나 만들어 써야겠다는 생각에 만들었는데 제법(?) 쓸만하다.. ㅋㅋㅋ


만든 도구인데...

간단히 설명하면... 

1. 분석하고자 하는 대상 프로세스를 선택 후

2. 내부에서 사용하는 DLL 리스트를 확인. 이 후 분석하고자 하는 DLL를 선택하면, 내부 im/export 함수 목록과 기본 정보가 출력하며, 등록되지 않은 다른 함수들도 출력(내부에서 사용자가 구현한, 또는 im/export 되지 않은  함수들)

3. 원하는 대상을 클릭 시 해당 함수 내부에서 호출 또는 점프하는 주소를 출력

4. 주소값 확인 후 모니터링 대상에 추가 후 모니터링 ( 모니터링 주소값은 임의로 추가 가능)


아직 버그가 몇개 남아있어서 수정중이긴 하지만 지금도 나름 쓸만해보인다...극히 개인적인 생각.. ㅋㅋ

API와 같은 함수들은 파라미터들을 확인하고 원하는 값을 뽑는게 가능하지만, 사용자 정의 함수는 파라미터이 몇개인지 알 도리가 없으므로(물론 IDA와 같은 좋은 도구들은 어떻게 찾는지 모르지만, 뽑아줌...하지만 난 모름..ㅋ) 파라미터 3개까지만 각 자료형별로 출력하도록 했다. 

어차피 이건 Memget Project에 포함되있는 기능이고, 해당 파라미터가 만약 포인터 또는 구조체일 경우 주소를 덤프떠보면 뭐가 나오지 않을까? ...


차후 필요한 기능들을 좀더 붙여봐야겠다.

Posted by Nvdark
,

BHO에 접근하기 위한 방법은 여러가지가 있습니다.

그중 가장 크게 나눈다면 타 프로세스에서 IE에 접근하는 방법과 IE내부(BHO 설치 후)에서 접근하는 방법으로 나눌수 있을것 같습니다.


그 중 개인적으로는 가장 구현하기 편하고, 응용하기도 편한 타 프로세스에서 IE에 접근하는 방법을 포스팅하겠습니다.


포스팅할 내용은 주요 코드 위주로 설명하며 세부적인 응용은 포스팅하지 않겠습니다.


일단....가장먼저 IE의 PID를 알아야겠죠.

PID를 얻어오는 방법은 생략하겠습니다. 뭐 직접 입력해줘도 되는거니깐요.


PID를 얻었다면

DWORD dwPID;

HWND hwnd = GetWinHandle(dwPID);

로 IE의 핸들을 얻어옵니다. 해당 핸들을 이용하여 다음은 접근할 IE를 찾아야하는데, 요세 나오는 브라우져들 특징은 탭기능이 있다는겁니다. 그 많은 탭중에서 현재 사용하고 있는 탭을 찾아야합니다. 저같은 경우는 모든 핸들을 출력해주고, 원하는 핸들을 선택하도록 했는데 이 방법은 다음에 포스팅 하도록 하겠습니다.


외부에서 BHO에 접근하는 방법도 여러가지가 있는데 이번엔  ObjectFromLresult을 이용하여 접근하는 방법입니다.

HINSTANCE hins = ::LoadLibrary(_T("OLEACC.DLL"));

위와 같이 OLEACC.DLL의 인스턴스를 얻어옵니다.

이 후 얻은 인스턴스를 이용하여 ObjectFromLresult 함수의 주소를 얻습니다.

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hins , "ObjectFromLresult" );

ObjectFromLresult함수에 대한 설명은 MSDN을 참고하시면될것같습니다.

ObjectFromLresult의 2번째 인자값을 IID_IHTMLDocument2 로 주시면 4번째 인자값이 OUT으로써 IHTMLDocument2 의 주소값을 받아옵니다. 간단히 작성하면, 

IHTMLDocument2* pIhtmldocument2;

HRESULT hresult = (*pfObjectFromLresult)( Lresult , IID_IHTMLDocument2 , 0 , ( void**) pIhtmldocument2 );

IHTMLdocument2를 얻어왔다면 접근은 다 했네요. 

이후에 1,2,3 왔다 갔다 하시면서 원하시는 기능을 추가하시면됩니다. 


적어놓고 보니 생각보다 간단하네요.

첨부로 MSDN에 나온 ObjectFromLresult함수 내용입니다. 

http://msdn.microsoft.com/en-us/library/windows/desktop/dd373605(v=vs.85).aspx

STDAPI ObjectFromLresult(

  _In_   LRESULT lResult,
  _In_   REFIID riid,
  _In_   WPARAM wParam,
  _Out_  void **ppvObject
);


Parameters

lResult [in]

Type: LRESULT

A 32-bit value returned by a previous successful call to the LresultFromObject function.

riid [in]

Type: REFIID

Reference identifier of the interface to be retrieved. This is IID_IAccessible.

wParam [in]

Type: WPARAM

Value sent by the associated WM_GETOBJECT message in its wParam parameter.

ppvObject [out]

Type: void**

Receives the address of the IAccessible interface on the object that corresponds to the WM_GETOBJECTmessage.


Posted by Nvdark
,

주소값 가지고 출력했다가 다시 포인터로 바꿨다가 ....저장했다가...계산했다가...하다가...

문자열변수에 0xFFDDEECC 가 저장되어있는데 이놈을 어떻게 정수형으로 (16진수로) 바꿀까 하다가 열심히 찾던 중 

후배놈이알려준 함수! 


strtoul, strtol 뭐 두개다 같은 기능이지만, 반환형이 다르다. 

ul은 보다시피 unsigned long이고 뒤에껀 그냥 long 형으로 반환!

개인적으로 써보니 0x2045f35d같은 값은 strtol로도 잘 변환되지만

음수형 16진수(0xFFFFEDF4 같은 것들)의 경우 값이 0x7FFFFFFF로 고정 반환이였다.

하여 이럴땐 strtoul을 사용하면 정상적인 값이 반환되는것을 볼수 있다.


사용은 간단하다. 자세한건 MSDN을 참조하면되겠지만.... 코드로 간단히 적으면

DWORD dwHexValue;

char* StringValue;

char* Error;

dwHexValue = strtol( StringValue, &Error, 16);

// 또는

dwHexValue = strtoul( StringValue, &Error, 16);

위와 같이 사용하면된다.

첫번째 인자값은 변환할 문자열!

두번째는 변환하다가 에러나면 에러난부분을 받아줄 변수인데 NULL로 넣어도 상관없다.

세번째는 진수!

dwHexValue = strtoul( StringValue, NULL, 16);

처럼 사용해도 된다.


Posted by Nvdark
,

일단 BHO에 접근하여 IHTMLDocument2를 얻었다는 가정하에 시작.

IHTMLDocument2  *pHTMLDoc2


BSTR ValueChange;

BSTR TagID;

ValueChange = CStringToBstr(g_BhoTagValueChange);

TagID = CStringToBstr(g_BhoTagID);


CComQIPtr <IHTMLDocument3> pDocu3_ValueChange(pHTMLDoc2);

CComPtr <IHTMLElement> pElement_ValueChange;


pDocu3_ValueChange->getElementById(TagID, &pElement_ValueChange);


CComQIPtr <IHTMLInputElement> pInput_ValueChange(pElement_ValueChange);


if( pInput_ValueChange )

{

pInput_ValueChange->put_value(ValueChange);

}

CStringToBstr()은 Edit Control 에서 입력받은 CString을 BSTR로 변환해주기 위해 사용함.

주요 내용은 

CComQIPtr <IHTMLDocument3> pDocu3_ValueChange(pHTMLDoc2);

로 IHTMLDocument2를 3으로 바꿔주고

pDocu3_ValueChange->getElementById(TagID, &pElement_ValueChange);

입력받은 테그 ID로 해당 엘리먼트를 검색 후

CComQIPtr <IHTMLInputElement> pInput_ValueChange(pElement_ValueChange);

(INPUT테그일경우) IHTMLInputElement로 변환함

정상적으로 변환되었다면 put_value함수를 이용해 값을 변경할 수 있음.

반대로 get_value를 사용하면 해당값을 얻어올 수 있다.

Posted by Nvdark
,

ARP 모듈에서 스푸핑 기능사용 시 Local IP와 gateway IP를 수동으로 적자니 귀찮아서 자동 입력으로 수정함.

이에 따라 추가 코드가 발생했는데.... 


자신의 IP 주소를 가져오는 법은 다음과 같다.

Memget 내에 이리저리 왔다갔다 하는 불필요한 소스코드가 좀 많아서 핵심만 적겠음.


일단 컴퓨터에서 디바이스 정보를 가져와야 한다. 이유는 각 디바이스마다 가지고 있는 IP정보들이 다르기때문이다.

자신이 사용중인 네트워크 디바이스를 선택하여 해당 장비의 IP주소 정보를 가져와야 한다. 

 GetAdaptersInfo() 함수로 현재 네트워크 디바이스의 정보를 가져올 수 있다. 

사용법은  dwStatus = GetAdaptersInfo(pAdapterInfo,&ulBuffer); 로 사용하면 된다. 

첫 번째 인자는 

PIP_ADAPTER_INFO pAdapterInfo = NULL;

로 선언하였으며, 구조체(리스트로 되어있음)에 대한 자세한 내용은 MSDN을 참조 바람.


PIP_ADAPTER_INFO 요녀석은 어뎁터가 가지고 있는 각종 정보를 저장하는 구조체라고 보면 될듯하다. 


다시 작성하면


 DWORD dwStatus;

PIP_ADAPTER_INFO pAdapterInfo = NULL;

ULONG ulBuffer = 0;

dwStatus = GetAdaptersInfo(pAdapterInfo,&ulBuffer);


가 되겠다.  하지만 종종 오버플로우가 발생하면서 정상적인 동작을 안하는 경우가 있다.

그럴경우에는 

pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulBuffer);

요렇게 메모리 할당을 한 후 다시 시도하면 정상적으로 잘 동작하는 것을 볼 수 있다.


그리고 해야할 것은 원하는 디바이스 정보를 찾는 일이다. 일단 컨트롤 리스트건 리스트 박스건 출력된 디바이스를 선택한 후 해당 번호를 a_devnum 에 저장했다 가정하면,


for(FindDeviceCount = 0 ; FindDeviceCount<a_devnum ; FindDeviceCount++)

{

pAdapterInfoP = pAdapterInfoP->Next;

이런식으로 간단하게 루프 돌면서 해당 디바이스를 찾으면 된다. 

혹은 PIP_ADAPTER_INFO구조체를 보면 디바이스 이름과 기타 정보를 담고 있기 때문에 이름, 아이피 등으로도 디바이스를 찾을 수 있다.

리스트에서 해당 디바이스를 찾았으면 다음은 간단하다.

pAdapterInfoP->IpAddressList.IpAddress.String

pAdapterInfoP->GatewayList.IpAddress.String

에 Local IP, Gateway IP가 있는 것을 발견할 수 있다!


그럼...이상...

 





Posted by Nvdark
,

뭐 얼마나 필요할질 모르겠지만 일단 끄적이기!!!

BHO에 접근해서 사용자가 원하는 스크립트나 값, HTML 등을 수정할 수가 있다 ㅎㅎ


여기선 execScript()를 사용하기 위한 접근만 언급함!  나머지는 차차..시간될때.. ㅎㅎ

뭐 일단 접근만 하면 나머지는 동작만 시키면되는거니....접근방법만 간단히 요약함...


내가 한 방법은, 원하는 웹 브라우져의 IHTMLDocument2를 얻고(일단 얻었다는 가정하에 시작) 

 

IHTMLDocument2 *NvBho_pDocument2; 

으로 선언되어 있다고 한다면

HRESULT hr;

IHTMLWindow2 *NvBho_pWindow2;

hr = NvBho_pDocument2->get_parentWindow(&NvBho_pWindow2);


로 접근 후 

NvBho_pWindow2->execScript() 를 이용하여 스크립트를 실행 할 수 있다. 


실제 스크립트를 삽입하여 실행한 화면++++++++++++++++++++++++++++++++++++++++++++++++++++=

예시)



스크립트는 간단하게 입력폼이나 옵션에 대한 ID와 값을 실시간으로 화면에 뿌려주는 동작을 함.




Posted by Nvdark
,

필요한 파일을 불러와 로드하거나 읽거나 할 때가 종종 있다.

뭐 MEMGET에선 BHO파일이나 드라이버 파일 찾을때 사용했다. 

사용방법은 간단함 ㅎㅎ


CHAR szFilter[] = "All Files(*.*)|*.*||";

CString csFilter;

CString BhoFilePath;

csFilter=NvBhoMain_CtoWC(szFilter); //프로젝트를 유니코드기반으로 하는바람에 항상 자료형 변환에 귀찮음을 느끼고잇음...

CFileDialog MP_NVBho_FILELOAD_Dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, csFilter);


if(MP_NVBho_FILELOAD_Dlg.DoModal() == IDOK)   //모달로 파일 검색창 활성화

{

SetDlgItemText(IDC_EDIT_FileName, MP_NVBho_FILELOAD_Dlg.GetPathName()); 

BhoFilePath = MP_NVBho_FILELOAD_Dlg.GetPathName(); //선택한 파일 경로 얻기

mControlBHODllPath.ReplaceSel(BhoFilePath);  //에디트컨트롤에 스트링 넣기

}


Posted by Nvdark
,

C++ (MFC)에서 IP address control 사용시 값 얻어오기!

=================================================================
헤더파일

CIPAddressCtrl E_IPv;

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

void CMetGetDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);

 //IDC_LIST와 리스트 선언한 변수를 연결
 DDX_Control(pDX, IDC_IPADDRESS, E_IPv);
}

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

//IP Address control 에서 값 얻어오기!!
 BYTE IP_a,IP_b,IP_c,IP_d;

 E_IPv.GetAddress(IP_a,IP_b,IP_c,IP_d);
 Temp.Format(_T("%d.%d.%d.%d"),IP_a,IP_b,IP_c,IP_d);

 if(IP_a==NULL || IP_b==NULL || IP_c==NULL || IP_d==NULL)
 {
  MessageBox(_T("Wrong IP Address! Plz Check your Input."),MB_OK);
 }

Posted by Nvdark
,


0번문제 ;; 처음에 조낸 삽질; 접속했는데 아무것도 안나오고;

문제가 먼지도 몰랐다;

요점은 결국 코딩;

처음에 4개 숫자라길래 포트인줄알고 조낸 더해서 보냈다;; 하지만 서버는 알수없는문자만 계속 토하고;;

접속해서 숫자를 주는건가 했는데 역시 이상한 문자만 조낸 토하고;

뭐 결국 했지만 처음에 접속하면 어떤 값을준다; 이거 다 더해서 다시 보내면 답이~ 짜짠~

코딩을 잘 못해서 소스는 지랄;;;


환경 : windows vista / VS2008 환경

하시려면 ws2_32.lib추가해주셔야 합니다.

추가법은 제 블로그 팁에 보시면 나와있어요.


Posted by Nvdark
,
#include <iostream.h>  // 구버전의 C++일경우 iostream.h 


void PrintBit(int n)
{
  
    for(int i=1<<16; i>0; i>>=1){   // 최상위비트부터 1비트씩 이동 
        if(n&i)
            cout << "1";            // 만일 비트가 1이면 1출력 
        else
            cout << "0";            // 만일 비트가 0이면 0출력 
    }
    cout << endl;
}

int main()
{
    int n;
    
    cout << "숫자를 입력하세요: ";
    cin >> n;
    PrintBit(n);
    return 0;
}

Posted by Nvdark
,