注册
 找回密码
 注册
江西广告网
查看: 276|回复: 0
打印 上一主题 下一主题

Windows CE初探

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2008-12-14 11:26:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
<br>  从Platform Builder来看,Windows CE支持相当多CPU,但现在市场上实际销售的PDA几乎全部采用ARM芯片。arm是一个RISC构架的32位微处理器,它一次有16个可见的寄存器:r0-r15。其中r0-r7是通用寄存器并可以做任何目的;r8-r12也是通用寄存器,但是在切换到FIQ模式的时候,使用它们的影子(shadow)寄存器;最后这三个是特殊寄存器:<br>  <br>  r13 (sp)   - 堆栈指针<br>  r14 (lr)   - 链接寄存器<br>  r15 (pc/psr) - 程序计数器/状态寄存器<br>  <br>  IDAPro和调试器里都是用别名表示。和其它RISC指令类似,arm指令主要有分支(branch)指令、载入和存储指令和其它指令等,除了载入和存储指令,其它指令都是不能直接操作内存的,而且载入和存储指令操作的是4字节类型,那么内存地址必须要求4字节对齐,这也是RISC指令和CISC指令差异比较大的地方,在操作字符串的时候相对就比较麻烦。arm指令一个很有趣的地方就是可以直接修改访问pc寄存器,这样如果写shellcode的话就不必象SPARC或PowerPC一样需要多条指令来定位自身。<br>  <br>  另外Windows CE默认使用的字节序是little-endian。<br>  <br>  --[ 2. Windows CE核心结构<br>  <br>  Windows CE是一个32位的操作系统,所以其虚拟内存的大小是4GB(2的32次方)。Windows CE把这4GB虚拟内存空间分为低地址2GB和高地址2GB。应用程序使用的地址空间是低地址2GB,高地址2GB专供Windows CE内核使用。在Windows CE 3.0源码的PRIVATE/WINCEOS/COREOS/NK/INC/nkarm.h头文件里有一些有趣的信息:<br>  <br>  /* High memory layout<br>  *<br>  * This structure is mapped in at the end of the 4GB virtual<br>  * address space.<br>  *<br>  * 0xFFFD0000 - first level page table (uncached) (2nd half is r/o)<br>  * 0xFFFD4000 - disabled for protection<br>  * 0xFFFE0000 - second level page tables (uncached)<br>  * 0xFFFE4000 - disabled for protection<br>  * 0xFFFF0000 - exception vectors<br>  * 0xFFFF0400 - not used (r/o)<br>  * 0xFFFF1000 - disabled for protection<br>  * 0xFFFF2000 - r/o (physical overlaps with vectors)<br>  * 0xFFFF2400 - Interrupt stack (1k)<br>  * 0xFFFF2800 - r/o (physical overlaps with Abort stack & FIQ stack)<br>  * 0xFFFF3000 - disabled for protection<br>  * 0xFFFF4000 - r/o (physical memory overlaps with vectors & intr. stack & FIQ stack)<br>  * 0xFFFF4900 - Abort stack (2k - 256 bytes)<br>  *&n<br>  <br>  bsp; 0xFFFF5000 - disabled for protection<br>  * 0xFFFF6000 - r/o (physical memory overlaps with vectors & intr. stack)<br>  * 0xFFFF6800 - FIQ stack (256 bytes)<br>  * 0xFFFF6900 - r/o (physical memory overlaps with Abort stack)<br>  * 0xFFFF7000 - disabled<br>  * 0xFFFFC000 - kernel stack<br>  * 0xFFFFC800 - KDataStruct<br>  * 0xFFFFCC00 - disabled for protection (2nd level page table for 0xFFF00000)<br>  */<br>  <br>  typedef struct arm_HIGH {<br>  ulong  firstPT[4096];    // 0xFFFD0000: 1st level page table<br>  PAGETBL  aPT[16];      // 0xFFFD4000: 2nd level page tables<br>  char  reserved2[0x20000-0x4000-16*sizeof(PAGETBL)];<br>  <br>  char  exVectors[0x400];  // 0xFFFF0000: exception vectors<br>  char  reserved3[0x2400-0x400];<br>  <br>  char  intrStack[0x400];  // 0xFFFF2400: interrupt stack<br>  char  reserved4[0x4900-0x2800];<br>  <br>  char  abortStack[0x700];  // 0xFFFF4900: abort stack<br>  char  reserved5[0x6800-0x5000];<br>  <br>  char  fiqStack[0x100];  // 0xFFFF6800: FIQ stack<br>  char  reserved6[0xC000-0x6900];<br>  <br>  char  kStack[0x800];    // 0xFFFFC000: kernel stack<br>  struct KDataStruct kdata; &<br>  <br>  nbsp; // 0xFFFFC800: kernel data page<br>  } arm_HIGH;<br>  <br>  其中KDataStruct的结构非常重要而且有意思,有些类似Win32下的PEB结构,定义了系统各种重要的信息:<br>  <br>  struct KDataStruct {<br>  LPDWORD lpvTls;     /* 0x000 Current thread local storage pointer */<br>  HANDLE ahSys[NUM_SYS_HANDLES]; /* 0x004 If this moves, change kapi.h */<br>  // NUM_SYS_HANDLES == 32 : PUBLIC/COMMON/SDK/INC/kfuncs.h<br>  0x004 SH_WIN32<br>  0x008 SH_CURTHREAD<br>  0x00c SH_CURPROC<br>  0x010 SH_KWIN32<br>  0x044 SH_GDI<br>  0x048 SH_WMGR<br>  0x04c SH_WNET<br>  0x050 SH_COMM<br>  0x054 SH_FILESYS_APIS<br>  0x058 SH_SHELL<br>  0x05c SH_DEVMGR_APIS<br>  0x060 SH_TAPI<br>  0x064 SH_PATCHER<br>  0x06c SH_SERVICES<br>  <br>  char  bResched;    /* 0x084 reschedule flag */<br>  char  cNest;     /* 0x085 kernel exception nesting */<br>  char  bPowerOff;   /* 0x086 TRUE during "power off" processing */<br>  char  bProfileOn;&nb<br>  <br>  sp;  /* 0x087 TRUE if profiling enabled */<br>  ulong  unused;     /* 0x088 unused */<br>  ulong  rsvd2;     /* 0x08c was DiffMSec */<br>  PPROCESS pCurPrc;    /* 0x090 ptr to current PROCESS struct */<br>  PTHREAD pCurThd;    /* 0x094 ptr to current THREAD struct */<br>  DWORD  dwKCRes;    /* 0x098 */<br>  ulong  handleBase;   /* 0x09c handle table base address */<br>  PSECTION aSections[64]; /* 0x0a0 section table for virutal memory */<br>  LPEVENT alpeIntrEvents[SYSINTR_MAX_DEVICES];/* 0x1a0 */<br>  LPVOID alpvIntrData[SYSINTR_MAX_DEVICES]; /* 0x220 */<br>  ulong  pAPIReturn;   /* 0x2a0 direct API return address for kernel mode */<br>  uchar  *pMap;     /* 0x2a4 ptr to MemoryMap array */<br>  DWORD  dwInDebugger;  /* 0x2a8 !0 when in debugger */<br>  PTHREAD pCurFPUOwner;  /* 0x2ac current FPU owner */<br>  PPROCESS pCpuASIDPrc;  /* 0x2b0 current ASID proc */<br>  long  nMemForPT;   /* 0x2b4 - Memory used for PageTables */<br>  <br>  long  alPad[18];   /* 0x2b8 - padding */<br>  <br>  DWORD  aInfo[32];   /* 0x300 - misc. kernel info */<br>  // PUBLIC/COMMON/OAK/INC/pkfuncs.h<br>  0x300 KINX_PROCARRAY   address of process array<br>  0x304 KINX_PAGESIZE   system page size<br>  0x308 KINX_PFN_SHIFT   shift for page # in PTE<br>  0x30c KINX_PFN_MASK   mask for page # in PTE<br>  0x310 KINX_PAGEFREE   # of free physical pages<br>  0x314 KINX_SYSPAGES   # of pages used by kernel<br>  0x318 KINX_KHEAP     ptr to kernel heap array<br>  0x31c KINX_SECTIONS   ptr to SectionTable array<br>  0x320 KINX_MEMINFO    ptr to system MemoryInfo struct<br>  0x324 KINX_MODULES    ptr to module list<br>  0x328 KINX_DLL_LOW    lower bound of DLL shared space<br>  0x32c KINX_NUMPAGES   total # of RAM pages<br>  0x330 KINX_PTOC  &nb<br>  sp;   ptr to ROM table of contents<br>  0x334 KINX_KDATA_ADDR  kernel mode version of KData<br>  0x338 KINX_GWESHEAPINFO Current amount of gwes heap in use<br>  0x33c KINX_TIMEZONEBIAS Fast timezone bias info<br>  0x340 KINX_PENDEVENTS  bit mask for pending interrupt events<br>  0x344 KINX_KERNRESERVE  number of kernel reserved pages<br>  0x348 KINX_API_MASK   bit mask for registered api sets<br>  0x34c KINX_NLS_CP    hiword OEM code page, loword ANSI code page<br>  0x350 KINX_NLS_SYSLOC  Default System locale<br>  0x354 KINX_NLS_USERLOC  Default User locale<br>  0x358 KINX_HEAP_WASTE  Kernel heap wasted space<br>  0x35c KINX_DEBUGGER   For use by debugger for protocol communication<br>  0x360 KINX_APISETS    APIset pointers<br>  0x364 KINX_MINPAGEFREE  water mark of the minimum number of free pages<br>  0x368 KINX_CELOGSTATUS  CeLog status flags<br>  0x36c KINX_NKSECTION   Address of NKSection<br>  0x370 KINX_PWR_EVTS   Events to be set after power on<br>  0x37c KINX_NKSIG     last entry of KINFO -- signature when NK is ready<br>  <br>  /* 0x380 - interlocked api code */<br>  /* 0x400 - end */<br>  }<br>  <br>  Win32下可以通过PEB结构定位kernel32.dll的基址,然后通过PE文件结构查找Windows API。在Windows CE下,coredll.dll的作用相当于Win32的kernel32.dll,由于KDataStruct结构开始于0xFFFFC800,偏移0x324的aInfo[KINX_MODULES]是一个指向模块链表的指针,通过这个链表能否找到coredll.dll模块呢?让我们来看一下模块的结构:<br>  <br>  // PRIVATE/WINCEOS/COREOS/NK/INC/kernel.h<br>  typedef struct Module { <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表