2013/06/25

Dadong’s JSXX 0.44 VIP DeObfuscation Code


공다팩이나 다동이나 Gondad에 대한 용어는 다들 잘 아실꺼라 생각하고 생략하겠습니다.

올해 코드게이트에서도 툴 시연이 있었고 발표자료도 공개되어 있습니다.

그리고 dadong으로 난독화되어 있는 코드에 대한 분석글들은 인터넷에 있으니 찾아보시고 참고하시면 되겠습니다.

그나마 지금까지 보아 왔던 분석글들은 중간중간 특정 내용에 대한 설명이 빠져 있어서 이해하는데 좀 애매하게 되어 있었는데요

Kwang Guevara님 블로그 보니 설명이 잘되어 있었습니다.

매번 난독화된 코드와 난독화 해제하는 함수, 키값을 찾아서 수정해주고 브라우저에 여러서 확인하는게 귀찮아서 파이썬으로 작성해보았습니다.



코드가 허접해도 참아주시기 바랍니다. ;-)


#-*- coding: cp949 -*-

import sys
import re
from struct import *

key = ""
res_filename = ""
obfCode = ""
deobFunc = ""

def splitObfCode() :
 global obfCode
 global deobFunc
 global key
 
 obfList = []
 print "[+] Extracing obfuscated code..."
 with open(sys.argv[1], 'r') as ef:
  for x in ef.readlines():
   if re.search("eval.+?unescape.+?[=](\'\")?[0-9A-Fa-f]", x):
    for s in range(len(x.split("\""))):
     obfList.append(x.split("\"")[s])
 print "[+] Extracting deobfuscate function and find divide key"
 for x in range(len(obfList)):
  if len(obfList[x]) >= 5000:
   obfCode = obfList[x]
  elif len(obfList[x]) >= 1000 and len(obfList[x]) <= 2000:
   deobFunc = obfList[x].replace('\\/', '/').replace('\\\\', '\\')
   buf = deobFunc.split(";")
   for s in range(len(buf)):
    if "%=" in buf[s]:
     key = int(buf[s].split("=")[1])
  else:
   pass

def letsgo(code, func, divkey) :
 a = ""
 b = 0
 c = 0
 d = ""
 
 print "[+] Deobfuscate..."
 for i in range(0,2):
  for t in range(len(func)):
   c = ((c&127)<<25) | ((c&4294967168)>>7) + ord(func[t])
   c = unpack("l", pack("L", c))[0]
  a+="1"

 if c < 0:
  c = c & 0xffffffff
 
 qq = 1
 for t in range(0, len(code), 2):
  if t >= 8: # (1<<3)
   a = t % 8
  else:
   a = t
  b = int(hex(c)[a+2:a+4], 16)+qq
  qq+=1
  
  if re.match('^(\d{4})', str(b+744)):
   b = b % divkey
  d += chr((int((obfCode[t] + obfCode[t+1]), 16))^b)
 
 rf = open("%s" % res_filename, "w")
 rf.write(d)
 rf.close()

def main() :
 global res_filename
 if len(sys.argv) >= 2:
  splitObfCode()
  res_filename = sys.argv[1].split('.')[0]+"_decode.txt"
  letsgo(obfCode, deobFunc, key)
 else:
  print "Usage: %s dadong_obfuscated_filename" % sys.argv[0]

if __name__ == "__main__" :
 main()




댓글 2개:

  1. 정말 좋은 정보 감사합니다. ^^
    복 받으실꺼에요~~~~

    답글삭제
    답글
    1. "복"씩이나요...ㅎㅎ
      도움이 되셨으면 좋겠네요..

      삭제