Happy 0x7DA year!

4 комментария      

Небольшая функция

Для того чтобы проверить, заполнена ли LoaderData у процесса.


BOOLEAN CheckForKernelLDR(ULONG ProcessId)
{
PEPROCESS pEPROC;
KAPC_STATE ApcState;
NTSTATUS Status;
BOOLEAN bResult = FALSE;
HANDLE hProcess;
PROCESS_BASIC_INFORMATION pbi;

do
{
hProcess = OpenProcess((HANDLE)ProcessId, PROCESS_ALL_ACCESS);
if (!hProcess) {
break;
}

Status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
if (NT_ERROR(Status)) {
ZwClose(hProcess);
break;
}

ZwClose(hProcess);
Status = PsLookupProcessByProcessId((PVOID)ProcessId, &pEPROC);
if (NT_ERROR(Status)) {
break;
}

KeStackAttachProcess((PKPROCESS)pEPROC, &ApcState);
bResult = ((PLDR_MODULE)pbi.PebBaseAddress->LoaderData->InInitializationOrderModuleList.Flink)->LoadCount > 0;
KeUnstackDetachProcess(&ApcState);
ObDereferenceObject(pEPROC);

} while (FALSE);

return bResult;
}
Комментарии: 0      

OMFG

ERROR_NOACCESS на Vista SP0 при LoadLibraryExA("kernel32.dll"). Ну что за пиздец.
2 комментария      

Поиск pIofCallDriver.

Написал код для получения этого указателя. Для чего он нужен я думаю понятно. Более интересен сам алгоритм поиска. Этот указатель не экспортируется ядром, поэтому посмотрим на начала IofCallDriver на разных ОС:

W7:

.text:0042EEE0 ; Exported entry 61. IofCallDriver
.text:0042EEE0
.text:0042EEE0 ; =============== S U B R O U T I N E =======================================
.text:0042EEE0
.text:0042EEE0 ; Attributes: bp-based frame
.text:0042EEE0
.text:0042EEE0 public IofCallDriver
.text:0042EEE0 IofCallDriver proc near ; CODE XREF: HalExamineMBR+8Cp
.text:0042EEE0 ; FsRtlGetVirtualDiskNestingLevel+A5p ...
.text:0042EEE0 mov edi, edi
.text:0042EEE2 push ebp
.text:0042EEE3 mov ebp, esp
.text:0042EEE5 push ecx
.text:0042EEE6 mov eax, ds:pIofCallDriver
.text:0042EEEB push esi
.text:0042EEEC mov esi, ecx
.text:0042EEEE xor ecx, ecx
.text:0042EEF0 cmp eax, ecx
.text:0042EEF2 jz short loc_42EEFD
.text:0042EEF4 push dword ptr [ebp+4]
.text:0042EEF7 mov ecx, esi
.text:0042EEF9 call eax ; pIofCallDriver
.text:0042EEFB jmp short loc_42EF44
.text:0042EEFD ; ---------------------------------------------------------------------------
.text:0042EEFD
.text:0042EEFD loc_42EEFD: ; CODE XREF: IofCallDriver+12j
.text:0042EEFD dec byte ptr [edx+23h]
.text:0042EF00 cmp [edx+23h], cl
.text:0042EF03 jg short loc_42EF11
.text:0042EF05 push ecx ; BugCheckParameter4
.text:0042EF06 push ecx ; BugCheckParameter3
.text:0042EF07 push ecx ; BugCheckParameter2
.text:0042EF08 push edx ; BugCheckParameter1
.text:0042EF09 push 35h ; BugCheckCode
.text:0042EF0B call KeBugCheckEx
.text:0042EF10 int 3 ; Trap to Debugger
.text:0042EF11
.text:0042EF11 loc_42EF11: ; CODE XREF: IofCallDriver+23j
.text:0042EF11 mov eax, [edx+60h]
.text:0042EF14 sub eax, 24h
.text:0042EF17 mov [edx+60h], eax
.text:0042EF1A mov cl, [eax]
.text:0042EF1C mov [eax+14h], esi
.text:0042EF1F cmp cl, 16h
.text:0042EF22 jnz short loc_42EF38
.text:0042EF24 mov al, [eax+1]
.text:0042EF27 cmp al, 2
.text:0042EF29 jz short loc_42EF2F
.text:0042EF2B cmp al, 3
.text:0042EF2D jnz short loc_42EF38
.text:0042EF2F
.text:0042EF2F loc_42EF2F: ; CODE XREF: IofCallDriver+49j
.text:0042EF2F mov esi, edx
.text:0042EF31 call sub_416EC2
.text:0042EF36 jmp short loc_42EF44
.text:0042EF38 ; ---------------------------------------------------------------------------
.text:0042EF38
.text:0042EF38 loc_42EF38: ; CODE XREF: IofCallDriver+42j
.text:0042EF38 ; IofCallDriver+4Dj
.text:0042EF38 mov eax, [esi+8]
.text:0042EF3B push edx
.text:0042EF3C movzx ecx, cl
.text:0042EF3F push esi
.text:0042EF40 call dword ptr [eax+ecx*4+38h]
.text:0042EF44
.text:0042EF44 loc_42EF44: ; CODE XREF: IofCallDriver+1Bj
.text:0042EF44 ; IofCallDriver+56j
.text:0042EF44 pop esi
.text:0042EF45 pop ecx
.text:0042EF46 pop ebp
.text:0042EF47 retn
.text:0042EF47 IofCallDriver endp


XPSP3:

.text:0040A397 ; Exported entry 42. IofCallDriver
.text:0040A397
.text:0040A397 ; =============== S U B R O U T I N E =======================================
.text:0040A397
.text:0040A397 ; Attributes: thunk
.text:0040A397
.text:0040A397 public IofCallDriver
.text:0040A397 IofCallDriver proc near ; CODE XREF: sub_4208DC+9Dp
.text:0040A397 ; sub_4301F6+47p ...
.text:0040A397 jmp ds:pIofCallDriver
.text:0040A397 IofCallDriver endp


2003R2:

.text:00428E9B ; Exported entry 60. IofCallDriver
.text:00428E9B
.text:00428E9B ; =============== S U B R O U T I N E =======================================
.text:00428E9B
.text:00428E9B ; Attributes: bp-based frame
.text:00428E9B
.text:00428E9B public IofCallDriver
.text:00428E9B IofCallDriver proc near ; CODE XREF: HalExamineMBR+8Cp
.text:00428E9B ; IoPageRead+B5p ...
.text:00428E9B
.text:00428E9B ; FUNCTION CHUNK AT .text:00453844 SIZE 00000016 BYTES
.text:00428E9B
.text:00428E9B mov edi, edi
.text:00428E9D push ebp
.text:00428E9E mov ebp, esp
.text:00428EA0 mov eax, ds:pIofCallDriver
.text:00428EA5 test eax, eax
.text:00428EA7 jnz loc_453844
.text:00428EAD dec byte ptr [edx+23h]
.text:00428EB0 cmp byte ptr [edx+23h], 0
.text:00428EB4 jle loc_45384B
.text:00428EBA mov eax, [edx+60h]
.text:00428EBD sub eax, 24h
.text:00428EC0 push esi
.text:00428EC1 mov [edx+60h], eax
.text:00428EC4 mov [eax+14h], ecx
.text:00428EC7 movzx eax, byte ptr [eax]
.text:00428ECA mov esi, [ecx+8]
.text:00428ECD push edx
.text:00428ECE push ecx
.text:00428ECF call dword ptr [esi+eax*4+38h]
.text:00428ED3 pop esi
.text:00428ED4 pop ebp
.text:00428ED5 retn
.text:00428ED5 IofCallDriver endp ; sp-analysis failed
...
.text:00453844
.text:00453844 loc_453844: ; CODE XREF: IofCallDriver+Cj
.text:00453844 push dword ptr [ebp+4]
.text:00453847 call eax ; pIofCallDriver
.text:00453849 pop ebp
.text:0045384A retn


Логично произвести поиск по релоку в ntoskrnl.exe (предварительно загрузив его с диска, имя ядра получается через ZwQuerySystemInformation(SystemModuleInformation, системная папка, например, есть в USER_SHARED_DATA), Далее ищем глобальную переменную в range (не помню русское слово) от IofCallDriver до $+0x20 байт. Это и будет оно :)
4 комментария      

ssh

Полезная информация для тех кто пользуется ssh туннелями. Иногда случается видеть такую надпись при коннекте к серверу (не будем уточнять к чьему):

Using username "xxx".
Last login: Xxx Xxx xx xx:xx:xx xxx from xxx
Shell access is not enabled on your account!
If you need shell access please contact support.

Кажется что сервер потерян, но посмотрев в netstat -an можно заметить что порт с туннелем забиндился, главное теперь установить на него соединение и оно будет висеть сколько надо. Have fun :)


Комментарии: 0      

Putty

Для тех кого бесит что пути постоянно висит в таскбаре есть перекомпиленая версия с функцией сворачивания в трей. URL: http://haanstra.eu/putty
Комментарии: 0      

Реали жизни.

6 комментариев      

Стиль комментариев.

Многим известно, что есть удобная форма расстановки комментариев в коде под названием JAVADOC. Но по дефолту VisualAssist не содержит этого шаблона в базе. Чтобы пофиксить недоразумение идём в VisualAssistX->Options->Advanced->Suggestions->Edit VA Snippets. Ищем /** и меняем содержимое на:

/**
* $end$
*
*/

Профит на лицо.
2 комментария      

One more usermode BSOD

Работает только под админом,

1. Вызываем RtlSetProcessIsCritical(TRUE, 0, 0)
2. Завершаем процесс.
3. ???
4, Profit!

5 комментариев      

Обновление букмарков.

Отличный сайт с либой для криптографии: http://www.polarssl.org
Блог barton: http://b4.cih.ms
Блог Great: http://gr8.cih.ms
Комментарии: 0      
3 2 1