'툴 정보 및 사용법 > IDA' 카테고리의 다른 글
IDA 바이너리 분석시 Type Libraries 추가할 것들 (0) | 2014.07.22 |
---|---|
IDA window(창) 위치 조정 (0) | 2012.03.29 |
IDA GUI (0) | 2011.09.20 |
IDA 2nd Edition 변화된 내용 (1) | 2011.08.18 |
PDF file loader to extract and analyse (0) | 2011.07.13 |
IDA 바이너리 분석시 Type Libraries 추가할 것들 (0) | 2014.07.22 |
---|---|
IDA window(창) 위치 조정 (0) | 2012.03.29 |
IDA GUI (0) | 2011.09.20 |
IDA 2nd Edition 변화된 내용 (1) | 2011.08.18 |
PDF file loader to extract and analyse (0) | 2011.07.13 |
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (i386)
9 number of sections
4802539D time date stamp Mon Apr 14 03:40:29 2008
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
10E characteristics
Executable
Line numbers stripped
Symbols stripped
32 bit word machine
OPTIONAL HEADER VALUES
10B magic #
7.10 linker version
14B80 size of code
2A00 size of initialized data
0 size of uninitialized data
159F7 address of entry point
380 base of code
----- new -----
80766000 image base
80 section alignment
80 file alignment
1 subsystem (Native)
5.01 operating system version
5.01 image version
5.01 subsystem version
17900 size of image
380 size of headers
1CD25 checksum
00040000 size of stack reserve
00001000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
0 DLL characteristics
0 [ 0] address [size] of Export Directory
15A40 [ 50] address [size] of Import Directory
16780 [ 3E0] address [size] of Resource Directory
0 [ 0] address [size] of Exception Directory
0 [ 0] address [size] of Security Directory
16B80 [ C24] address [size] of Base Relocation Directory
B680 [ 1C] address [size] of Debug Directory
0 [ 0] address [size] of Description Directory
0 [ 0] address [size] of Special Directory
0 [ 0] address [size] of Thread Storage Directory
BE68 [ 40] address [size] of Load Configuration Directory
0 [ 0] address [size] of Bound Import Directory
B480 [ 1F4] address [size] of Import Address Table Directory
0 [ 0] address [size] of Delay Import Directory
0 [ 0] address [size] of COR20 Header Directory
0 [ 0] address [size] of Reserved Directory
SECTION HEADER #1
.text name
97BA virtual size
380 virtual address
9800 size of raw data
380 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
68000020 flags
Code
Not Paged
(no align specified)
Execute Read
.....
Windbg 유용한 커널 명령어 정리 (0) | 2012.03.28 |
---|---|
Windbg 커널디버깅 중 특정 유저 API에 bp걸기 (1) | 2011.12.20 |
원하는 DeviceFunction에 브레이크 걸기. (0) | 2011.09.26 |
windbg에서 driver entry에 breakpoint 걸기 (2) | 2011.09.21 |
Windbg, Device driver BreakPoint(BP) (0) | 2011.09.21 |
atapi object +74h hook
설명은 아래 참고~ 초짜라 시간 너무 오래거리네...;;
char __stdcall atapi_IdePortDispatch_HOOK_(PCWSTR Object, int f, int code, int addr)
{
const WCHAR *v4; // eax@2
char result; // al@3
UNICODE_STRING DestinationString; // [sp+0h] [bp-8h]@1
RtlInitUnicodeString(&DestinationString, Object);// object = \\Driver\\atapi
if ( ObReferenceObjectByName(&DestinationString, 0x240u, 0, 0, IoDriverObjectType, 0, 0, &Object) >= 0//
// ObReferenceObjectByName를 이용
// 이름으로 DriverObject를 얻어온다.
//
&& (ObfDereferenceObject(Object), v4 = &Object[2 * f + 28], *v4) )
{
*addr = *v4; // 74h = IRP_MJ_SCSI / IRP_MJ_INTERNAL_DEVICE_CONTROL
*v4 = code; // atapi의 Object를 얻어와서 IdePortDispatch부분을
// 자신의 함수 부분으로 바꿈
//
// [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL
// f0e75a30 FileEngine+0x1a30 <<<<<<
result = 1;
}
else
{
result = 0;
}
return result;
}
10byte CDB structure (0) | 2011.10.11 |
---|---|
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
atapi의 특정 Major Function 후킹 (0) | 2011.09.28 |
드라이버와 어플리케이션과의 통신 (0) | 2011.09.26 |
IoControl 정보 제공 툴 (0) | 2011.09.26 |
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
---|---|
atapi object +74h hook (0) | 2011.09.28 |
드라이버와 어플리케이션과의 통신 (0) | 2011.09.26 |
IoControl 정보 제공 툴 (0) | 2011.09.26 |
후킹을 통한 프로세스 및 파일 보호 (0) | 2011.09.22 |
1. Prepare kernel debug using Windbg tool
2. menu - Debug - Event Filters.. -> Set the Load Module to 'enabled - not handle'
3. excute app
4. kd> kb -> check 4rd address from 'nt!DbgLoadImageSysbols 0x42' (It is 'ImageBase')
5. kd> !dh '4rd address('ImageBase')' -> check address of entry point
6. kd> u 'ImageBase' + 'entry point' -> bp 'DeviceControl address'
DeviceControl(MajorFunction[14]) 주소에 bp를 걸고 유저가 호출하는 코드를 따라간다.
Windbg 유용한 커널 명령어 정리 (0) | 2012.03.28 |
---|---|
Windbg 커널디버깅 중 특정 유저 API에 bp걸기 (1) | 2011.12.20 |
자꼬 까먹는 명령어!!!...!dh (0) | 2011.10.10 |
windbg에서 driver entry에 breakpoint 걸기 (2) | 2011.09.21 |
Windbg, Device driver BreakPoint(BP) (0) | 2011.09.21 |
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
---|---|
atapi object +74h hook (0) | 2011.09.28 |
atapi의 특정 Major Function 후킹 (0) | 2011.09.28 |
IoControl 정보 제공 툴 (0) | 2011.09.26 |
후킹을 통한 프로세스 및 파일 보호 (0) | 2011.09.22 |
다음은 그냥 퍼옴 (http://www.4ucode.com/Study/Topic/518106)
: IoControlCode 정의된 부분 같네요;
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
---|---|
atapi object +74h hook (0) | 2011.09.28 |
atapi의 특정 Major Function 후킹 (0) | 2011.09.28 |
드라이버와 어플리케이션과의 통신 (0) | 2011.09.26 |
후킹을 통한 프로세스 및 파일 보호 (0) | 2011.09.22 |
그리고 WINSTA.DLL의 WinStationTerminateProcess를 후킹하여 Terminal Service를 이용한
프로세스 종료를 차단합니다
ZwOpenProcess/ObReferenceObjectByPointer/PsLookupProcessByProcessId
ZwOpenProcess는 ObReferenceObjectByPointer를 호출하고 이는 다시 PsLookupProcessByProcessId를 호출하는데, 이들을 후킹하면 프로세스를 여는걸 어느정도 방지할 수 있을겁니다.
KeAttachProcess / KeStackAttachProcess
일단 프로세스의 메모리를 읽고 쓸땐 이 API를 사용하여 Page를 대상 프로세스의 Page로 전환해야하는데, 이를 방지하는 역할을 합니다.
ZwReadVirtualMemory/ZwWriteVirtualMemory/ZwTerminateProcess
프로세스의 메모리를 보호하며, 프로세스를 종료로부터 보호합니다.
ZwOpenThread/ZwGetContextThread/ZwSetContextThread/ZwTerminateThread
쓰레드를 보호합니다. 또한 쓰레드의 종료를 차단합니다.
ZwCreateFile (IoCreateFile)
이 것을 후킹하여 드라이버 혹은 프로세스 파일에 접근하는걸 차단할 수 있습니다.
경우에 따라선 ntoskrnl.exe를 접근하는 것을 막아 후킹을 해제하는걸 막아줄 수 있습니다.
ZwQuerySystemInformation
이 것을 후킹하면 프로세스를 숨길 수 있습니다. 밑에서 소개하는 DKOM보다는 안정적입니다.
1. DebugPort = NULL
디버거를 무력화하여 예외 처리를 프로세스에게 넘기는 방법으로, 디버거를 무력화시키는 방법중 하나입니다. 이 값이 NULL인지 아닌지 체크하는 방법도 비교적 괜찮은 방법이나, NT4/2000계열에서는 간혹 쓰레기값이 들어있는 경우가 있기 때문에 권장하지 않습니다.
EPROCESS에서의 DebugPort의 Offset 구하는 방법은 대략 아래와 같이 코딩할 수 있습니다.
VOID CalcHandleTableOffset(VOID)
{
PEPROCESS Proc = IoGetCurrentProcess();
HANDLE PID = PsGetCurrentProcessId();
PVOID GuessHandleTable = NULL;
int i = 0;
for(i = 0; i < PAGE_SIZE; i+=4)
{
GuessHandleTable = *(PVOID *)((PCHAR)Proc + i);
if(MmIsAddressValid(GuessHandleTable))
{
if(*(PHANDLE)((PCHAR)GuessHandleTable + 0x08) == PID)
{
HANDLE_TABLE_OFFSET = i;
return;
}
}
}
}
CalcHandleTableOffset();
DEBUG_PORT_OFFSET = HANDLE_TABLE_OFFSET - 8;
2. EPROCESS->ActiveProcessLinks Unlinking
프로세스를 숨겨서 보호합니다. 추가적으로 EPROCESS의 UniqueProcessId를 이상한 값으로 바꾸면 핸들을 얻는것을 어느정도 막을 수 있습니다. (물론 관련 ETHREAD 구조체에서 PID를 얻을수도 있기 때문에 이 방법이 꼭 좋은건 아닙니다.)
만약 프로세스 ID를 바꾸었다면 프로세스 종료 전에 복구하여야합니다.(그렇지 않으면 CID_HANDLE_DELETION 블루스크린을 맛보시게 될겁니다.)
그리고, 추가적으로 PspCidTable이라는 Unexported symbol에서 프로세스 Offset을 NULL로 만들어놓으면, 근본적으로 핸들을 얻을 수가 없을겁니다. PspCidTable은 PsLookupProcessByProcessId()에서 ExMapHandleToPointer(Ex)를 호출하기 전에 참조하는 심볼로, 바이트 코드를 트래버싱하거나, XP 이상에서는 KPCR->KdVersionBlock의 PspCidTable 필드를 참조해서 구할 수도 있습니다.
3. EPROCESS::HandleTable Unlinking
숨겨진 프로세스를 찾는 대표적인 방법으로는 크게 두가지가 있습니다. EPROCESS::HandleTable를 traverse 하거나 PspCidTable을 트레버싱하는 방법입니다. 물론, ETHREAD를 이용하거나 기타 여러가지 방법(brute-force 등등)을 이용하면 뚫리긴 합니다만, HandleTable을 끊음으로서 더욱 찾기 힘들게 할 수 있습니다.
위에서 언급한 ActiveProcessLinks와 핸들 테이블은 아래와 같은 LIST_ENTRY 구조입니다.
typedef struct _LIST_ENTRY {
PLIST_ENTRY Flink;
PLIST_ENTRY Blink;
} LIST_ENTRY, *PLIST_ENTRY;
1. PsLoadedModuleList unlinking
PsLoadedModuleList는 DRIVER_OBJECT 구조체의 DriverSection에 의해 Point됩니다. 그리고 아래와 같은 구조를 가지고 있습니다.(출처: rootkit.com 책)
typedef struct _MODULE_ENTRY
{
LIST_ENTRY ModuleListEntry;
DWORD Unknown1[4];
DWORD BaseAddress;
DWORD DriverStart;
DWORD Unknown2;
UNICODE_STRING Driver_Path;
UNICODE_STRING Driver_Name;
} MODULE_ENTRY, *PMODULE_ENTRY;
ModuleListEntry를 순회해서 BaseAddress가 DriverObject->DriverStart와 같은 엔트리를 찾아내서 ModuleListEntry를 끊어주면 숨겨줄 수 있을겁니다.
2. IoGetDeviceObjectPointer Hook
심볼릭 링크로부터 DEVICE_OBJECT를 얻는 대표적인 방법으로 이를 후킹하면 DEVICE_OBJECT를 얻는걸 막을 수 있고, 결과적으로 드라이버를 2차적인 루트킷 스캐너로부터 숨길 수 있게됩니다. DEVICE_OBJECT는 DRIVER_OBJECT를 포인트하기 때문에, 필수적으로 후킹해야합니다.
3. ZwOpenKey() Hook
드라이버 서비스 키를 traversing 하여 드라이버 정보를 얻는것을 차단할 수 있습니다.
4. IoCreateFile() Hook
드라이버 파일을 접근하지 못하게 함으로써 드라이버에 대한 접근을 차단합니다. ZwCreateFile()은 IoCreateFile을 직접 호출하므로, IoCreateFile()을 후킹하면 탐지되기가 더 어려우며, 그만큼 효과를 발휘하게 됩니다.
출처 : 수학쟁이님 네이버 블로그
문제가 된다면 삭제 조치 합니다
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
---|---|
atapi object +74h hook (0) | 2011.09.28 |
atapi의 특정 Major Function 후킹 (0) | 2011.09.28 |
드라이버와 어플리케이션과의 통신 (0) | 2011.09.26 |
IoControl 정보 제공 툴 (0) | 2011.09.26 |
Windbg 유용한 커널 명령어 정리 (0) | 2012.03.28 |
---|---|
Windbg 커널디버깅 중 특정 유저 API에 bp걸기 (1) | 2011.12.20 |
자꼬 까먹는 명령어!!!...!dh (0) | 2011.10.10 |
원하는 DeviceFunction에 브레이크 걸기. (0) | 2011.09.26 |
Windbg, Device driver BreakPoint(BP) (0) | 2011.09.21 |
퍼옴 :: cjhnim.egloos.com/3880348
Windbg에서 Breakpoint 잡는 다양한 방법들...Windbg에서 breakpoint를 설정하는 방법들에 대해서 써볼까 합니다.
제가 처음 Windbg를 접했을 때는 명령어를 사용하여 breakpoint를 잡는 방법을 애용했었습니다.
•kd> bp driverentry - breakpoint를 설정하고자 하는 대상 드라이버가 이미 로딩되어 있고 symbol도 로딩되어있을 때 사용합니다.
•kd> bp mydriver!driverentry - 대상 드라이버가 로드되지 않은 경우 사용할 수 있는 breakpoint 설정 방법입니다. 드라이버가 로드될 때 windbg가 자동으로 symbol을 로드하며 이때 mydriver!driverenty 가 실제 주소 값으로 변경되어 breakpoint로 설정됩니다. 그러므로 대상 드라이버가 언로드되고 다시 로드된다면 이 설정은 무용지물이 되어버립니다.
•kd> bu mydriver!driverentry - 이번 방법은 심볼로 breakpoint를 거는 방법입니다. 드라이버가 언로드되었다가 다시 로드되더라도 breakpoint 설정이 유효하게 됩니다.
•kd> bm /a mydriver!driver* - 와일드카드를 이용하여 breakpoint를 거는 방법입니다. 여러개의 함수를 한번에 설정할 때 사용하면 유용합니다.
하지만 위의 방법은 함수의 중간에 breakpoint를 걸기엔 좀 부적합합니다.. 그래서 vc 처럼 소스코드에 breakpoint를
바로 걸고 싶은 충동이 생기죠... 이럴 땐 아래의 방법을 사용하면 됩니다.
•kd> open -a mydriver!driverentry
라고 하면 mydriver.sys에 driverentry 함수가 있는 소스를 windbg창에 자동으로 열어줍니다.. 여기서 원하는 위치에 F9를 통하여 breakpoint를 설정을 하면 됩니다.. 단 이방법은 해당 모듈에 대한 symbol이 로드된 경우에만 사용가능한 방법입니다......
더 다양한 방법들은 WinDBG의 도움말을 참고하면 됩니다.
Windbg 유용한 커널 명령어 정리 (0) | 2012.03.28 |
---|---|
Windbg 커널디버깅 중 특정 유저 API에 bp걸기 (1) | 2011.12.20 |
자꼬 까먹는 명령어!!!...!dh (0) | 2011.10.10 |
원하는 DeviceFunction에 브레이크 걸기. (0) | 2011.09.26 |
windbg에서 driver entry에 breakpoint 걸기 (2) | 2011.09.21 |