【原创】LDR链调试手记

进程强杀探究 前言 我们知道在windows操作系统里面有ring0跟ring3的概念(ring1、ring2在windows中并未使用),因为ring0的特权级别是比ring3高的,那么我们肯定不能在ring3调用windows提供的api杀死ring0特权级别的进程,那么这时候我们就需要使用的ring0的函数来强行结束一些处于ring0级别的进程。 测试 我们首先打开PCHunter32.exe看一下,应用层是不能够访问的,我们知道可以在cmd里面使用taskkill命令来结束进程,但这种方式对ring0特权级别的程 阅读详情

LDR链调试手记

   无论是编写ShellCode还是外壳程序,都需要动态的获取各个api的实际地址,最通用的方法之一,莫过于通过得到各个DLL模块的基址,再遍历其导出表。其中,获得各个模块基址中,通过PEB结构来获取的方法尤为的精简和通用。这里是我之前调试和学习时碰到的一些问题的总结,于是就有了这一篇手记。

1.认识LDR链

  FS段寄存器作为选择子指向当前的活动线程的TEB结构(Thread Environment Block)注释。在TEB偏移的0x30处,就是指向PEB(Process Environment Block)注释② 的指针。而在PEB偏移的0x0c处是指向PEB_LDR_DATA结构的指针。PEB_LDR_DATA的结构如下:
  
typedef struct _PEB_LDR_DATA
{
 ULONG Length; // +0x00
 BOOLEAN Initialized; // +0x04
 PVOID SsHandle; // +0x08
 LIST_ENTRY InLoadOrderModuleList; // +0x0c
 LIST_ENTRY InMemoryOrderModuleList; // +0x14
 LIST_ENTRY InInitializationOrderModuleList;// +0x1c
} PEB_LDR_DATA,*PPEB_LDR_DATA; // +0x24

我们看到,在PEB_LDR_DATA结构中,又包含三个LIST_ENTRY结构体分别命名为:

InLoadOrderModuleList;                模块加载顺序
InMemoryOrderModuleList;              模块在内存中的顺序
InInitializationOrderModuleList;     模块初始化装载顺序

LIST_ENTRY其结构定义如下:

typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

微软是怎么解释LIST_ENTRY结构中成员作用的呢?来看看MSDN

The head of a doubly-linked list that contains the loaded modules for the process. Each item in the list is a pointer to an LDR_DATA_TABLE_ENTRY structure 

这个双链表指向进程装载的模块,结构中的每个指针,指向了一个LDR_DATA_TABLE_ENTRY 的结构:

我们来看看这个结构的定义:
typedef struct _LDR_DATA_TABLE_ENTRY
{
     LIST_ENTRY InLoadOrderLinks;
     LIST_ENTRY InMemoryOrderLinks;
     LIST_ENTRY InInitializationOrderLinks;
     PVOID DllBase;
     PVOID EntryPoint;
     ULONG SizeOfImage;
     UNICODE_STRING FullDllName;
     UNICODE_STRING BaseDllName;
     ULONG Flags;
     WORD LoadCount;
     WORD TlsIndex;
     union
     {
          LIST_ENTRY HashLinks;
          struct
          {
               PVOID SectionPointer;
               ULONG CheckSum;
          };
     };
     union
     {
          ULONG TimeDateStamp;
          PVOID LoadedImports;
     };
     _ACTIVATION_CONTEXT * EntryPointActivationContext;
     PVOID PatchInformation;
     LIST_ENTRY ForwarderLinks;
     LIST_ENTRY ServiceTagLinks;
     LIST_ENTRY StaticLinks;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
  可以根据上述的定义,画出一个直观寻址的示意图:
点击图片以查看大图

名称:	peb1[1].jpg
查看次数:	15
文件大小:	73.9 KB
ID:	66585

在定位到PEB_LDR_DATA 后,我们就可以根据之前介绍LDR_DATA_TABLE_ENTRY的结构,来定位每个模块的基址了。PEB_LDR_DATA地址知道了,那么,怎么根据它去找到LDR_DATA_TABLE_ENTRY呢?
前面提到过,PEB_LDR_DATA 中的三个LIST_ENTRY全部是双向链表结构,它的两个成员Flink,Blink都指向LDR_DATA_TABLE_ENTRY,那么,在真实的系统环境中,PEB_LDR_DATA 中的每一个LIST_ENTRY填充的是什么呢?与LDR_DATA_TABLE_ENTRY的关系又是怎么连接起来的呢?沐浴更衣,亮出神器windbg,一探究竟:

追本溯源,首先查看PEB结构:
0:000> !peb
PEB at 7ffd4000
    Ldr.InInitializationOrderModuleList:      00202988 . 00202cb0
    Ldr.InLoadOrderModuleList:            002028e8 . 00202db8
  Ldr.InMemoryOrderModuleList:         002028f0 . 00202dc0
于此同时也获得各个加载模块的基地址:
        400000 3db8972c Oct 25 08:58:20 2002 C:\Users\JoRrYChEn\Desktop\test.exe
       77130000 4ec49caf Nov 17 13:33:35 2011 C:\Windows\SYSTEM32\ntdll.dll
       76e00000 4e21132a J1ul 16 12:27:22 2011 C:\Windows\system32\kernel32.dll
       751b0000 4e21132b Jul 16 12:27:23 2011 C:\Windows\system32\KERNELBASE.dll   
我们看到,Ldr中有的三个List,根据MSDN规定LIST_ENTRY的结构,其中有两个成员:Flink和Blink,他们分别指向着一个LDR_DATA_TABLE_ENTRY 结构。各个LIST_ENTRY的第一个填充就是链表的Flink,指向下一个链表节点,第二个填充的是链表的Blink,指向前一个链表节点。那么根据windbg提供的PEB_LDR_DATA 中的三个LIST_ENTRY的Flink,来看看其填充的各项值:

InLoadOrderModuleList: Flink :00202988 . Blink:00202cb0
0:000> dd 002028e8
002028e8  00202978 7720788c 00202980 77207894
002028f8  00000000 00000000 00400000 0040720b

0:000> dd 00202978
00202978  00202ca0 002028e8 00202ca8 002028f0
00202988  00202dc8 7720789c 77130000 00000000

0:000> dd 00202ca0
00202ca0  00202db8 00202978 00202dc0 00202980
00202cb0  7720789c 00202dc8 76e00000 76e51065

0:000> dd 00202db8
00202db8  7720788c 00202ca0 77207894 00202ca8
00202dc8  00202cb0 00202988 751b0000 751b7afd

0:000> dd 7720788c
7720788c  002028e8 00202db8 002028f0 00202dc0
7720789c  00202988 00202cb0 00000000 00000000

     我们看到002028e8所在的模块地址是00400000,是原始模块加载基地址,它的Flink是00202978 ,所在的模块地址77130000 ,是ntdll.dll的加载基地址,它的Flink是00202ca0 ,所在的模块地址是76e00000 ,是kernel32.dll的加载基地址,它的Flink是00202db8 ,所在模块地址是751b0000,是KERNELBASE.dll的加载基地址。之后,便是一个循环,Flink又指向了002028e8。不难发现,这是个循环链表!

    同理,我们依此遍历InMemoryOrderModuleList 和 InInitializationOrderModuleList两条链:

Ldr.InMemoryOrderModuleList:
0:000> dd 002028f0
002028f0  00202980 77207894 00000000 00000000
00202900  00400000 0040720b 00008010 00460044

0:000> dd 00202980
00202980  00202ca8 002028f0 00202dc8 7720789c
00202990  77130000 00000000 0013c000 003c003a

0:000> dd 00202ca8
00202ca8  00202dc0 00202980 7720789c 00202dc8
00202cb8  76e00000 76e51065 000d4000 00420040

0:000> dd  00202dc0
00202dc0  77207894 00202ca8 00202cb0 00202988
00202dd0  751b0000 751b7afd 0004a000 00460044

0:000> dd 77207894
77207894  002028f0 00202dc0 00202988 00202cb0
772078a4  00000000 00000000 00000000 00000000


InInitializationOrderModuleList:
0:000>dd 00202988
00202988  00202dc8 7720789c 77130000 00000000

0:000> dd 00202dc8
00202dc8  00202cb0 00202988 751b0000 751b7afd

0:000> dd 00202cb0
00202cb0  7720789c 00202dc8 76e00000 76e51065

0:000> dd 7720789c
7720789c  00202988 00202cb0 00000000 00000000

    同InLoadOrderModuleList 一样,最终,这也是双向的循环链表结构。根据我们遍历出来的结构,我们可以画出如下的示意图(test文件为例):
点击图片以查看大图

名称:	peb.jpg
查看次数:	15
文件大小:	186.6 KB
ID:	66586

  不难发现,PEB_LDR_DATA给出的是三个List(InLoadOrderModuleList,InMemoryOrderModuleLis以及InInitializationOrderModuleList)模块加载首个基址,也可以看成是整个List双向链表的表头,然后通过这个双向循环链表的不断的遍历,来依此获取不同List加载的顺序。同时系统为每一个DLL维护的一个LDR_DATA_TABLE_ENTRY,该结构中,每一个DLL在不同List中,不但包含着着前继加载模块或者后继加载模块,还有着非常详细的各个加载模块的信息,包括加载基址和DLL名称等等。
   这样,我们可以关于之前根据PEB_LDR_DATA 后找到LDR_DATA_TABLE_ENTRY就非常的显而易见了:
点击图片以查看大图

名称:	peb3.jpg
查看次数:	11
文件大小:	118.8 KB
ID:	66587
  通过不断地遍历,读取其中的各项结构,至此,我们可以得出每一个List的在测试系统(win7,目标EXE文件 test)下加载的依此顺序:
  
  遍历 InInitializationOrderModuleList 得到次序:
  
        NTDLL.DLL-> KERNELBASE.DLL->KERNEK32.DLL->NULL

        遍历 InLoadOrderModuleList 得到次序

        TEST.EXE->NTDLL.DLL-> KERNEK32.DLL->KERNELBASE.DLL->NULL

  遍历 InMemoryOrderModuleList 得到次序
  
        TEST.EXE->NTDLL.DLL-> KERNEK32.DLL->KERNELBASE.DLL->NULL



  2.PEB_LDR_DATA链表的应用

  我们都知道,以前在xp下写shellcode,最通用获得kernel32基址代码:
   
   mov ebx, fs:[ 0x30 ]       // 获得PEB
   mov ebx, [ ebx + 0x0C ]    // 获得PEB_LDR_DATA
   mov ebx, [ ebx + 0x1C ]    // InitializationOrderModuleList 第一项
   mov ebx, [ ebx ]           // InitializationOrderModuleList 第二项
   mov ebx, [ ebx + 0x8 ]    // 获得完整的路径地址
   
  但是这段代码放到win7就不通用, 为什么?前三句没问题,首先是获得PEB基地址,然后在偏移0X0C处获得LDR,然后再取得LDR的偏移 0x1C处,获得InInitializationOrderModuleList加载的下一个模块基址,恰恰问题是出在第5句上,mov ebx,[ebx],此时,ebx中的值按照前面所述,应该是第二个LDR_DATA_TABLE_ENTRY,可是根据之前的观察,在win7的环境之下,InInitializationOrderModuleList第二个LDR_DATA_TABLE_ENTRY不是kernel32了,而是,KERNELBASE了(见图2),kernel32排到了第三个了。所以,若要获取win7下kernel32的基址,只需将之前的代码略加修改:
  
   mov ebx, fs:[ 0x30 ]       // 获得PEB
   mov ebx, [ ebx + 0x0C ]    // 获得PEB_LDR_DATA
   mov ebx, [ ebx + 0x1C ]    // InitializationOrderModuleList第一项
   mov ebx, [ ebx ]           // InitializationOrderModuleList第二项
   mov ebx, [ ebx ]           // InitializationOrderModuleList第三项
   mov ebx, [ ebx + 0x8 ]    // 获得完整的路径地址
  
当然,若要想写一个通用的shellcode,就必须先要判断系统版本号再根据情况来确定是取链的第二项还是第三项。除开现有的字符串查找方法,有木有一个更为快捷的方法呢?我们试着来探讨一下:

前辈们的经验告诉我们,winXp下,InitializationOrderModuleList 加载的DLL模块顺序是固定的,通过遍历其链,kernel32.dll必然是在第二位。但是在win7条件下,这个xp下固定的“第二位”就已经换成了KERNELBASE.DLL了。那么另外两条InMemoryOrderModuleList和 InLoadOrderModuleList是不是模块加载顺序也变了呢?是不是也能像类似于查找InitializationOrderModuleList顺序链的方式找到通用的加载顺序呢?

带着疑问,写一个遍历PEB.LDR.InLoadOrderModuleList程序验证一下:
Win2000+Sp4下:
名称:  2000[1].jpg
查看次数: 603
文件大小:  19.5 KB

winxp+sp3
名称:  xp[1].jpg
查看次数: 605
文件大小:  22.8 KB

win7
名称:  win7[1].jpg
查看次数: 601
文件大小:  31.9 KB

  结果不难发现,InLoadOrderModuleList在所有上述系统中,按照顺序:第一个是EXE模块本身的ImageBase,第二个是NTDLL.DLL,第三个是KERNEL32.DLL。这样,KERNEL32.DLL的顺序是不是又固定了呢?
  
  mov ebx, fs:[ 0x30 ]       // 获得PEB
  mov ebx, [ ebx + 0x0C ]    // 获得PEB_LDR_DATA
  mov ebx, [ ebx + 0x0C ]    // InLoadOrderModuleList第一项
  mov ebx, [ ebx ]           // InLoadOrderModuleList第二项
  mov ebx, [ ebx ]           // InLoadOrderModuleList第三项
  mov ebx, [ ebx + 0x18 ]    // 获得完整的路径地址,此时偏移0x18
  
  同理,InMemoryOrderModuleList也可以发现类似的规律。
  
  写完这篇手记之后,越觉得不对劲,这么浅显的方法为什么没有被拿来通用,google了一下,原来,早在09年,就有某牛总结出来了:
  http://blog.harmonysecurity.com/2009/06/retrieving-kernel32s-base-address.html
文章用到的是InMemoryOrderModuleList链,至于遍历这些链为什么没有成为通用的方法,很显然,作者在后面加上了如是说明:
Their appears to be some cases on Windows 2000 whereby the above method will not yield the correct result.
提到了在2000平台下,某些例子可能会得到错误的结果,最后提出来查找hash函数名的方法,这个和以前可以某些病毒在IAT里面找从kernel32.dll引入的函数,向上找“MZ”头方法很类似,同样也是依靠遍历LDR链,只不过比较的就是DllName了。详细的代码请参考上文连接:D。

注释:
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html 
注释②
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Process/PEB.html 

Ps:文章源起于小弟学习LDR链时想确切的知道PEB_LDR_DATA 中的每一个LIST_ENTRY与LDR_DATA_TABLE_ENTRY各个关系图示,可是网上却未能找到明确的资料,便自己拿起windbg进行学习。笔记写了有一段时间了,当时写的很零散,之后为了成文添加了示意图,加之中途又去武汉参加了笔试,改了又改来来回回两三个礼拜。小弟是菜鸟,水平很有限,加之很多结构资料都是未公开的,肯定有疏漏错误的地方,希望各位批评与指点。

 

逆向分析必备:从_LDR_DATA_TABLE_ENTRY结构看Windows内核模块的隐藏信息 本文深入探讨了Windows内核模块管理中的_LDR_DATA_TABLE_ENTRY结构,揭示了如何利用这一结构进行逆向分析和检测隐藏的内核模块。通过详细的代码示例和实战技巧,帮助开发者掌握驱动开发中的模块遍历技术,有效识别恶意Rootkit的隐藏行为。 阅读详情

相关推荐

x64驱动 遍历驱动模块

_LDR_DATA_TABLE_ENTRY(未导出) 以下是win10 1803(x64) 上的 _LDR_DATA_TABLE_ENTRY: lkd> dt _LDR_DATA_TABLE_ENTRY nt!_LDR_DATA_TABLE_ENTRY +0x000 InLoadOrderLinks : _LIST_ENTRY // 指向下一个 _LDR_DATA_TABLE_ENTRY 的 InLoadOrderLinks 成员 +0x010 InMemoryOrderL

LYSM 2901

_LDR_DATA_TABLE_ENTRY结构体

_LDR_DATA_TABLE_ENTRY结构体

weixin_41693985的博客 1711

Keil使用malloc异常进入hardfault调试故障手记

最近在做PID控温的应用,使用了自己写的菜单项目和位置式PID的相关扩展算法。效果还算满意。前几天调试程序的时候就发现在菜单定义页面的CPP文件内增加全局变量时,程序在第二级菜单项目选中时会进入hardfault,开始很纳闷,跟踪发现是malloc直接进入异常处理。由于懒,想了个变通的方法来解决了问题。那就是把全局变量想办法放到函数里,编程局部变量调用,实际上却是不进hardfault了。标记了下

gaoguanyixh的博客 5352

_LDR_DATA_TABLE_ENTRY 遍历

    #include "stdafx.h" #include <stdlib.h> #include <Windows.h> #include <Ntsecapi.h>    //for unicode_string typedef _LIST_ENTRY *PLIST_ENTRY; void ShowModuleInfo(PLIST_ENTR...

ndl1302732的专栏 1818

STM32F407+LWIP实战:NETCONN接口TCP服务器避坑指南(附正点原子例程解析)

本文深入解析了基于STM32F407和LWIP协议栈构建高响应TCP服务器的实战要点。针对使用NETCONN接口时常见的连接不稳定、数据延迟及内存泄漏等问题,提供了从NETCONN运行模型、服务器实现、参数优化到内存管理的全方位避坑指南,并结合正点原子例程,给出了具体的调试技巧与解决方案。

weixin_29188043的博客 402

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 425

LDR断链 隐藏DLL(转载)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 转载链接:https://blog.youkuaiyun.com/yoie01/article/details/11696295 typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumL...

menglv_1978的专栏 1389

[RK3568][Android11.0]Vold-DiskInfo:区分u盘和硬盘

测试平台 Platform: RK3568 OS: Android 11.0 需求描述 目前系统内部设备没有对硬盘(sata/usb移动硬盘)和u盘做区分,统一显示的为usb存储设备.目前有需求要在显示上有所区分。 解决方案 如何区分移动硬盘和U盘,见Android usb设备的检测及区分(sata硬盘、优盘及移动硬盘).主要就是检测removeable值,为0:硬盘,为1:u盘 解决补丁如下 From 572cf35c07f68c5cb5defe40c536dd9ad1b4648e Mon Sep 17

weixin_39966398的博客 1897

使用VMWare GDB和IDA调试Windows内核

近喜欢用IDA搞一些内核的东西,于是就到处找IDA关于内核方面的东东。这篇文章实在原文的基础上进行了一定的封装,也算是半原创的东东吧~希望大家不要拍砖撒~ VMWare的GDB调试器功能比较简单也比较基础,该调试器并不知道处理器和线程的任何信息(对于Windows系统),因而如果想要得到一些高等级的信息,我们需要自己做一些额外的工作。本文主要讲解了如何使用IDAPython脚本来让IDA处理已经加...

kingswb的博客 1685

从零到一:手把手教你用Python+LangChain搭建企业级RAG知识库(附避坑指南)

本文为开发者提供了一份详尽的实战指南,手把手教你使用Python和LangChain框架从零构建企业级RAG知识库。内容涵盖环境搭建、文档处理、向量化检索、提示工程及生产部署等核心环节,并重点分享了文档分割、检索优化等关键避坑经验,旨在帮助读者打造稳定、高效且易于维护的智能知识中枢。

weixin_29058331的博客 398

kubeadm init 运行时kebelet启动失败问题

解决k8s kubeadm init时遇到的kubelet问题

ZDPZN的博客 6073

对于HAL库的HardFault异常调试总结

一般就是这几种错误。

2401_87479848的博客 1249

python解析通达信dat与blk数据文件【附源码】

本文介绍了一个完整的通达信金融数据解析器项目,该项目攻克了通达信专有二进制文件格式解析的技术难题。项目采用模块化架构,从基础二进制解析到增强数据分类,最终实现智能语义化列名生成,形成完整的数据处理链路。核心技术包括自适应编码检测、智能数据类型推断和基于业务规则的语义化处理,解决了逆向工程、多编码兼容性等挑战。项目成果显著,解析成功率达100%,数据可读性大幅提升,开发效率提高50%,为量化交易、可视化分析等场景提供了可靠数据支持。该方案不仅具备技术创新性,更具有实际工程应用价值,为金融数据分析领域提供了可复

qq_36224726的博客 2687

drm android 工作原理,[原创]某DRM解密流程简单分析

环境及工具手机 :小米手机 MI 2A系统版本: Android 4.1.1工具 : IDA pro 6.6 、C32Asm 、VS2005帮朋友写了一个解密DRM视频的小软件,我把分析该播放器的调试步骤记录下来与大家一起学习,高手莫要见笑,仅供小菜玩乐,有不对或不足的地方还请多多指教,不胜感激!一:第一次打开加密视频会出现如下验证:输入用户名与密码登录成功后如下图点击...

weixin_34284072的博客 2395

排队论在食堂窗口规划中的应用:M/M/S模型优化案例

本文通过食堂窗口规划的真实案例,详细阐述了如何运用排队论中的M/M/S模型量化服务效率。文章从问题拆解、数据采集、模型计算到成本效益分析,提供了完整的数学建模实战指南,帮助读者掌握利用最优化方法解决资源配置问题的核心流程与工具。

docker7nomad的博客 1082

STM32G431的 FDCAN使用5M加速时,出现奇葩问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1635

重庆工商大学c语言实验一答案,重庆工商大学嵌入式实验考试题目答案 - 副本.doc...

您所在位置:网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbsp嵌入式开发重庆工商大学嵌入式实验考试题目答案 - 副本.doc22页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。2.该...

weixin_35426022的博客 350

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

STM32一直死在r1,[r0,#0x808]

转载 STM32一直死在r1,[r0,#0x808] ...

Tao_improvement的博客 1088

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【原创】VS2010 C++ Debug 出现 "SXS: RtlCreateActivati...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33697898的博客 173

ARM指令《ARM Architecture Reference Manual》和ARMv7-M Architecture Application Level Reference Manual不同

ARM指令《ARM Architecture Reference Manual》和ARMv7-M Architecture Application Level Reference Manual不同 0x00 本文目标 本文内容从《ARM Architecture Reference Manual》中截取翻译,可以看作是一个重点笔记集。仅记录博主认为有意思的部分,并加入一些个人理解。如果发现有不对的地方欢迎留言指正。 现代的智能手机是能进行ARM汇编级别交互的最便捷的设备,因此实例分析的内容基于博主的小.

二进制模----细微行动改变影响世界 3194

基于MDK创建纯汇编语言的STM32工程并观察最终生成 hex文件

1.新建工程 点击菜单栏project,点击New uVision Project,创建新的工程如图 设置文件路径及名称并保存。 2.配置环境 选择芯片STM32F103ZE CMSIS下选择CORE; Device下Startup,其中包含了启动文件; 鼠标右键Source Group1,选择Add New Item Group'Source Group 1' 选择 Asm File (.s) ,创建汇编文件; 设置源文件的名称; 点击保存; 3.代码调试 添加测试代码 A.

Liang55_55的博客 258

MDK创建纯汇编语言的STM32工程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、先在keil上创建一个工程二、使用步骤1.引入库2.读入数据总结 前言 MDK(Microcontroller Development Kit),也称MDK-ARM、KEIL MDK、RealView MDK、KEIL For ARM,都是同一个东西。ARM公司现在统一使用MDK-ARM的称呼,MDK的设备数据库中有很多厂商的芯片,是专为微控制器开发的工具,为满足基于MCU进行嵌入式软件开发的工程师需求而设计,支持ARM7

weixin_57517458的博客 312

ADS semihosting与硬件重定向

++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.youkuaiyun.com/mr_raptor/article/details/6556324 ++++++++++++++++++++++++++++++++++++++++++   应用程序在执行过程中经常会和主机有IO交互请求,例

mr_raptor的专栏 3097
上一篇: 『原创』调戏 SkinSharp
下一篇: 为OllyDbg增添“内存硬件条件断点”功能(1)
OSReact
博客等级 码龄14年 34粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值