일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- forensic
- 악성코드분석
- 이디스커버리
- 엔케이스
- Music_Player
- x64dbg
- 악성코드
- REGA
- 포렌식
- 레가
- U's room
- Opentext
- 사이버수사
- 리버싱
- reversing.kr
- http://reversing.kr/
- 서호전
- 디지털포렌식
- encase
- 고려대학원
- Reversing
- 사이버수사과
- KDFS2022 #KDFS2023 #학생트랙 #멤버모집 #포공학 #포렌식 #디지털포렌식 #범인을찾아라 #DFC #포렌식대회 #보고서 #학생트랙보고서
- e-discovery
- 역연산
- 악성코드 분석
- 레지스트리포렌식
- 포렌식 #안티포렌식 #레지스트리 #거부권한 #깃허브 #Forensics #forensic #anti-forensic #anti-forenscis #컴퓨터 #사이버수사 #수사관 #KDFS
- 서울호서직업전문학교
- 리버싱엔지니어링
- Today
- Total
DDDDigtal 4ensics
[Uolatility 3]Volatility 3 GUI로 개발해보기 본문
이 프로젝트에 시작하기 앞서, 내가 이걸 하는 이유는 ?
그냥 ! 재미로 ! 군인이 자기개발 시간 할거없어서 심심풀이로 ! 다 맞는 말이지만, 이걸 보는 사람 중
우연하게 자바를 할 줄 알고 포렌식이 관심이 있으며 그 중 CUI인 Volatility가 불편해 직접 GUI로 만들어 보고 싶은 사람이 있다면?이라는 만의 하나의 수에 그 하나를 돕기 위하여 글을 한 번 꾸준하게 작성해보겠다.
취지는 좋다만,,, 대단한 프로젝트도 아니고 제작기간이 짧을 분더러 내 코딩실력이 좋지 않기 때문에 글이 그리고 코드가 간결하고 이쁘다고는 말하지 못하겠으나 그래도 잘 봐주면 좋겠다.
Volatility란 ?
Volatility란 영어 뜻을 해석하면 휘발성이라는 뜻을 가지고 있다.
(메모리 포렌식 자체가 휘발성을 띄고 있는 RAM을 이용한 포렌식이라는 점을 생각하면 툴 이름이 굉장히 마음에 든다.)
Volatility는 2.6버전 부터 Windows10을 지원하는 Volatility 3까지 오랜시간 사랑받고 있는 메모리 포렌식의 No.1 툴이라고 설명할 수 있다. 다양한 포렌식 툴이 존재하고, 디스크 포렌식만 봐도 본인의 선호에 따라 Axiom, Encase, W-way 등 다양한 툴을 쓰지만, 메모리 포렌식만큼은 10중8이 Volatility를 쓴다라고 해도 과언이 아니라고 생각한다. 저 중 Axiom Forensics툴은 어떤 환경에서도 증거를 수집해주는 아주 강력한 툴이다. 그런 Axiom에서도 메모리 포렌식은 Volatility를 사용한다. https://github.com/volatilityfoundation/volatility3 깃허브로 가면 Volatility에 대한 자세한 설명과 코멘트를 찾을 수 있으며, https://www.volatilityfoundation.org/ 링크 또한 자세한 설명과 코멘트를 찾을 수 있으니 한 번씩 읽어보는 것을 추천한다.
Uolatility 3.0
자 이제 Uolaility(이하 Uol)3.0에 대한 개발 환경을 소개한다.
나는 Java를 이용할 것이고, Window Builder를 추가로 설치하는 것을 강조한다.
Window Builder가 없으면 개발에 어려울 것이다...
오늘은 조금 OT느낌으로,,, 내 지금 소스가 나에게 없기 때문에,,, 완전 초기 화면으로 약간 정보가 부족해도 이해바란다.
아 참, 그리고 나는 파싱하는 Process와 파싱한 데이터를 토대로 보여주는 Analyze로 나눠 2개의 툴을 개발하고 서로 연동을 도와줄 것이며, 그 이유는 내가 열심히 공부해서 나만의 Axiom을 만들자 ! 라는 취지를 가지고 처음 만든 프로그램이 Uolatility이기에 조금 Axiom을 오마주?한 느낌이 있다.
윈도우 빌더의 대한 설명을 구글링해서 찾아보시고, 그 정도로 친절한 블로그는 아니다.
일단 메모리 덤프 파일 패스 & 프로젝트 저장 위치 옆에 있는 찾아보기 버튼 쪽 소스를 설명하겠다.
메모리 덤프 파일 패스 버튼에 대한 코드
JLabel label_1 = new JLabel("\uCC3E\uC544\uBCF4\uAE30");
label_1.setBounds(547, 227, 55, 15);
label_1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JFileChooser jfc = new JFileChooser();
int returnVal = jfc.showOpenDialog(null);
if(returnVal == 0) {
mempathF.setText(jfc.getSelectedFile().toString());
}
else {
JOptionPane.showMessageDialog(null, "파일 선택을 취소하였습니다.", "Uolatility.", JOptionPane.PLAIN_MESSAGE);
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
label_1.setForeground(new Color(0,51, 102));
}
@Override
public void mouseExited(MouseEvent e) {
label_1.setForeground(new Color(0, 102, 255));
}
});
label_1.setForeground(new Color(0, 102, 255));
label_1.setFont(new Font("굴림", Font.PLAIN, 12));
frmUolatility.getContentPane().add(label_1);
프로젝트 저장 위치에 대한 코드
JLabel lblNewLabel_2 = new JLabel("\uCC3E\uC544\uBCF4\uAE30");
lblNewLabel_2.setBounds(547, 260, 55, 15);
lblNewLabel_2.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent arg0) {
lblNewLabel_2.setForeground(new Color(0,51, 102));
}
@Override
public void mouseExited(MouseEvent e) {
lblNewLabel_2.setForeground(new Color(0, 102, 255));
}
@Override
public void mouseClicked(MouseEvent e) {
JFileChooser jfc = new JFileChooser("");
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = jfc.showOpenDialog(null);
if(returnVal == 0) {
projectpathF.setText(jfc.getSelectedFile().toString());
} else {
JOptionPane.showMessageDialog(null, "디렉터리 선택을 취소하였습니다.", "Uolatility.", JOptionPane.PLAIN_MESSAGE);
}
}
});
lblNewLabel_2.setForeground(new Color(0, 102, 255));
lblNewLabel_2.setFont(new Font("굴림", Font.PLAIN, 12));
frmUolatility.getContentPane().add(lblNewLabel_2);
이 둘의 차이점을 찾을 수 있겠나? 나는 어려울 것 같다... 뭐 변수명이나 이런 자잘자잘한건 당연히 다르지만 코드의 근본적인 원리와 작동에 대한 기능차이는 크게 없기 때문이다. 이 중 다른 점은
JFileChooser jfc = new JFileChooser();
JFileChooser jfc = new JFileChooser("");
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
위에 한 줄로 이루어진 그냥 JFileChooser는 파일을 초이스할 수 있는 창을 띄우도록 도와주는 친구이지만,
밑 JfileChooser에 jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) 을 추가한다면, 파일이아닌 디렉토리를 선택할 수 있도록 도와준다.
여기서 개발을 잘하는 사람 혹은 이 프로그램에 나보다 더한 애정을 갖고 개발을 하고 싶은 사람은
메모리 덤프의 확장자인 .mem등이 아니라면 또 선택을 못하도록 할 수 있다. 아님 선택을 완료했는데 .mem이 아니라면 알림창을 띄우면되는거고.
두 번째로 스크롤바가 있는 창을 만들 거다.
위 이미지를 보면 패널을 만들고 프레임에 scrollPane을 생성 후 scarollPane 밑에 plusins가 들어간다.
아니 지금 보니까 plugins이 아니고 왜 plus지;; 이건 본인이.. 알아서 잘 피해가라... 이 점에 유의 하며 패널을 만들고
package Uol_Process;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JCheckBox;
import java.awt.Font;
import javax.swing.JLabel;
public class plusins_panel extends JPanel {
public static JCheckBox jcb[] = new JCheckBox[20];
public plusins_panel() {
setLayout(null);
setBounds(12, 10, 764, 500);
jcb[0] = new JCheckBox("Apihooks");
jcb[0].setSelected(true);
jcb[0].setFocusable(false);
jcb[0].setOpaque(false);
jcb[0].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[0].setBounds(8, 6, 115, 23);
add(jcb[0]);
jcb[1] = new JCheckBox("cmdscan");
jcb[1].setSelected(true);
jcb[1].setFocusable(false);
jcb[1].setOpaque(false);
jcb[1].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[1].setBounds(8, 39, 115, 23);
add(jcb[1]);
jcb[2] = new JCheckBox("LDR \uBAA8\uB4C8");
jcb[2].setSelected(true);
jcb[2].setFocusable(false);
jcb[2].setOpaque(false);
jcb[2].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[2].setBounds(127, 6, 115, 23);
add(jcb[2]);
jcb[3] = new JCheckBox("psxview");
jcb[3].setSelected(true);
jcb[3].setFocusable(false);
jcb[3].setOpaque(false);
jcb[3].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[3].setBounds(127, 39, 115, 23);
add(jcb[3]);
jcb[4] = new JCheckBox("psscan");
jcb[4].setSelected(true);
jcb[4].setFocusable(false);
jcb[4].setOpaque(false);
jcb[4].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[4].setBounds(365, 39, 115, 23);
add(jcb[4]);
jcb[5] = new JCheckBox("connections");
jcb[5].setSelected(true);
jcb[5].setFocusable(false);
jcb[5].setOpaque(false);
jcb[5].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[5].setBounds(246, 6, 115, 23);
add(jcb[5]);
jcb[6] = new JCheckBox("netscan");
jcb[6].setSelected(true);
jcb[6].setFocusable(false);
jcb[6].setOpaque(false);
jcb[6].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[6].setBounds(365, 6, 115, 23);
add(jcb[6]);
jcb[7]= new JCheckBox("modscan");
jcb[7].setSelected(true);
jcb[7].setFocusable(false);
jcb[7].setOpaque(false);
jcb[7].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[7].setBounds(246, 39, 115, 23);
add(jcb[7]);
jcb[8] = new JCheckBox("modules");
jcb[8].setSelected(true);
jcb[8].setFocusable(false);
jcb[8].setOpaque(false);
jcb[8].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[8].setBounds(484, 6, 115, 23);
add(jcb[8]);
jcb[9] = new JCheckBox("dlllist");
jcb[9].setSelected(true);
jcb[9].setFocusable(false);
jcb[9].setOpaque(false);
jcb[9].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[9].setBounds(484, 39, 115, 23);
add(jcb[9]);
jcb[10] = new JCheckBox("sockscan");
jcb[10].setSelected(true);
jcb[10].setFocusable(false);
jcb[10].setOpaque(false);
jcb[10].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[10].setBounds(127, 105, 115, 23);
add(jcb[10]);
jcb[11] = new JCheckBox("handles");
jcb[11].setSelected(true);
jcb[11].setFocusable(false);
jcb[11].setOpaque(false);
jcb[11].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[11].setBounds(8, 72, 115, 23);
add(jcb[11]);
jcb[12] = new JCheckBox("imageinfo");
jcb[12].setSelected(true);
jcb[12].setFocusable(false);
jcb[12].setOpaque(false);
jcb[12].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[12].setBounds(127, 72, 115, 23);
add(jcb[12]);
jcb[13] = new JCheckBox("sockets");
jcb[13].setSelected(true);
jcb[13].setFocusable(false);
jcb[13].setOpaque(false);
jcb[13].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[13].setBounds(8, 105, 115, 23);
add(jcb[13]);
jcb[14] = new JCheckBox("clipborad");
jcb[14].setSelected(true);
jcb[14].setFocusable(false);
jcb[14].setOpaque(false);
jcb[14].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[14].setBounds(246, 72, 115, 23);
add(jcb[14]);
jcb[15] = new JCheckBox("filescan");
jcb[15].setSelected(true);
jcb[15].setFocusable(false);
jcb[15].setOpaque(false);
jcb[15].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[15].setBounds(365, 72, 115, 23);
add(jcb[15]);
jcb[16] = new JCheckBox("pslist");
jcb[16].setSelected(true);
jcb[16].setFocusable(false);
jcb[16].setOpaque(false);
jcb[16].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[16].setBounds(603, 72, 115, 23);
add(jcb[16]);
jcb[17] = new JCheckBox("getsids");
jcb[17].setSelected(true);
jcb[17].setFocusable(false);
jcb[17].setOpaque(false);
jcb[17].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[17].setBounds(484, 72, 115, 23);
add(jcb[17]);
jcb[18] = new JCheckBox("connscan");
jcb[18].setSelected(true);
jcb[18].setFocusable(false);
jcb[18].setOpaque(false);
jcb[18].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[18].setBounds(603, 39, 115, 23);
add(jcb[18]);
jcb[19] = new JCheckBox("malfind");
jcb[19].setSelected(true);
jcb[19].setFocusable(false);
jcb[19].setOpaque(false);
jcb[19].setFont(new Font("굴림", Font.PLAIN, 14));
jcb[19].setBounds(603, 6, 115, 23);
add(jcb[19]);
}
}
진짜 노가다다. 나 처럼 만들면 안된다. 나는 코딩 잘 못하니까 하드코딩으로 하나하나 씩... 하는 것 이다.
똑똑한 분들은.. 나보다 더 잘만들 거라고 믿는다.
plusins_panel plusins_panel = new plusins_panel();
plusins_panel.setBackground(Color.WHITE);
plusins_panel.setBounds(0, 0, 2000, 2000);
plusins_panel.setPreferredSize(new Dimension(0, 300));
scrollPane.setViewportView(plusins_panel);
추가도 그냥 대충 crollpane.setViewportView(plusins_panel);로 하는 것이 아니라
plusins_panel.setPreferredSize(new Dimension(0, 300));을 꼭 추가해주는 것이 좋다.
아니 꼭 해줘야한다. 그래야 본인이 원하는 만큼 패널의 크기를 재조정해서 스크롤바를 띄울 수 있다.
앞으로 많이 쓸 것이니 기억해주면 좋다.
우와... 초기 버전 Process에 대한 모든 주요 기능을 벌써 모두 소개했다. 이게 내가 개발을 시작한지 첫 날 완성했던 걸로 기억하는데... 다같이 도전해서 나보다 더 좋은 프로그램을 만들기 바라며 내일 다시 돌아오도록 하겠다.
'Coding > Uolatility 3.0' 카테고리의 다른 글
[Uolatility 3] Volatility3을 자바에서 작동시키기 (0) | 2023.07.07 |
---|