블로그 이미지
훅크선장

카테고리

분류 전체보기 (363)
사진이야기 (23)
펭귄컴퓨팅 (122)
컴퓨터보안 (84)
절름발이 프로그래머 (59)
하드웨어개조 (23)
멀알려줄까 (35)
잡다한것들 (15)
홈베이킹&홈쿠킹 (2)
Total
Today
Yesterday

달력

« » 2025.12
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 29 30 31

공지사항

태그목록

최근에 올라온 글

참고한 내용은 http://www.ciuly.com/delphi/indy/  입니다.
HTTP/HTTPS 프로토콜을 델파이로 Indy 로 구현한 예제들입니다. (주로 웹 메일 로그인 부분에 집중된 내용)

가장 중요한 점 HTTP/HTTPS의 Get 요청에 대한 응답이 Indy 컴포넌트에서 대부분 exception의 ErrorMessage 로 저장된다는 점입니다.
웹 브라우저에서 보이는 것이 항상 Get 함수의 리턴 값 문자열이 아닌 예외 상황으로 많이 처리되는 것 때문에 상당히 어려움을 겪었습니다.

위 구문을 추가하시고, 다음과 같이 코드를 작성하면 됩니다.

아래 코드에서 memo 컴포넌트에 html, response_cdoe, err_code, err_msg 를 출력해보면, 감이 오시리라 생각합니다.
html만 중요한 게 아니라, err_ 쪽도 상당히 중요합니다. 처리가 항상 필요합니다.

unit Unit1;

interface

uses
  Classes, SysUtils,
  IdHTTP, IdSSL, IdSSLOpenSSL;

implementation
procedure btn1click(IP:string);
var
  idhttps: TIdHTTP;
  sslIOHandler : TIdSSLIOHandlerSocketOpenSSL;
  URL, html, response_code, err_code, err_msg : string;
  MemoryStream: TMemoryStream;
  rbstr: RawByteString;
begin
  try
    idhttps := TIdHTTP.Create();
    sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      sslIOHandler.SSLOptions.Method := sslvSSLv23;
      sslIOHandler.SSLOptions.Mode := sslmClient;

      idhttps.IOHandler := sslIOHandler;
      idhttps.HandleRedirects:=False;
      idhttps.ConnectTimeout := 5000;
      idhttps.ReadTimeout := 5000;

      URL := 'https://' + IP + '/index.html';

      try
        MemoryStream := TMemoryStream.Create;
        try
          try
            // HTTP Get Method
            idhttps.Get(url, MemoryStream);

            rbstr := PAnsiChar(MemoryStream.Memory);
            if (Pos('utf-8', idhttps.Response.ContentType)=0) and (AnsiPos('charset=utf-8', string(rbstr))=0) then
              SetCodePage(rbstr, 949, false)
            else
              SetCodePage(rbstr, 65001, false);
            response_code := IntToStr(idhttps.Response.ResponseCode); // HTTP 응답 코드
            html := string(rbstr); // 정상적인 페이지 응답은 여기에 저장

          except on e: EIdHTTPProtocolException do
            begin
              err_code := IntToStr(e.ErrorCode); // 예외 상황의 에러 코드 (idhttps.Response.ResponseCode 와 거의 동일)
              err_msg := e.ErrorMessage;  // 예외 상황의 메시지, 웹 페이지 상에 보여주는 HTML 페이지 내용
            end;
          end;
      finally
        MemoryStream.Free;
      end;
      except on E:Exception do

      end;

    finally
      idhttps.Disconnect;

      sslIOHandler.Free;
      idhttps.Free;
    end;

  except on E:Exception do

  end;

end;

end.
Posted by 훅크선장
, |
OpenWRT에는 Klog와 syslogd가 모두 동작합니다만,
일반적인 리눅스 시스템과 같이 별도의 로그파일을 생성하지 않습니다. (디스크 공간이 없기 때문이죠~)
그래서, /var/log/messages 파일 같은 것은 없습니다.

대신, 메모리 공간에 약간의 버퍼를 만들어두고, 거기에 로그를 씁니다.
그 로그를 읽는 방법은 간단합니다. 그냥 logread 명령어를 쓰면 됩니다.

# logread
하면,

/var/log/messages 파일의 내용과 같은, OpenWRT의 시스템 로그가 보입니다.
Posted by 훅크선장
, |
특정 일련 숫자들로부터 임의 순열(즉, 무작위로 뒤섞인 일련의 숫자들)을 만드는 방법입니다.

다음의 예제는 1부터 100까지의 숫자가 일련되어 저장된 배열에서, 순서가 무작위로 뒤바뀐 배열을 만들어냅니다.
SizeofArr 을 바꿔서, 다양한 일련의 숫자를 뒤섞을 수 있습니다.

procedure TForm1.btn2Click(Sender: TObject);
var
  RandomPermutationArray : array of Integer;
  I, J, SizeofArr, RandomPosition, Temp : Integer;
  PrintStr : String;
begin
  SizeofArr := 100;
  SetLength(RandomPermutationArray, SizeofArr + 1); // We need one more space, because number starts 1.

  // array init
  for I := 1 to SizeofArr do
    RandomPermutationArray[I] := I;

  // randoomize Permutation
  for J := 1 to  SizeofArr - 1 do
  begin
    RandomPosition := J + Random(SizeofArr - J) + 1;
    Temp := RandomPermutationArray[J];
    RandomPermutationArray[J] := RandomPermutationArray[RandomPosition];
    RandomPermutationArray[RandomPosition] := Temp
  end;

  PrintStr := '';
  for I := 1 to SizeofArr do
  begin
    PrintStr := PrintStr + ' ' + IntToStr(RandomPermutationArray[I]);
  end;
  edt3.Text := PrintStr;
end;

Posted by 훅크선장
, |
설치를 하지 않고, 간단하게 바꾸고 싶다면, etherchange.exe
http://ntsecurity.nu/toolbox/etherchange/

설치를 하더라도, 자세한 정보를 보고 싶고 GUI 환경을 원하면, MAC Address Changer
http://www.technitium.com/tmac/index.html

개인적으로는 etherchange.exe가 훨씬 나은 듯하다.

무선랜카드의 MAC 주소 변경에도 아주 잘 동작한다.
Posted by 훅크선장
, |
BackTrack 4 R2 버전과 잘 호환되는 802.11n USB 무선랜카드를 찾아서, 인터넷을 뒤적거리다가
유니콘 정보통신의 TW-300N 무선랜카드를 찾아서, 테스트하고 개조에 성공했는데,
훨씬 유용한 USB 무선랜카드를 찾았습니다. 그에 대한 분석을 좀 해보려고 합니다.
(2주동안 감기에 시달려서, 휴식을 위해 주말에 낮잠을 좀 잤더니, 밤에 잠이 안와서, 가족들이 잠자는 새벽에 날밤을 까면서 글 쓰고 있습니다.)

먼저 TW-300N도 같은 계열이지만, 엄밀히 맘하면, 칩셋은 rt2770f 입니다.
N303UA는 정확하게 RT2870F 칩셋을 사용합니다. 어차피 두 칩셋은 리눅스에서 rt2800 디바이스 드라이버로 인식됩니다.

장단점을 말하자면, TW-300N은 작습니다만, 외장안테나를 붙일 수 없고 칩셋이 구형입니다. 하지만, 개조를 통해서 외장안테나를 달 수 있고, 내장 안테나가 두 개인데, 하나는 TX/RX용 이고, 나머지는 RX 용입니다. 이것은 개조를 통하였을 때, TX/RX용 외장안테나를 달 수 있어서 편리합니다.
반면에, N303UA는 큽니다.(공간활용도가 참 없는 구조입니다. - 아래 사진을 참고해보세요~.) 그러나, 외장안테나형태로 만들어져 있고, 칩셋이 신형입니다. 그런데, 큰 문제가 이 외장 안테나가 두 개를 달 수 있도록 만들어져 있는데, 안테나가 각각 TX와 RX 용입니다.(이게 이해가 안갑니다. 왜 이렇게 만들었을까요??)

살펴보도록 하겠습니다.

외장입니다. 직육면체의 까만 모습에 외장 안테나 2개를 달 수 있는 모습입니다. 참 멋없게 만들었다고 생각합니다.


뒤면에 있는 나사 2개를 풀고, 분해방지용? 스티커 3개를 떼면, 분해가 됩니다. 기판 위면을 보면, 바로 칩셋이 보입니다.
선명하게 보이는 RT2870F 라는 문자가 보입니다. 안테나는 각각 CON1과 CON2라고 이름지워져 있습니다.


기판 아래면입니다. 별로 정보가 될 만한 것은 없습니다.


그리고, 꼭 기판도 작은데 굳이 이렇게 크게 만들 필요가 있었는지 의문이 듭니다. 공간 활용도 측면이라든지, 기판의 배치를 보았을 때, 그닥 고민을 한 것 같다는 느낌이 안듭니다.

개인적으로 테스트를 해본 결과, 기판 위면에 SMA 커넥터가 외장안테나 용으로 두 개가 달려있습니다만,
CON1은 TX 전용이고, CON2는 RX 전용입니다. 설명하면, 두 외장 안테나는 각각 송신 전용과 수신 전용이라는 것입니다.
일반적인 무선랜카드에서는 장점일지는 모르겠지만, 안테나가 송수신용으로 각각이라는 것이 그닥 좋아보이지 않습니다.왜냐하면, 무선랜 해킹의 고급 기술을 적용하려면, 약간 단점일 수도 있습니다. (신호를 증폭하려면, 양쪽 다 증폭해줘야 되는데, 그럼 증폭기가 두 대나 필요하다는 것인데.....)

음~, 스니핑을 위해서는 어차피 RX쪽 신호만 증폭하면 되니깐, 장점이라고 볼 수도 있겠습니다.
외장 쪽에서 보았을 때, RX와 TX를 구분해보았습니다.



Posted by 훅크선장
, |
예전에 소개한 적이 있는 BackTrack 4 R2 버전에서 지원되는 Ralink 사의  RT2870  칩셋을 사용하는 유니콘 정보통신의 TW-300N 802.11n USB 무선랜카드입니다. 외장 안테나가 없어서, 한번 개조해보기로 했습니다.
현재는 이 무선랜카드가 단종되어서 구할 수가 없기 때문에, 이 글이 참 쓸모 없을 수도 있습니다.
개조에 대한 아이디어는 여기서 얻었습니다.
http://tcom.tistory.com/41

엄밀하게 말하면, 칩셋은 RT2870의 이전 모델로 보이는 RT2770F 입니다.

먼저 외장입니다. 일반적인 USB 동글 비슷하게 생겼습니다.


외장 플라스틱 사이를 칼 등으로 비틀면, 바로 분해되고, 다음과 같은 기판이 등장합니다.


기판 위면을 보면, 선명한 글씨로 RT2770F 라는 글씨가 보입니다.
개조를 위해서는, 그림상에서 가장 구석(USB 커넥터에서 가장 먼쪽으로)에 파란색으로 선명한 사각형의 칩이 보입니다. 이것이 바로 내장 안테나입니다.


기판 아래면을 보면, 다른 것보다, 역시 내장 안테나가 하나 보입니다.
그림상에서 가장 구석(USB 커넥터에서 가장 먼쪽으로)에 파란색으로 선명한 사각형의 칩이 내장 안테나입니다.


내장 안테나가 두 개입니다만, 실험에 의한 경험과 문서 정보를 종합해서 보았을 때,
기판 위면의 내장 안테나는 TX/RX용으로 사용되며, 기판 아래면의 내장 안테나는 RX 용으로만 쓰이고, 기판 위면의 내장 안테나의 보조용입니다.

참고한 문서는 http://www.ralinktech.com/download.php?t=U0wyRnpjMlYwY3k4eU1EQTVMekEzTHpJNEwzQnliMlIxWTNRMk56STVOVEF3TnpBMkxuQmtaajA5UFZKVU1qY3dNRjh3TlY5dVpYZGZiR0Z6ZEdWemRDNWZPVEl3Qw%3D%3D 입니다.
문서 내용에 보면, TX0/RX0가 한 개의 안테나로 RX1이 또다른 안테나로 구성된 것을 볼 수 있습니다.

개조를 위해서 필요한 부품은 다음과 같습니다.
SMA(F)S/T_PCB_T
SMA-C-316  (이건, SMA 안에 있는 정심만 필요합니다.)


부품은 다음 링크의 부품사이트에서 구할 수 있으며, 오프라인으로도 구하기 어렵지 않을 것입니다.
http://www.devicemart.co.kr/mart7/search.php?sort=sim&cate_code=013&page=3&query=sma

필요한 공구는 다음과 같습니다.
전기인두, 무연납 , 롱노우즈 플라이어(소형)뿐입니다.
핀셋과 테스터기는 있으면 좋습니다. 안전한 납땜과 개조가 잘 되었는지를 확인하는 용도로~.

사진과 함께 글로 설명합니다.



1) 기판 위면에 있는 내장 안테나를 제거합니다. 파란색 사각형 칩 형태의 내장 안테나를 뜯어내야 합니다.
    양 측면을 인두로 가열하면서, 핀셋으로 집어내면, 그냥 바로 떨어집니다. 어렵지 않습니다.


2) SMA 커넥터를 만듭니다. 먼저 SMA(F)S/T_PCB_T를 분해합니다. 내부 심까지 모두다 분해해야 합니다.
왜냐하면, 일반적인 안테나들은 SMA 역심을 가진 Male 형태입니다. 그러면 연결되는 커넥터로 SMA 정심을 가진 Female 형태가 필요한데, 판매되는 부품은 SMA 역심을 가진 Female 형태이므로, 역심을 정심으로 교체하는 작업을 해야됩니다.
롱노우즈 플라이어(소형)을 가지고, 커넥터의 뒤 부분의 하얀 플라스틱 부분을 밀어내서, 내부 심부분을 빼냅니다.
그리고, 잘 조심스럽게, 하얀 플라스틱에서  역심을 뽑아냅니다.


2-1) 역심자리에 SMA-C-316의 정심을 꽂은 다음, 다시 조립합니다. 역시 롱노우즈 플라이어로 잘 밀어넣으면 됩니다.


2-2) 먼저 정심에 연장선을 납땜으로 연결했습니다. 정심에 연장선은 조립한 다음에 해도 상관없습니다.



3) 정심 교체가 된 SMA(F)S/T_PCB_T에서 정심부분에 구리선 연장을 납땜으로 해줍니다. 앞에서 조립하기 전에 미리 했습니다. (구리선은 어떤 종류든 전선의 피복을 벗긴 구리선이면 됩니다. 정심에 들어가려면, 상당히 가는 선을 사용해야 되겠지요~.)


4) 내장 안테나를 떼어낸 부분에, 정심 교체가 된 SMA(F)S/T_PCB_T를 장착합니다. 장착은 정심 연장된 부분이 안테나 선에 바로 닿을 수 있게 하면 됩니다. 안테나 선 부분은 기판쪽으로 연결된 선부분이 있는 곳 입니다.( 바깥쪽과 가까운 납땜지역은 아무것도 연결되어 있지 않습니다.) 이렇게 하면, 다리 한 쪽이 기판의 접지 구리선부분(노랗게 노출된 부분)과 맞닿게 됩니다. 아주 기판이 잘 구성되어 있군요.



5) 정심에 연장된 구리선 부분을 안테나 선 부분과 납땜하고, 기판의 접지 구리선과 커넥터 외부의 다리 한쪽도 납땜해줍니다. 글루건으로 커넥터가 움직이지 않게 고정해줍니다.(에폭시 접착제가 더 좋다고 합니다만, 가진 게 글루건뿐이라서...)



6) 외장 플라스틱을 외장 안테나에 맞게 대충 잘 잘라주면 됩니다.



7) 완성된 모습은 다음과 같습니다.
    유무선 공유기에 번들로 제공되는 안테나를 붙인 모습입니다. 더 좋은 안테나 또는 증폭기도 붙일 수 있습니다.




Posted by 훅크선장
, |
MaxMind 에서 http://www.maxmind.com/app/geolitecountry 통하여 제공하고 있는

IP를 소재 국가 및 도시로 바꾸어주는 Open Source API가 있습니다.

해당 API에 파스칼(Pascal) 이 지원되는데, 이 파일에 오래전에 만들어진 것이라서,

현재 RAD Studio 계열에서는 컴파일 에러가 발생합니다.

데이터베이스 파일은 그대로 사용합니다만,
제공되는 GeoIP.pas 소스 파일은 일부 수정이 필요합니다.

수정이 필요한 부분은 다음과 같이 두 부분입니다.
http://forum.maxmind.com/viewtopic.php?t=1204 에 있는 내용을 참고하였습니다.

1번 :

function TGeoIP._GetCity(IPNum: Cardinal; var GeoIPCity: TGeoIPCity): TGeoIPResult;
var
  ...
// p: PChar;
   p: PAnsiChar;
  ...


2번 :

function TGeoIP.AddrToNum(const IPAddr: string): Cardinal;
var
//netlong: LongInt;             // signed! - wrong type for comparison with INADDR_NONE
  netlong: Cardinal;            // unsigned   (or Longword)
begin
//netlong := inet_addr(PChar(IPAddr));
  netlong := inet_addr(PAnsiChar(AnsiString(IPAddr)));
  if netlong <> INADDR_NONE then



Posted by 훅크선장
, |
운영 체제에서는 time_t를 32 비트나 64 비트 부호있는 정수형으로 정의하며, UTC 1970-1-1 0:00:00 이후 경과한 를 담고 있다. (이것이 바로 Unix Time 이라고 불린다.)

이것을 작성하게 된 계기는 PE 파일 헤러의 TimeDateStamp 값을 현재 시간으로 변환하는 과정에서 알게된 사실을 기억해두기 위해서이다. - 처음에는 변환 함수가 없는 것으로 생각했다가, 나중에 알고보니 UnixToDateTime() 함수가 있었다. 문제는 이 날짜,시간 관련 함수들은 DateUtils 유닛을 사용해야 한다.

수동으로 구현한 UnixToDateTime() 함수는 다음과 같다.

var
  dt: TDateTime;
  tzinfo: TTimeZoneInformation; // UTC 시간을 GMT 시간으로 변환하기 위해서,
  GMT_Plus_Offset: Double;

begin
  TSEdit.Text:=IntToHex(ImageNTHeaders.FileHeader.TimeDateStamp,8); // PE 헤더에 있는 TimeDateStamp 값을 가져온다.
  tFlag:=ImageNTHeaders.FileHeader.TimeDateStamp;

  case GetTimeZoneInformation(tzinfo) of // 현재 컴퓨터에서 타임존 정보를 읽어온다.
    TIME_ZONE_ID_STANDARD: GMT_Plus_Offset := -(tzinfo.StandardBias + tzinfo.Bias) / (24*60); // 표준 타임존 일 경우,
    TIME_ZONE_ID_DAYLIGHT: GMT_Plus_Offset := -(tzinfo.DaylightBias + tzinfo.Bias) / (24*60); // 일광절약시간을 적용하는 경우,
  else // 매우 일반적인 경우,
    GMT_Plus_Offset := -(tzinfo.Bias) / (24*60);  // 한국의 경우에는 Bias 값이 -540 으로 9시간 * 60 분으로 지정되어 있다. 이것을 TTimeDate 객체로 변환하려면, 날짜 수로 변환해야 되서, 60분과 24시간으로 나누어준다.
  end;

  dt := EncodeDate(1970, 1, 1) + (tFlag / SecsPerDay) + GMT_Plus_Offset; // 변환 완료

  edtTimeDateStampStr.Text := DateTimeToStr(dt); // GMT+9 시간을 출력한다.

end;

위에서 tzinfo를 얻는 과정을 제외하면, TimeDateStmap 값을 UTC 시간으로 변환할 수 있다. (너무 쉽다.)

Posted by 훅크선장
, |
array of char의 경우는 바로 AnsiString이나 String으로 변환되지만,
array of BYTE의 경우는 char 과는 틀리게 변환하는 방법이 따로 있었습니다.

상당히 정보 검색에 어려움이 있었지만, 테스트한 결과 다음과 같이 합니다.
const
 Name_Length = 16;
var
 Name : array[0..15] of BYTE;
 strAnsiName : AnsiString;
 strName : String;
begin
  SetString(strAnsiName, PAnsiChar(@Name[0]), Name_Length);
  strName := string(strAnsiName);
end;


Posted by 훅크선장
, |
openvpn을 설치한다.

opkg update
opkg install kmod-fs-btrfs kmod-fs-ext2 kmod-fs-ext3 kmod-fs-ext4 kmod-fs-isofs kmod-fs-reiserfs kmod-fs-vfat  kmod-fs-xfs
opkg install kmod-nls-cp1250 kmod-nls-cp1251 kmod-nls-cp437 kmod-nls-cp775 kmod-nls-cp850 kmod-nls-cp852 kmod-nls-cp866 kmod-nls-iso8859-1 kmod-nls-iso8859-13 kmod-nls-iso8859-15 kmod-nls-iso8859-2 kmod-nls-koi8r kmod-nls-utf8
opkg install kmod-usb2 kmod-usb-storage kmod-usb-storage-extras block-hotplug block-mount hotplug2
opkg install --force-overwrite avahi-daemon bwm fdisk fping iftop ip iptables-utils kmod-ipv6 libnl lft lsof  luci-app-ntpc luci-app-openvpn luci-app-upnp luci-ssl miniupnpd mtr net-tools-hostname ngrep nmap ntpclient  openssh-client openvpn rsync screen snmpd sshfs tcpdump
이상 위에 있는 것들을 설치하는 것이, 다양한 네트워크 설정에 필요하다.

/etc/config/openvpn 파일을 다음과 같이 설정한다.
config 'openvpn' 'MyOpenVPNServer'
    option 'server' '10.100.200.0 255.255.255.0'
    option 'dev' 'tun0'
    option 'proto' 'tcp'
    option 'port' '1194'
    option 'keepalive' '10 120'
    option 'ca' '/etc/openvpn/ca.crt'
    option 'cert' '/etc/openvpn/cert.pem'
    option 'key' '/etc/openvpn/key.pem'
    option 'dh' '/etc/openvpn/dh.pem'
    option 'status' '/tmp/openvpn-status.log'
    option 'verb' '3'
    option 'enable' '1'

/etc/openvpn/ 폴더에 인증서 파일 4개를 복사해둔다.
ca.crt
cert.pem
key.pem
dh.pem

방화벽에서 접속을 위한 설정을 입력한다.
/etc/firewall.user 파일에 다음의 내용을 추가한다.

# OpenVPN Remote Access & Routing Rule
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 1194 -j ACCEPT
iptables -I FORWARD 1 --source 10.100.200.0/24 -j ACCEPT
iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.100.200.0/24 -o eth0 -j MASQUERADE

방화벽은 공유기를 reboot 하거나, 위의 설정 명령어를 한번 실행시켜도 된다.

서비스를 시작한다.

/etc/init.d/openvpn enable
/etc/init.d/openvpn start

하면 완료된다.

Posted by 훅크선장
, |