공다팩이나 다동이나 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()
정말 좋은 정보 감사합니다. ^^
답글삭제복 받으실꺼에요~~~~
"복"씩이나요...ㅎㅎ
삭제도움이 되셨으면 좋겠네요..