Win 32 바이러스 디자인 입문

Win 32 바이러스 디자인 입문  본 고 는 dos 아래 의 바이러스 와 386 PM 에 대해 어느 정도 알 고 있다 고 가정 한다.  1.모든 바이러스 에 감염 되 려 면 숙주 가 있어 야 하고 바이러스 코드 를 숙주 프로그램 에 넣 어야 합 니 다(배우자 바 이러 스 는 제외).  다음은 PE 파일 에 바이러스 코드 를 삽입 하 는 방법 을 설명 합 니 다.PE 파일 의 구 조 는 이전 글 을 보십시오. PE 파일 의 전형 적 인 구조: MZ Header DOS STUB CODE PE HEADER OPTIONAL HEADER SECTION TABLE SECTION 1 SECTION 2 ... IMPORT TABLE EXPORT TABLE DOS 의 실행 가능 한 파일 과 유사 합 니 다.PE 의 코드 이미 지 는 몇 개의 SECTION 으로 나 뉘 어 파일 에서 정렬 됩 니 다.  페이지 경계(4K).일반적으로 파일 은 400000 h 에서 시작 하 는 공간 에 불 러 옵 니 다.첫 번 째 SECTION 은 401000 h 에 있 고 입구 주소 도 401000 h 입 니 다.고급 언어 로 작 성 된 프로그램 은 각 SECTIO-N 의 길이 가 4K 의 배수 일 수 없 기 때문에 SECTION 의 끝 에 사용 되 지 않 는 공간 이 존재 합 니 다. , 크기 는 Section 의 PHYSICAL SIZE-VIRTUALSIZE 를 얻 을 수 있 습 니 다.파일 의 시작 위 치 는... PHYSICAL OFFSET 에서 이 공간 은 바이러스 코드 를 저장 하 는 데 사용 할 수 있 습 니 다.그리고 일반적으로 MZ Header+DOS STUD+PE  HEADER+OPTIONAL HEADER+SECTION TABLE 은 1K 정도 에 불과 합 니 다. 그리고 선택 1.4K 부터 비 어 있 는 곳 은 디자인 이 좋 은 바 이러 스 를 저장 하기에 충분 하 다.CIH 는 장군 입 니 다. 코드 는 이 빈 공간 에 저 장 됩 니 다.  2.상주 에 필요 한 메모리 할당  체류 형 바이러스 에 대해 서 는 체류 에 필요 한 메모 리 를 분배 하 는 것 이 필요 하 다.DOS 에서 사용 합 니 다.모든 것 때문에. 응용 프로그램 은 모두 같은 선형 주소 공간 에 비 추어 일반적인 메모리 분배 호출 을 사용 하면 충분 하 다.WIN 32 에서 모든 응용 프로그램 은 자신의 선형 주소 공간 을 가지 고 특수 한 함수 로 2GB 이상 의 시스템 주 소 를 분배 해 야 한다.전형 적 인 예:VXD 서비스PageAllocate,kernel 32 의 VxDCALL  _PageReserve。_PageAllocate win98ddk 의 설명,Vxdcall 참조 _PageReserve HPS 소스 코드 의 설명 을 참조 하 십시오.  3.FILE 차단 I/O 조작 상주 형 바 이러 스 는 FILE 를 통 해 I/O 로 활성화,VXD 서비스 이용 가능  IFSMgr_Install-fileSystemAPIHook(예 를 들 어 CIH)또는 Vxdcall 의 DOS 를 차단 합 니 다. Services callback(예:HPS).  Win 32 에서 바 이러 스 를 만 드 는 것 은 어 려 운 일이 아니다.주의해 야 할 것 은 몇 가지 가 있다.  1.Win 32 의 시스템 기능 호출 은 중단 을 통 해 이 루어 지 는 것 이 아니 라 DLL 에서 내 보 냅 니 다.  (VxD 서 비 스 를 직접 사용 하 는 경 우 는 제외).바이러스 에서 API 입 구 를 직접 얻 는 것 은 쉬 운 일이 아니 므 로 다음 과 같은 방법 으로 변통 할 수 있다.  같은 버 전의 Windows 에서 같은 핵심 함수 의 입 구 는 항상 고정 되 어 있 습 니 다(Kernel 32,gdi 32,user 32 에서 내 보 내 는 함수).따라서 다음 과 같은 방법 으로 함수 입 구 를 얻 을 수 있다.  .386p  .model flat,stdcall  extrn GetModuleHandleA:proc  extrn GetProcAddress:proc  extrn ExitProcess:proc  .data  szKernel db 'KERNEL32.DLL',0  szFindFirst db 'FindFirstFileA',0  szFindNext db 'FindNextFileA',0  szFindClose db 'FindClose',0  szGetCurrentDir db 'GetCurrentDirectoryA',0  szGetWinDir db 'GetWindowsDirectoryA',0  szGetSysDir db 'GetSystemDirectoryA',0  szGetFileAttrib db 'GetFileAttributesA',0  szSetFileAttrib db 'SetFileAttributesA',0  szlopen db '_lopen',0  szlread db '_lread',0  szlwrite db '_lwrite',0  szlclose db '_lclose',0  szllseek db '_llseek',0  hKernel dd 0  .code  ;Initialize code  start:  push szKernel  call GetModuleHandleA  mov hKernel,eax  push szFindFirst  push hKernel  call GetProcAddress  mov FindFirstFile,eax  ....  jmp VirusStart  InitExit:  push 0  call ExitProcess  VirusStart:  jmp Entry  HostEntry dd InitExit  FindFirstFile dd 0  FindNextFile dd 0  ...  Entry:  ...  end start  Intialize 에서 Code 는 사용 할 함수 입 구 를 얻어 바이러스 에 넣 고 바이러스 가 실 행 될 때 직접 사용 할 수 있 습 니 다.2.주로 파일 I/O 작업 을 차단 해 야 합 니 다.  Windows 에서 파일 I/O 를 차단 하 는 방법 은 몇 가지 가 있 는데 바이러스 에서 주로 두 가지 가 사용 된다.  1,사용 VxDCallIFSMgrInstallFileSystemHook  2.Kernel 32.dll 에서 내 보 낸 첫 번 째 함수 VxDCall 대 DOS 차단  INT 21 의 호출(EAX=2A 0010).  Vxdcall 의 코드 는 다음 과 같 습 니 다.  mov eax,dword ptr [esp+04]  pop dword ptr [esp]  call fword ptr cs:[xxxxxxxx]  ^^^^^^^^이 주소 가 가리 키 는 주 소 를 자신의 프로 세 스 입구 로 바 꾸 면 모든 Vxdcall 이 포 착 됩 니 다.  이 과정 에 들 어 갈 때:  eax=service number,DOS 라면 INT 21 은 2A 0010 입 니 다.  esp[2c]d 호출 Int 21 시 eax 의 값  ~~~~ pushad 가 빠 진 걸 로 치면 10h 일 거 예요.  esp[30] 호출 int 21 시 ecx 의 값  ~~~~14h  다른 레지스터 는 호출 에 필요 한 값 입 니 다.(세그먼트 레지스터 사용 안 함)  앞 으로 는 도스 에 바 이러 스 를 쓰 는 것 과 별 차이 가 없다.  WINDOWS 에 바 이러 스 를 쓰 고 API 의 입 구 를 어떻게 얻 는 지 는 번 거 로 운 일이 다. 직접 사용 할 수 있 는 API 는 DLL 에 있 고 VXDCALL 은 RING 0 에 있어 야 사용 할 수 있 습 니 다. 쓰다 21.서비스 도 직접 호출 할 수 없습니다. DLL 의 API 입 구 를 얻 는 방법 은 두 가지 가 있 습 니 다.  1.불 러 올 때 받 을 수 있 습 니 다.하 나 를 만 듭 니 다. IMPORT TABLE,불 러 올 때 WINDOWS 는 IMPORT 에 따라 TABLE 포 지 셔 닝 API 의 입구 주소 입 니 다.이것 은 일반 응용 프로그램의 사용 방법 이지 만 바이러스 에 적합 하지 않 습 니 다.  2.실행 시 얻 을 수 있 습 니 다.GetModuleHandle 과 GetProcAddress 를 사용 하여 API 의 입 구 를 얻 을 수 있 지만 전제 적 으로 GetModuleHandle 과 GetProcAddress 의 입구 주소.:< 이것 은 분명히 불가능 합 니 다.GetModuleHandle 과 GetProcAddress 의 코드 를 우리 바이러스 에 복사 하 는 것 외 에 폭력 만 사용 합 니 다. 2GB 공간 에서 API 의 입 구 를 찾 았 습 니 다.  먼저 WINDOWS 의 메모리 맵 을 설명 하 겠 습 니 다.0000000 부터 한 단락 은? 잘못된 주소(얼마나 되 었 는 지 잊 어 버 렸 습 니 다).프로그램의 잘못된 지침 을 캡 처 하 는 데 사 용 됩 니 다.  0x7FFFFF 를 응용 프로그램 으로 하 는 공간 을 따라 갑 니 다.0x80000000 이후 시스템 입 니 다. DLL 과 VXD 가 모두 여기에 매 핑 되 어 있 습 니 다.우리 가 해 야 할 일 은 이 2GB 의 공간 에서 Krnl32.dll 을 찾 는 것 입 니 다. 일반적으로 Windows 의 프로그램 은 64k 경계 에 정렬 되 어 있 습 니 다.먼저 MZ 입 니 다. 파일 헤더 HEADER 의 정 보 는 PE 를 얻 을 수 있 습 니 다. HEADER 의 입구. 이 태그 에서 모든 DLL 을 찾 을 수 있 습 니 다.PE 에서. HEADER 는 DLL 을 받 을 수 있어 요. EXPORT TABLE 의 입구,그 중 NAME PTR TABLE 의 첫 번 째 항목 은 DLL 의 이름 입 니 다. 이 를 통 해 Krnl32.dll 을 찾 아 ADDRESS 에서 TABLE 중 에 하 나 를 얻 을 수 있어 요. API 의 입구.  주의해 야 할 것 은 이 2GB 에서 주소 가 모두 유효한 것 이 아니 라 일반적인 프로그램 에 서 는 IsXXXXPtr 를 통 해 주소 가 유효한 지 여 부 를 판단 할 수 있 지만 바이러스 에 서 는 안 돼 요.훅 밖 에 없어 요. Exception,잘못된 주소 에 접근 한 Exception 을 무시 합 니 다. Windows 의 Exception Chain 의 구 조 는 다음 과 같다. fs:[0] dword exception 이 발생 했 을 때 esp 의 새 값 은 다음 과 같 습 니 다. 구조 [esp] dword fs:[0]의 새 값 [esp+4] dword exception handler 의 입구 [esp+8] dword exception handler 에서 사용 하 는 데이터 첫 번 째 주소 [esp+12] dword -1 상세 한 어 셈 블 리 코드 는 C 로 한 단락 쓸 수 있다try...__except 코드,그리고 어 셈 블 리 로 번역 하 다. 우리 exception 만 handler 는 바이러스 로 바로 이동 해서 Krnl32.dll 을 찾 습 니 다. 의 코드 는 GP 를 일 으 키 지 않 을 수 있다 Error 로 모든 주 소 를 방 문 했 습 니 다. 범례 는 HPS 의 소스 코드,PE 를 참조 할 수 있다. HEADER,EXPORT TABLE PE 참조 FORMAT.  1.Windows 에서 다운로드 한 DLL 은 서로 다른 process 에서 같은 주소 로 매 핑 됩 니 다.  2.DLL 에서 내 보 낸 함 수 는 export 에 있 습 니 다. 테이블 에 상대 DLL 기록 Image Base 의 오프셋,이 오프셋 을 변경 하려 면 GetProcAddress 로 받 은 주소 가 변 경 됩 니 다. (CreateProcess 주 소 를 자신의 DLL 에 있 는 함 수 를 가리 키 거나 GetDlgItemText 를 캡 처 하여 Password 를 기록 하 는 것 을 상상 해 보 세 요)  3.Kernel 32.DLL 에서 Section Table 은 0x 300 이전에 끝 났 습 니 다.실제 코드 는 0x 1000 곳 에서 시작 되 었 습 니 다.그 사이 에 3K 의 사용 되 지 않 은 공간 이 있어 서 저희 코드 를 저장 할 수 있 습 니 다. Kernel32.DLL 의 이미지 Base 는 GetModule HandleA 에서 얻 을 수 있 습 니 다.  4.모든 버 전의 Windows 에서 3 개의 기본 DLL 은 항상 불 러 옵 니 다(Kernel32.DLL,User32.DLL,GDi32.DLL).그리고 같은 버 전의 Windows 에 대한 이미지 입 니 다. Base,내 보 내기 함수 의 주 소 는 항상 고정 되 어 있 습 니 다.얻 은 주 소 를 바이러스 에 직접 사용 할 수 있다. ( NT 에서 도 바 이러 스 를 쓸 수 있 게 되 었 습 니 다.또 시스템 을 바 꿔 야 합 니 다. )

좋은 웹페이지 즐겨찾기