2010. 5. 18. 15:56

넷북을 쓰다 보면, 무선 연결이 불안정할 때가 많아 수시로 끊어진다. 그 자체는 문제가 아닌데, 그러다 보면 메신저들이 신나게 재접을 해대는 상황이 벌어지기 마련이다. 이 때 문제가 되는 것이, 네이트온의 경우 쓸데없는 광고가 뜬다는 것이다.

이 쓸데 없는 광고는 얼마나 쓸 데가 없냐면, 광고가 떠도 앞에 안 나오고 뒤에 숨어 있다가 네이트온 쪽지가 와서 보려고 쪽지창을 클릭할 때 광속의 속도로 전면으로 튀어나와서는 대신 클릭당한다. 그러면 Internet Explorer가-심지어 기본 브라우저를 딴 것으로 바꾸어두어도!-뜨면서 그게 완전히 뜨기까지 네이트온은 먹통이 되고, 그게 뜬 뒤에도 한동안 버벅거리는 것은 상당한 짜증을 동반시킨다.

그래서 나는 광고를 없애버리기로 다짐했다. 하는 김에 네이트온 접속 후의 스킨을 수정해서 광고를 떼보았다. 요놈도 상당히 자리를 차지해 넷북으로썬 상당히 귀찮다.

이것도 저것도 모르겠다, 하는 사람은 첨부된 파일을 받아다 적당히 풀면 되겠다. xml파일은 C:\Program Files\NATEON\Skins\DefSkin 에, exe파일은 C:\Program Files\NATEON\BIN에 넣으면 된다.

수정한 부분은 xml 파일에서는 아랫쪽에 주석처리된 부분 밑의 tr 태그를 죄다 지웠다. 그러고 나니까 별로 안예뻐서 miniview 들어가 있는 행과 그 아래 행은 살려뒀더니 원래부터 광고가 없었던 것 마냥 이뻐졌다ㅋ

exe파일에서는 '아마도' 광고 관련 처리하는 루틴을 전부 NOP으로 때워넣었는데, 위치가 0271d08부터 약 32byte 정도 된다. add esp, 24h 까지 덮으면 된다.

첨언: 찾아보니까 이미 한 사람이 많다...-_-;

'크래킹, 크랙미' 카테고리의 다른 글

AD free NateOn  (0) 2010.05.18
COM Object 생성 추적하기, COMTracer  (0) 2009.10.05
DLL injection with CreateRemoteThread()  (0) 2009.08.01
CBsearch Crack  (15) 2009.06.20
abexcrackme2  (0) 2007.02.17
2009. 12. 4. 19:21
네이트온은 쓰다 보면, 다른 데서 로그인하거나 해서 튕긴 경우엔 다시 로그인하기가 귀찮다. 저장된 아이디와 비밀번호를 다 날려버리기 때문이다.

피씨방 등에서 접속하는 일이 많은 일반적인 사람들 기준에서는 저렇게 날려주는게 보안상 이로울 것이다. 아무 생각도 없이 공용 피씨방에서도 자동로그인 옵션을 넣어서 로그인했다가 피싱에 이용당한다던가 하는 일이 많은, 보안 개념이라곤 개미똥꾸멍만큼도 없는 한국인에게 있어서는 정말 유용하다. 유용하긴 하다. 근데 그런 기능은 선택할 수 있게 해 주면 좋지 않을까. 나처럼 두 컴퓨터를 쓰는 경우에는 번갈아가며 로그인해야하는데 저장된 비번이 날아가대니 얼마나 불편한지 모른다. MSN을 좀 닮아주면 안될까.

푸념은 여기까지 하고, 목마른 자가 우물을 판다고 직접 프로그램을 짜 보았다. Win32 API를 써야 할테니 C나 C++을 쓰는 편이 낫겠지만, 연습도 해보고 그냥 끄적거리기엔 루비가 훨 편하니까 루비를 사용해 보았다. 사용한 것은 루비 1.8.7 patchlevel 0 i386-mswin32 버전과 win32api 젬을 사용했다.

require 'Win32API'

class NateOnAutoLogin
  @@instance = nil
  @@find_window_ex = Win32API.new 'user32', 'FindWindowExA', 'LLPP', 'L'
  @@send_message = Win32API.new 'user32', 'SendMessage', 'LLLP', 'L'
  @@get_window_text = Win32API.new 'user32', 'GetWindowTextA', 'LPL', 'L'

  WM_KEYDOWN = 256
  WM_KEYUP = 257
  WM_CHAR = 258
  WM_COMMAND = 273
  WM_GETTEXT = 13

  VK_END = 35
  VK_UP = 38

  IDC_LOGIN = 0x3f2
  IDC_OTHER_LOGIN = 0x3f6
  IDC_DO_LOGIN = 0x3f5

  class << self
    alias orig_new new

    def new
      if @@instance.nil?
        @@instance = NateOnAutoLogin.orig_new
      else
        @@instance
      end
    end

    protected :orig_new
  end

  def login(id, pass)
    local_id, host = id.split '@'

    hwnd_nateon = @@find_window_ex.call 0, 0, nil, 'NateOn'
    sub = @@find_window_ex.call hwnd_nateon, 0, nil, nil
    login_dlg = @@find_window_ex.call sub, 0, '#32770', nil

    @@send_message.call login_dlg, WM_COMMAND, IDC_OTHER_LOGIN, nil
    @@send_message.call login_dlg, WM_COMMAND, IDC_DO_LOGIN, nil

    local_id_wnd = @@find_window_ex.call login_dlg, 0, 'Edit', nil
    local_id.each_byte {|chr| @@send_message.call local_id_wnd, WM_CHAR, chr, 0}

    host_wnd_a = @@find_window_ex.call login_dlg, 0, 'ComboBox', nil
    host_wnd_b = @@find_window_ex.call login_dlg, host_wnd_a, 'ComboBox', nil

    if @@find_window_ex.call(host_wnd_a, 0, nil, nil) == 0
      host_provided_wnd = host_wnd_a
      host_manual_wnd = host_wnd_b
    else
      host_provided_wnd = host_wnd_b
      host_manual_wnd = host_wnd_a
    end

    @@send_message.call host_provided_wnd, WM_KEYDOWN, VK_END, nil
    @@send_message.call host_provided_wnd, WM_KEYUP, VK_END, nil

    @@send_message.call host_provided_wnd, WM_KEYDOWN, VK_UP, nil
    @@send_message.call host_provided_wnd, WM_KEYUP, VK_UP, nil

    host.each_byte {|chr| @@send_message.call host_manual_wnd, WM_CHAR, chr, nil }

    password_wnd = @@find_window_ex.call login_dlg, local_id_wnd, 'Edit', nil
    pass.each_byte {|chr| @@send_message.call password_wnd, WM_CHAR, chr, nil }

    @@send_message.call login_dlg, WM_COMMAND, IDC_LOGIN, nil
  end
end

윈도 구조를 Spy++로 분석한 다음, SendMessage를 써서 키를 눌러주었다. 복잡하지 않다:$

NateOnAutoLogin을 싱글톤으로 구현했는데. new 메소드로 생성되는 객체 자체가 하나만 존재하게끔 손보아 보았다.

쓰기 위해서는, NateOnAutoLogin.new.login 'gwangyi@sfc.or.kr', ';didw;tsmv' 와 같은 식으로 해 주면 로그인된다.