본문 바로가기

[Poly_Zero] 3. Note - 3 : Polymorphic Code + Hash ( 2014/7/16 ) 개발 4일 째... -> 새로 구현한 것 - 이번에는 kernel32.dll 에서 Native API 명을 찾을 때, 일반적인 문자열로 하면, 분석이 쉬워짐으로 그 문자열에 해당하는 해쉬를 비교하는 방식으로, 만약 해쉬 값이 같다면, 그 함수를 로딩하라 라는 방식을 넣어봄. - Polymorphic 구조 대강 완성 완료. 간단하게 바이러스 역할을 하는 부분의 코드를 정해진 키 값(랜덤으로 바꿀예정)으로 암호화 후, 실행할 때 복호화 해서 실행. -> 구현한 것 - 시작 프로그램 레지스트리 등록 - 다른 실행 파일 하나를 찾아 감염, zero 라는 새로운 섹션을 만든 후, 암호화된 바이러스 코드 주입 - %Temp% 폴더에 숙주 바이러스를 복사 - 문자열 해쉬 구하는 기능 추가. ( 분석 난독화를 위한 작.. 더보기
[Operation System] 6. OS 만들기 - Kernel Load - 1 1. Pre.. 이번 시간에는 커널을 로드해 볼 겁니다. 2. Process - boot 프로그램 만들기 - kernel 프로그램 만들기 - 두개를 .img 파일로 합치기 : copy /b boot.bin + kernel.bin os.img - 플로피 디스크로 부팅 3. Code - boot.asm [org 0] jmp 07C0h:start start: mov ax, cs mov ds, ax mov es, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di,2 dec cx jnz paint read: mov ax, 0x1000 ; es:bx = 0x1000:1.. 더보기
[Operation System] 5. OS 만들기 - BootStrap - 4 1. 8086 - 1978년 인텔에서 제작된 CPU로서 처음으로 x86 아키텍처를 적용한 제품이다. - 내부적으로는 16 bit 레지스터를 사용한다. 하지만...... - 어드레스 버스가 20 bit 였으므로 1024 * 1024 = 1048576 (byte) = 1 MB 만큼의 메모리를 사용할 수 있다. - 바이오스에서 사용하는 영역인 384 KB 를 제외하면 640 KB 만을 실제로 사용할 수 있다. - 8086 에서 사용하는 1MB 의 Memory Map - 0x000 ~ 0x3FF 까지 0x400(1 KB)은 IVT로 사용, 0x400 ~ 0x4FF 까지 BDA로 사용한다. - 0x500 ~ 0x9FFFF 까지는 자유롭게 사용할수 있다고 나와 있다. 하지만.... - 0x7C00 ~ 0x7DFF .. 더보기
[Operation System] 4. OS 만들기 - BootStrap - 3 1. Pre.. 이번엔 아스키 아트 + 색깔을 넣어서 출력을 해 봅시다. - 플로피디스크에 프로그램을 담아 부팅시켜보자. 2. Process - 아스키 코드로 만든 그림 - 비디오 램에 접근해서 색깔 정하는 법 - 배경색 지정하는 법 3. Code [org 0] jmp 0x7c0:start ; cs = 0x7c0 start: mov ax, cs ; segment register 은 직접 복사가 안된다. mov ds, ax ; cs 와 ds 가 같은 값을 갖게 하기 위한 작업 mov ax, 0xb800 ; video ram ( color vga area ) mov es, ax ; es 하늘 색 ; 0xB800:0001 -> 하늘색이 들어감 cmp al, 0 ; 만약 끝나면 forever 로 가셈 je fo.. 더보기
[Operation System] 3. OS 만들기 - BootStrap - 2 1. Pre.. 이번엔 Hello World 를 출력하는 부트로더를 제작해 봅시다. - 플로피디스크에 프로그램을 담아 부팅시켜보자. 2. Process - 물리주소의 시작위치 정하기 - 'hello, world'의 메모리 공간 확보 - 비디오 서비스를 위한 BIOS 인터럽트를 걸어 화면에 출력 3. Code [org 0] ; 물리주소 계산법 : (cs 32 비트 정수 또는 실수 dq -> 64 비트 정수 또는 실수 dt -> 80 비트 10바이트 정의 % Start 가 0x5 로 바뀐 이유 어셈을 아시는 분은 아시겠지만, 저 줄의 총 바이트 수가 5바이트 이기 때문입니다. ( 컴파일러가 바이너리에는 반영이 안됨 ) 4. Run 5. Disassem 00000000 EA0500C007 jmp word 0x.. 더보기