Admin | Write | GuestBook
[공지] 해당 블로그에 용건이 있으신 분께서는 http://blog.fore.kr/ 의 방명록(Guestbook)으로 부탁드립니다.
아, 소켓프로그래밍 모르겠는데 ! 소켓 프로그래밍의 시작
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2012. 10. 9. 01:10 ) | 신고

 

 

최근에 리버싱만해서 피폐해진 머리를 소켓 프로그래밍으로 옮겨서 연구 시작 !

 

프로그래밍 공부는 하고 싶은데, 책은 사기 싫고 . . . 그럴땐 역시 사랑스러운 MSDN 쨔응 !

 

 

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

 

자, 이렇게하면 된다. 외국어영역 5등급정도만 나와도 충분히 이해할 수 있는 글뿐(?)이다.

 

차근 차근 읽어보면

 

소켓 프로그래밍의 통신에는 크게 두가지로 분류되는 듯하고 내부 절차는 이러한듯 하다.

 

 Server

 Client

 

1. Initialize Winsock.

2. Create a socket.

3. Bind the socket.

4. Listen on the socket for a client.

5. Accept a connection from a client.

6. Receive and send data.

7. Disconnect.

 

 

1. Initialize Winsock.

2. Create a socket.

3. Connect to the server.

4. Send and receive data.

5. Disconnect.

 

너무 쉽죠 ?

 

자, 이제 서버와 클라이언트의 소스를 작성해보자.

 

 

위 홈페이지를 들어가면 Client 와 Server 를 구축하는 간단한 예제 소스가 나와있다.

 

Server 부터 구축해야 Client를 시험해볼 수 있기 때문에 Server -> Client 순으로 구축하는걸 추천한다.

 

 

 

Server.cpp 

 #include <Winsock2.h>
 #include <windows.h>
 #include <stdio.h>

 

 #pragma comment(lib,"Ws2_32.lib")

 

 int main(void){
    SOCKET           s;
    WSADATA         wsa;
    SOCKADDR_IN   addr;
    hostent             *host;
    char                *lpIPString;

 

    // WSA 초기화
    memset(&wsa,0,sizeof(wsa));
    if ( WSAStartup(MAKEWORD(2,2),&wsa) )
        return 0;

 

    // 소켓 생성
    s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

 

    // 현재 컴퓨터의 IP 정보를 얻어옴
    host = gethostbyname(NULL);
    lpIPString = inet_ntoa( **((in_addr **)host->h_addr_list) );

 

   // 소켓 주소 생성
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET; // type (IPv4)
    addr.sin_addr.s_addr = inet_addr(lpIPString); // ip
    addr.sin_port = htons(8181); // port

 

    // 소켓 주소 생성
    bind(s,(SOCKADDR *)&addr, sizeof(addr));

    {
        SOCKET   apt_s;
        int            nRecv;
        char         cBuffer[4096];
        char        *lptString = "Success SEND!! - Server\n";
        int            cnt = 0;

 

        // socket 및 bind 확인.

        listen(s,SOMAXCONN);
        memset(&apt_s,0,sizeof(apt_s));

        while ( cnt < 2 ){
            // connec t가 올 때까지 대기
            apt_s = accept(s,NULL,NULL);

            do{
                // send 가 올때까지 대기
                memset(cBuffer,0,4096);
                nRecv = recv(apt_s,cBuffer,4096,0);
                if ( nRecv == 0xFFFFFFFF )
                    break;
                if ( nRecv ){
                    send(apt_s,lptString,lstrlenA(lptString),0);
                    printf("%s",cBuffer);
                }
            }while(nRecv);
            closesocket(apt_s);
            cnt++;
        }
    }

    closesocket(s);

 

    WSACleanup();

 

    return 0;
 }

 

 

 

 Client.cpp 

 #include <Winsock2.h>
 #include <Ws2tcpip.h>
 #include <windows.h>
 #include <stdio.h>

 #pragma comment(lib,"Ws2_32.lib")

 

 int main(void){
    SOCKET        s;
    WSADATA     wsa;
    ADDRINFOA   addr;
    ADDRINFOA   *paddr;
    hostent         *host;
    char             *lpIPString;
    char             *lpPort = "8181";

 

    memset(&wsa,0,sizeof(wsa));
    if ( WSAStartup(MAKEWORD(2,2),&wsa) )
        return 0;

 

    memset(&addr,0,sizeof(addr));
    addr.ai_family = AF_INET;
    addr.ai_socktype = SOCK_STREAM;
    addr.ai_protocol = IPPROTO_TCP;

    host = gethostbyname(NULL);
    lpIPString = inet_ntoa( **((in_addr **)host->h_addr_list) );

    getaddrinfo(lpIPString,lpPort,&addr,&paddr);

 

    s = socket(paddr->ai_family,paddr->ai_socktype,paddr->ai_protocol);

 

    connect(s,paddr->ai_addr,paddr->ai_addrlen);

    {
        SOCKET  apt_s;
        int   nSend;
        int   nRecv;
        char  cBuffer[4096];
        char  *lptString = "Success RECV!! - Client\n";

 

        do{
            nSend = send(s,lptString,lstrlenA(lptString),0);
            if ( nSend == 0xFFFFFFFF )
                break;
            memset(cBuffer,0,4096);
            nRecv = recv(s,cBuffer,4096,0);
            printf("%s",cBuffer);
            Sleep(1000);
        }while(nRecv);
    }

 

    shutdown(s, SD_SEND);

 

    closesocket(s);

 

    WSACleanup();

 

    return 0;
}

 

이런식으로 구축되지 않는가 !?

 

자, 그럼 이쯤에서 남자라면 한번씩 해보는 도전 !

 

 

 

인터넷을 접속하면 어떻게 될까 ?

 

 

 

조짐이 있어보인다 !

 

서버에서 다중연결을 원할 경우엔 accept 부터 thread 를 이용하여 적당히 뿌려주면 될 것같다 > < !!

 

조금 더 연구해서 한번 서버구축도 노려볼만할거 같음 ' ')b

( 인터넷 계층도 알아볼 필요가 있어보임 )

 

 

 

Internet Explorer 도대체 임시 파일들은 어디에 ?
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2012. 9. 26. 06:17 ) | 신고

 

[댁들 이렇거 좋아하잖아요.]

 

새벽에 여자(2D)와 연애를 즐기고 있는데(미연시) 문득 떠올랐다.

 

私のTFは何処?

( 내 TF[Temporary File]는 어디에 ? )

※ 인류는 쇄퇴했습니다 1화 참고

 

그래서, 찾아보는 TF !

 

 

[클릭하시면 이미지가 확대됩니다.]

 

인터넷 옵션을 들어가서 . . .

 

 

[클릭하시면 이미지가 확대됩니다.]

 

설정을 들어가서 ~

 

 

[클릭하시면 이미지가 확대됩니다.]

 

파일 보기를 누르면 !

 

 

[클릭하시면 이미지가 확대됩니다.]

 

임시 파일 목록이 나오죠 ' ')b

 

 

 

- 完 -

 

 

 

 

 

덧글 20 개 l 엮인글 0 개

────────────────────────────────────────────────────────────────

 

 

 

 

 

 

 

끝일거 같았으면 이 포스팅 쓰지도 않았습니다 ㅋㅋㅋㅋ

 

문제의 부분인 여기입니다.

 

 

 

 

어떻게 익스플로어에선 저장된 임시 파일의 해당 주소를 알고 있을까요 ?

 

사람들이 제일 공포를 느낀다는 파일 검색. 제가 직접한번 해보겠습니다 !

 

 

 

 

자, 우선 우리의 사랑스러운 도스쨩을 킵니다.

 

그리고 검색 !

 

 

 

이상한 폴더(AntiPhishing)가 하나 잡혔군요

 

들어가봅시당.

 

 

 

 

2CEDBFBC-D.....

 

안써 ! 안쓴다고 !

 

이상한 파일 하나 잡혔네요 ' ' ;

 

파일명이 이상한 sid으로 이루어져 있는데, 지금의 저는 그딴걸 신경쓸 시간따윈 없습니다.

 

일단, 중요하지 않은 파일로 판단 !

 

다시 처음으로 돌아가서 !

 

( 이런걸 복사할때마다 윈도우란 운영체제가 참 잘만들어졌다고 생각합니다. ^^ )

 

 

이번엔 '숨김파일과 시스템파일' 을 검색해볼까요 ?

 

 

 

저기 뭔가 보이지 않나요 ?

 

그렇습니다. Content.IE5 참 냄새가 나는 폴더죠.

 

들어가봅시다 !

 

 

 

그렇죠. 이렇게 나오는군요 !

 

자 그럼 이쯤가서 윈도우 화면으로 보죠 !

 

 

 

짜잔 !

 

자, 그럼 아까 인터넷 파일 임시 목록 폴더에 맨위에 있던 Pastel.swf가 잘 살고 있나 확인해볼까요 ?

 

 

 

잘 살고 있네요.

 

하지만, 목적인 인터넷 주소까진 있지 않군요 ?

 

해답은 . . . .

 

 

 

index.dat

 

이놈이 가지고 있습니다.

(이름부터가 이놈이다 ! 라는 강렬한 포쓰를 뿜어대는군요)

 

이놈을 좀더 가까이 다가가보면 . . .

 

 

폴더도 그렇고 목록을 가지고 있네요 ' ' ;

 

 

 

찾아보니 인터넷주소, 임시파일명, 요청 정보 등의 정보가

 

이곳에 담겨있어 Temporary Internet Files 란 폴더를 들어갈 때마다

 

위 파일로 목록을 뿌려주는 것을 확인할 수 있습니다.

 

저 파일에 관한 자세한 정보는

 

http://www.forensicswiki.org/wiki/Internet_Explorer_History_File_Format

 

여기 실려있으니 관심 있으신 분들은 한번 훑어보는거도 나쁘지 않을거 같네요 ㅋㅋ

 

그럼 글은 여기까지 !

 

( 기분내키면 소스화시켜서 공개함. )

 

 

새벽에 자려는데 떠오른 printf
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2012. 9. 10. 05:31 ) | 신고

새벽에 자려는데 문득 떠올랐다.

 

여지껏, 가변 인자를 받아오는 함수(printf 등..) 은 매크로 비스무리하게 CRT로 제공하는

 

'va_arg ,va_end, va_start' 요딴걸 쓰는게 맞다.

 

그렇다면, 이것을 쓰지 않고 구현한다면 ?

 

문제를 하나 풀어보자.

 

 

  #include <stdio.h>

 

 int main(int argc,char *argv[]){

    printf("%s",argv[0]);

    return 0;

 }

 

 

이것은 모두가 알고 있는 main 함수의 조금 간략화된 원형이다.

 

위와 같이 실행하면, 실행파일의 절대 경로가 나올것이다.

 

그렇다면, argv를 주어주지 않고, 어떠한 함수를 사용하지 않고 절대경로를 출력할 수 있을까 ?

 

< 문 제 > 

 

  #include <stdio.h>

 

 int main(int argc){

    printf("%s",???);

    return 0;

 }

 

 

 

 

 

[Javascript] referrer 를 통한 웹사이트 접근 금지
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2011. 10. 15. 18:06 ) | 신고


<script>

 function lstrlenA(str1){
    var i;
    for(i=0;str1[i];i++);
    return i;
 }

 function lstrncmpiA(str1,str2,n){
    var i,a,b;

   
if ( str1[0] == undefined && str2[0] == undefined )
       return 0;
    else if ( str1[0] != undefined && str2[0] == undefined )
       return 1;
    else if ( str1[0] == undefined && str2[0] != undefined )
       return -1; 

   
for(i=0;i<n;i++){
       a = ((str1[i]>='a'&&str1[i]<='z')?(str1[i]-('a'-'A')):str1[i]);
       b = ((str2[i]>='a'&&str2[i]<='z')?(str2[i]-('a'-'A')):str2[i]);
       if ( a > b ){
          return 1;
       }
       if ( a < b ){
          return -1;
       }
    }

   
return 0;
 }

 function ReferrerCheck(Referurl,Gotourl){
   if ( !lstrncmpiA(document.referrer,Referurl,lstrlenA(Referurl)) ){
       location.replace(Gotourl);
    }
 }

 ReferrerCheck("http://foreblog.wo.tc/","about:blank");


 </script>


자바 작성하는거도 엄청 오랜만인듯 . . . 허허 . . .

무지하면 손발이 고생하지요 . . .

분명 찾아보면 strlen 함수 비슷한 함수가 나올거 같은데

찾는거보다 직접 작성하는게 빠를거 같아서 손수로 작성 ㄱㄱ



사실, 위 소스 작성한 이유계기가

모 사이트에서 계속 접근 (일방적으로???)접근금지 시키는줄 알고

대응해서 저도 대충 접근금지 시키려고 했는데

알고보니, 접속방법이 따로 있었다던 이야기가 . . .


모처럼이니까 !
Category : Programming/Programming Talk | URL : | Written by 포레 ( 2011. 8. 7. 23:10 ) | 신고


[클릭하시면 이미지가 확대됩니다.]

이거 질문 말은 쉽지, 피토나오는 작업인데 말이죠 ㅠㅠ

그래서 해봤습니다 [ . . .]



 #include <windows.h>
 #include <stdio.h>
 #include <io.h>

 #define FFH_FILE_MAPPING_INVAILD    1000
 #define FFH_GET_FILENAME_FAIL     1001
 #define FFH_FIND_VOLUME       1002

 typedef DWORD (WINAPI *pGetMappingFileNameW)(HANDLE,LPVOID,LPWSTR,DWORD);
 DWORD WINAPI GetMappedFileNameW(  HANDLE hProcess,
                    LPVOID lpv,
                    LPWSTR lpFilename,
                    DWORD nSize)
{
 HMODULE   hMod = LoadLibraryA("PSAPI.DLL");
 DWORD   dwReturn;

 dwReturn = ((pGetMappingFileNameW)GetProcAddress(hMod,"GetMappedFileNameW"))
                              (hProcess,lpv,lpFilename,nSize);

 FreeLibrary(hMod);

 return dwReturn;
}

 DWORD WINAPI GetFileNameFromHandleW(HANDLE hFile,LPWSTR lpFileName,SIZE_T nSize){
   HANDLE          hMapFile;
   LPVOID         hMem;
   LPWSTR         lpString;

   HANDLE         hVolume;
   WCHAR                wcVolName[MAX_PATH+1];
   WCHAR                wcDrivers[MAX_PATH+1];

   LPWSTR              lpFullFileName;

   DWORD               dwReturn;
   BOOL                  bResult;

   DWORD                i;

 hMapFile = CreateFileMappingW(hFile,NULL,PAGE_READONLY,0,1,NULL);
 if ( !hMapFile )
  return FFH_FILE_MAPPING_INVAILD;
 hMem = MapViewOfFileEx(hMapFile,FILE_MAP_READ,0,0,1,NULL);
 lpString = (LPWSTR)HeapAlloc( GetProcessHeap(),
                HEAP_ZERO_MEMORY,
                (nSize+1)*sizeof(WCHAR) );
 dwReturn = GetMappedFileNameW(GetCurrentProcess(),hMem,lpString,nSize);
 UnmapViewOfFile(hMem);
 CloseHandle(hMapFile);

 if ( !dwReturn ){
  HeapFree(GetProcessHeap(),0,lpString);
  return FFH_GET_FILENAME_FAIL;
 }

 bResult = TRUE;
 ZeroMemory(wcVolName,(MAX_PATH+1)*sizeof(WCHAR));
 hVolume = FindFirstVolumeW(wcVolName,MAX_PATH);
 if ( hVolume == INVALID_HANDLE_VALUE ){
  HeapFree(GetProcessHeap(),0,lpString);
  return FFH_FIND_VOLUME;
 }

 do{
  ZeroMemory(wcDrivers,(MAX_PATH+1)*sizeof(WCHAR));
  GetVolumePathNamesForVolumeNameW(wcVolName,wcDrivers,MAX_PATH,&dwReturn);
  ZeroMemory(wcVolName,(MAX_PATH+1)*sizeof(WCHAR));
  for(i=0;i<dwReturn;i++)
    if ( wcDrivers[i] == L'\\' )
     wcDrivers[i] = 0;
  if ( QueryDosDeviceW(wcDrivers,wcVolName,MAX_PATH) ){
   if ( !wcsncmp(lpString,wcVolName,wcslen(wcVolName)) ){
     lpFullFileName = (LPWSTR)HeapAlloc( GetProcessHeap(),
                       HEAP_ZERO_MEMORY,
                  (wcslen(wcDrivers)*wcslen(lpString)+1)*sizeof(WCHAR));
    wsprintfW(lpFullFileName,L"%s%s",wcDrivers,&lpString[wcslen(wcVolName)]);
    wcsncpy(lpFileName,lpFullFileName,nSize);
    HeapFree(GetProcessHeap(),0,lpFullFileName);
    bResult = FALSE;
    break;
   }
  }
  ZeroMemory(wcVolName,(MAX_PATH+1)*sizeof(WCHAR));
 }while(FindNextVolumeW(hVolume,wcVolName,MAX_PATH));
 FindVolumeClose(hVolume);

 HeapFree(GetProcessHeap(),0,lpString);

 return (DWORD)bResult;
}

DWORD WINAPI GetFileNameFromFileStructW( FILE *fp,
                      LPWSTR lpFileName,
                      SIZE_T nSize)
{
 // fp->_file == _fileno(fp)
 return GetFileNameFromHandleW((HANDLE)_get_osfhandle(fp->_file),lpFileName,nSize);
}


LPWSTR WINAPI GetFileNameSplitW(LPWSTR lpString){
 DWORD    dwString = wcslen(lpString);
 LPWSTR    _lpString = lpString;

 lpString = lpString + dwString;

 while(dwString){
  if ( *lpString == L'\\' )
   break;
  dwString--;
  lpString--;
 }
 if ( *lpString == L'\\' ){
  return (lpString+1);
 }

 return _lpString;
 }

 int main(void){
 FILE      *fp;
 WCHAR    Path[MAX_PATH+1];

 fp = fopen("1.jpg","rb");
 if ( !fp )
  return 0;
 GetFileNameFromFileStructW(fp,Path,MAX_PATH);
 fclose(fp);

 wprintf(L"%s\n%s\n",Path,GetFileNameSplitW(Path));
 system("pause");

 return 0;
 }



참 쉽죠 ?

※ 미리 글 올려놓고 추후에 주석달겠습니다.

Category
분류 전체보기 (605)
Notice (6)
Programming (79)
Release Program (19)
Release Patch (14)
Programming Talk (46)
DISKER (1)
FSCH (7)
Caption (0)
Rest Time ! (443)
Hobby (64)
Tour (5)
Blind Post (0)
Recent Post
Recent Comment
Link
Calender
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Total :
Today :
Yesterday :