Showing posts with label diana-dasm. Show all posts
Showing posts with label diana-dasm. Show all posts

Monday, May 11, 2026

Orthia UI 1.1.0.10 released

 

Orthia UI 1.1.0.10 is here:

https://github.com/ligen-ua/diana-dasm/releases/tag/v1.1.0.10-ui 


PDB Symbol Support

Adds PDB symbol loading and integration throughout the disassembler, enabling symbol-aware navigation and analysis for Windows binaries.

New features

  • PDB symbol loading — integrates libpdb to parse .pdb files; supports recursive PDB search to locate symbol files automatically
  • External and module symbol layers — new orthia_external_symbols and orthia_module_symbols components manage symbol lifecycles and expose them to the analysis pipeline
  • Private symbol support in Goto dialog — the Goto dialog can now resolve private symbols, not just exports
  • Ctrl+X — new keyboard shortcut (XREF navigation)
  • .symfix command improvements — more robust symbol path fixing

Improvements

  • Symbol impact applied correctly during analysis (flags_analyzePrivateDone and related state)
  • File mode address/name resolution fixed (QueryAddressNameImpl, QueryNames)
  • Module flags handling corrected
  • Memory cache added to reduce repeated lookups
  • Default symbol search behavior improved
  • Duplicate entries eliminated on XREF update
  • Modules window shows symbol information

Fixes

  • Goto dialog layout fixed
  • File item handling fixed
  • PDB load error handling fixed
  • Linux build errors fixed

Demo GIF:

Tuesday, June 11, 2024

A Workaround for "Levels not implemented for this platform"

The Windows kernel people may be familiar with a cool built-in "pte" extension that can help you troubleshoot ugly BSODs by checking if some kernel memory address is inaccessible.


0: kd> !pte ffff8d89`cce3efe8 
                                           VA ffff8d89cce3efe8
PXE at FFFF91C8E47238D8    PPE at FFFF91C8E471B138    PDE at FFFF91C8E3627338    PTE at FFFF91C6C4E671F0
contains 0A0000021E002863  contains 0A00000002903863  contains 0A0000012845B863  contains 8A0000015AD4F963
pfn 21e002    ---DA--KWEV  pfn 2903      ---DA--KWEV  pfn 12845b    ---DA--KWEV  pfn 15ad4f    -G-DA--KW-V

0: kd> dt nt!_HARDWARE_PTE FFFF91C6C4E671F0
   +0x000 Valid            : 0y1
   +0x000 Write            : 0y1
   +0x000 Owner            : 0y0
   +0x000 WriteThrough     : 0y0
   +0x000 CacheDisable     : 0y0
   +0x000 Accessed         : 0y1
   +0x000 Dirty            : 0y1
   +0x000 LargePage        : 0y0
   +0x000 Global           : 0y1
   +0x000 CopyOnWrite      : 0y0
   +0x000 Prototype        : 0y0
   +0x000 reserved0        : 0y1
   +0x000 PageFrameNumber  : 0y000000000000000101011010110101001111 (0x15ad4f)
   +0x000 reserved1        : 0y0000
   +0x000 SoftwareWsIndex  : 0y00010100000 (0xa0)
   +0x000 NoExecute        : 0y1


Normally it shows PTE address among with other information, but unfortunately it has been broken for a quite some time (and his colleague vtop - too):


0: kd> !pte fffff807`1f8a7c58
Levels not implemented for this platform


And it doesn't look like MS is going to fix it anytime soon, see:

https://learn.microsoft.com/en-us/answers/questions/1010386/windbg-pte-command-levels-not-implemented-for-this?page=1#answer-1315958

https://github.com/microsoftfeedback/WinDbg-Feedback/issues/8


It's no problem if you have a single occasional BSOD, but if you really need to use this extension for a number of dumps in a row it's getting annoying.

Sooo, I decided to use my small and nice (and a little bit outdated) code emulator and emulate nt!MiGetPteAddress instead:


0: kd> .load c:\orthia\orthia.dll;!orthia.profile /f %temp%\test.db; !orthia.vm_vm_def
0: kd> !orthia.vm_vm_call 0 nt!MiGetPteAddress --print rcx=fffff807`1f8a7c58

Diana Error Code: DI_END
rax=fffff6fc038fc538 rbx=fffff8071b881180 rcx=0000007c038fc538
rdx=0000025800000000 rsi=0000000000000001 rdi=000000000000000d
rip=0000000000000000 rsp=fffff8071f8a7c58 rbp=ffff940947d3e040
r8=0000000000000018  r9=ffff9409476e0000 r10=000000000000000b
r11=0000000000009ee6 r12=0000000000000000 r13=fffff8071b881180
r14=0000000000000001 r15=ffffffffffffff00
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b  efl=00000282
Commands count: 6
Modified pages:
Done

0: kd> dt ntkrnlmp!_HARDWARE_PTE fffff6fc038fc538
 +0x000 Valid            : 0y1
 +0x000 Write            : 0y1
 +0x000 Owner            : 0y0
 +0x000 WriteThrough     : 0y0
   +0x000 CacheDisable     : 0y0
   +0x000 Accessed         : 0y1
 +0x000 Dirty            : 0y1
   +0x000 LargePage        : 0y0
 +0x000 Global           : 0y0
 +0x000 CopyOnWrite      : 0y0
 +0x000 Prototype        : 0y0
 +0x000 reserved0        : 0y1
 +0x000 PageFrameNumber  : 0y000000000000000000000110110010100111 (0x6ca7)
 +0x000 reserved1        : 0y0000
 +0x000 SoftwareWsIndex  : 0y00010010000 (0x90)
 +0x000 NoExecute        : 0y1

As you can see there were just 6 assembler instruction to emulate, so it handled them successfully.

The extension is here: https://github.com/ligen-ua/diana-dasm/releases/tag/v1.1-tools

The sources and this case study is there:

https://github.com/ligen-ua/diana-dasm?tab=readme-ov-file#pte-case-study


Saturday, January 6, 2018

Orthia Windbg Extension 2.0.0.193 released


 
Orthia Windbg Extension 2.0.0.193 Released
Latest version:
https://sourceforge.net/projects/diana-dasm/files/orthia-2.0.0.193.zip/download

1. New Major Feature added: Code Emulator


How to use: 
// load extension and setup profile
.load orthia.dll
!orthia.profile %temp%\test.db

// rewrite default VM (another way is to use vm_vm_new)
!orthia.vm_vm_def

// run the function and show the result
!orthia.vm_vm_call 0 nt!PsGetCurrentProcess --print 

See Wiki for the details:
https://sourceforge.net/p/diana-dasm/wiki/Orthia%20Windbg%20plugin/ 

2. Code Analyzer improved

1. Memory consumption reduced
2. Performance of analyzing improved



The latest sources: 
https://sourceforge.net/p/diana-dasm/code/HEAD/tree/trunk/src/
 

Monday, August 26, 2013

Orthia Windbg Plugin

Дошли руки дописать winbg-плагин который дает скромную возможность анализировать код прямо в windbg сессии.  Поскольку плагин базируется на библиотеке diana, я почему-то решил назвать его orthia.
Краткое описание возможностей доступно на sourceforge wiki
Примеры использования:
1) как настроить окружение. Orthia сохраняет всю информацию в sqlite базе данных на диске, перед работой с плагином нужно указать имя файла с помощью команды !orthia.profile.


2) как проанализировать все модули (не рекомендуется в kernel mode под живым коннекшном - может быть долго)
исполнительная система nt у меня  и так подгружается 2.5 минуты
3) пример команды !orthia.x - eXamine address

 

4) пример команды !orthia.xr - eXamine Range


5)  пример анализа связки nt + ntfs, часть I:

 6) пример анализа связки nt+ntfs, часть II:

Пути улучшения:
- конечно же багфикс. ну что за программа без багов;
- нужно бы слегка оптимизировать анализ по скорости;
- есть идея добавить GUI окно со стрелочками ala-IDA, если получится встроиться прямо в windbg.
Вообще, это все писалось строго для fun'а, но может быть кому-то быть полезным.

Sunday, December 23, 2012

Diana Dasm 1.0 released

Я рад сообщить, что бранч релизной версии Diana Disassembler поселился тут:
https://diana-dasm.svn.sourceforge.net/svnroot/diana-dasm/v1.0.0/src
В бранче как обычно дизассемблер и эмулятор:
  • дизассемблер поддерживает 490 команд (более 1100 опкодов)
  • эмулятор может эмулировать 131 команду 
  • как и раньше, все компоненты могут работать в kernel-mode, внутри движка только С, никаких внешних зависимостей, все работает на стримах



Новости ревизии:

[1.0.0-diana-win32-src] - 116 revision
+ improved database format
+ imporved performance
+ fixed mov r15, cr8 | 45 0F 20 C7 added cr8-15, dr8-15
+ fixes LOCK/REP prefixes in DianaProcessor
+ fixed specs for SYSENTER/SYSCALL
+ HINT_NOP tests
+ added hint_nop support and long nops with prefixes, added command ids
+ fixed SLDT/INVLPGA
+ added special flag for privileged instructions
+ added GETSECXGETBV/XSETBVEMMS/FEMMSXSAVE/XRSTOR
+ DianaProcessor: fixed prefix 0x67 for jmp/loop/call
+ added MASKMOVQ/MOVNTQfix PMOVMSKB/MASKMOVDQU/PEXTRW
+ added VMREAD/VMWRITE opcodes
+ added MFENCE/LFENCE/SFENCE/XRSTOR/CLFLUSH
Так же у каждой команды появился персистентный целочисленный идентификатор, рекомендуется к использованию вместо строкового идентификатора.

Friday, July 22, 2011

А тем временем на фронте дизассемблирования

Новости проекта Diana-Dasm:
1) на текущий момент поддерживается 438 команд (734 опкода): всяческие i386, amd64, fpu, sse, mmx и прочая, прочая, прочая;
2) доступна альфа версия виртуального процессора для i386. Вот этот кусок кода выводит 100 раз фразу hello, world:
#include "test_win32_common.h"

static char g_stack[1024*1024];
static void * g_oldESP = 0;

void __cdecl test_function()
{
for(int i = 0; i< 100; ++i)
std::cout<<"hello, world!";
}

void test_processor2()
{
// create processor
DianaWin32Processor proc;

TEST_ASSERT(DianaWin32Processor_Init(&proc)==DI_SUCCESS);

// load current thread context to the virtual processor
DianaProcessor * pCallContext = &proc.m_processor;
DianaProcessor_LoadLiveContext32(pCallContext);

// set new EIP
DI_JUMP_TO_RIP((OPERAND_SIZE)(void*)test_function);

// and new stack
SET_REG_RSP((OPERAND_SIZE)g_stack + sizeof(g_stack));

// push return code
OPERAND_SIZE exitOp = 0x87654321;
diana_internal_push(pCallContext, &exitOp);

// execute function!
for(int i = 0; ; ++i)
{
OPERAND_SIZE rip = GET_REG_RIP;
if (rip == exitOp)
break;

TEST_ASSERT(DianaProcessor_ExecOnce(pCallContext) == DI_SUCCESS);
}
}
_Winnie C++ Colorizer

Я страшно доволен
3) первоначальные принипы проекта все соблюдаются: только pure C, никаких требований к рантайму, все на стримах, все легко использовать в ядре, лицензия BSD

Monday, August 17, 2009

Diana Dasm

Дошли руки стартовать небольшой проект на sourceforge: Diana Disassembler.
Цель проекта - иметь под рукой максимально удобный, переносимый и быстрый инструмент для получения доступа к интересным частям ядра.
Важные для меня вкусности:
  • ядро написано на чистом C, никаких dll, OS-зависимых частей, минимальные требования к рантайму;
  • часть ядра сгенерирована автоматически из Intel'овской спецификации (в два этапа html->xml->diana_gen.c);
  • данные для дизассемблирования передаются через С-style streams;
  • код покрыт юнит тестами;
Недостатки:
  • маловато комментариев и документации;
  • пока нет поддержки x64;
  • 16 bit режим есть, но тестами пока не покрыт;
  • не поддерживаются всякие расширения: FPU, SIMD, MMX - не было необходимости, пока;
Код написан в свободное от основной работы время, и выложен под BSD лицензией, вдруг кому еще пригодится.
Пример использования:
/* TEST 1

8195e9d7 f00fb116 lock cmpxchg [esi],edx
81881dc5 c1e902 shr ecx,0x2
81881db0 f3a5 rep movsd
*/


unsigned char buf[] = {0xf0, 0x0f, 0xb1, 0x16,
0xc1, 0xe9, 0x02,
0xf3, 0xa5};


DianaParserResult result;
DianaGroupInfo * pGroupInfo = 0;
size_t cmdSize = 0;
int iRes = 0;

DianaContext context;
DianaMemoryStream stream;

Diana_InitContext(&context, DIANA_MODE32);

// init stream over memory
Diana_InitMemoryStream(&stream, buf, sizeof(buf));

iRes = Diana_ParseCmd(&context,
Diana_GetRootLine(), // all database
&stream.parent, // OOP in C :)
&result);
cmdSize = stream.curSize - context.iReadedSize;

TEST_ASSERT_IF(!iRes)
{
TEST_ASSERT(result.iLinkedOpCount==2);
TEST_ASSERT(result.pInfo->m_operandCount ==2);
TEST_ASSERT(pGroupInfo = Diana_GetGroupInfo(result.pInfo->m_lGroupId));
TEST_ASSERT(strcmp(pGroupInfo->m_pName, "cmpxchg")==0);
TEST_ASSERT(result.linkedOperands[0].type == diana_index);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.seg_reg == reg_DS);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.reg == reg_ESI);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.indexed_reg == reg_none);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.index == 0);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.dispSize == 0);
TEST_ASSERT(result.linkedOperands[0].value.rmIndex.dispValue == 0);

TEST_ASSERT(result.linkedOperands[1].type == diana_register);
TEST_ASSERT(result.linkedOperands[1].value.recognizedRegister == reg_EDX);

TEST_ASSERT(result.iPrefix == DI_PREFIX_LOCK);
}
_Winnie C++ Colorizer