第三方二进制汇编代码在VC中的移植和应用

Dsp软件移植 Dsp软件移植 1. 编译平台差异 x86&vc:long 32位;ccs&dm642:long 40位,占用的存储空间是按照64位来计算的; vc&x86中定义了bool数据类型,占用8位;ccs7&dm642中没有,应该事先定义; ccs&dsp/BOIS系统中也定义适用于不同应用场合的数据类型预定义,在std.h和csl-stdinc.h中定义 2. endian问题 dm642:管脚TOU 阅读详情
作 者: shangzh
时 间: 2007-06-11,16:29
链 接: http://bbs.pediy.com/showthread.php?t=46163

二进制汇编代码在VC中的移植和应用

作者:老实和尚  coverlove@163.com

1、前言
对于没有源代码的开发库中提供的函数或者关键代码(一般是dll或者exe程序提供)。我们不能分析出其某个函数或者某段代码的实现细节,而又想在自己的工程中进行代码复用,这时我们比较直观的做法就是移植其汇编代码到我们的开发环境中。

  本文主要介绍在如何VC (Microsoft Visual C++ 6.0) 中内联汇编代码及其注意事项。主要涉及的工具有OLLYDBG(修改版本的OLLYICE功能更加强大)、Microsoft Visual C++ 6.0。


2、OLLYDBG简介
OllyDbg 是一种具有可视化界面的 32 位汇编-动态分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。

运行环境: 
OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操作系统中工作。

支持的处理器: 
OllyDbg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关的数据格式,但是不支持SSE2指令集。

配置: 
有多达百余个选项用来设置 OllyDbg 的外观和运行。

数据格式: 
OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、 16/32位有/无符号/HEX整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。


3、应用实例



1.jpg
 
  
  如上图有一个函数PcInfo.dll,里面导出了两个函数,RegistryCode 和IsValidCheckCode。通过OllyICE我们很容易找到这两个函数的实现过程。

2.jpg

第一个函数RegistryCode有三个参数,第一个压栈的是一个字符串的地址,第二个和第三个是一个整数,通过函数返回后对eax寄存器进行了检查可以断定函数带一个int型的返回值。
函数调用后没有进行堆栈的平衡说明这个函数是一个__stdcall方式调用的,堆栈平衡由被调用者平衡。调用方式确定后就可以还原函数原型如下:

int __stdcall RegistryCode(int a1,int a2,const char * key)

3.jpg
 
函数内部代码实现如上图,我们可以将汇编实现代码拷贝出来如下:

10002280 >  83EC 10         sub     esp, 10
10002283    8D4424 00       lea     eax, [esp]
10002287    56              push    esi
10002288    57              push    edi
10002289    33FF            xor     edi, edi
1000228B    57              push    edi
1000228C    50              push    eax
1000228D    57              push    edi
1000228E    68 3F000F00     push    0F003F
10002293    57              push    edi
10002294    57              push    edi
10002295    57              push    edi
10002296    68 44910010     push    10009144    ; ASCII "Software/abc/def"
1000229B    68 02000080     push    80000002
100022A0    FF15 00800010  call   [<&ADVAPI32.RegCreateKeyExA>]  ; ADVAPI32.RegCreateKeyExA
100022A6    85C0            test    eax, eax
100022A8    75 56           jnz     short 10002300
100022AA    8B7424 24       mov     esi, [esp+24]
100022AE    8B0D 88910010   mov     ecx, [10009188]
100022B4    8B15 8C910010   mov     edx, [1000918C]
100022BA    A1 90910010     mov     eax, [10009190]
100022BF    85F6            test    esi, esi
100022C1    894C24 0C       mov     [esp+C], ecx
100022C5    895424 10       mov     [esp+10], edx
100022C9    894424 14       mov     [esp+14], eax
100022CD    74 31           je      short 10002300
100022CF    56              push    esi
100022D0    FF15 24800010   call    [<&KERNEL32.lstrlenA>]     ; kernel32.lstrlenA
100022D6    40              inc     eax
100022D7    8D4C24 0C       lea     ecx, [esp+C]
100022DB    8B5424 08       mov     edx, [esp+8]
100022DF    50              push    eax
100022E0    56              push    esi
100022E1    6A 01           push    1
100022E3    57              push    edi
100022E4    51              push    ecx
100022E5    52              push    edx
100022E6    FF15 04800010   call  [<&ADVAPI32.RegSetValueExA>]  ; ADVAPI32.RegSetValueExA
100022EC    85C0            test    eax, eax
100022EE    75 05           jnz     short 100022F5
100022F0    BF 01000000     mov     edi, 1
100022F5    8B4424 08       mov     eax, [esp+8]
100022F9    50              push    eax
100022FA    FF15 08800010   call    [<&ADVAPI32.RegCloseKey>]  ; ADVAPI32.RegCloseKey
10002300    8BC7            mov     eax, edi
10002302    5F              pop     edi
10002303    5E              pop     esi
10002304    83C4 10         add     esp, 10
10002307    C2 0C00         retn    0C

有两种方法可以复用上面这段代码,第一种方法是把这段代码复制到一个汇编编译器中编译成object,然后在VC中链接这个外部函数,但是这种方法需要额外的编译器,使用起来比较复杂。本文主要介绍第二种方法,就是在VC编译器中复用这段汇编代码,然后直接编译调试。
在VC编译器中使用内联汇编,有两种方式:一种是在每一条指令前面加上__asm,另外一种方式比较适合大段汇编代码,就是使用__asm { } 包含汇编代码块。这个不改变变量作用域,只是一个指示符号,注意大部分伪汇编代码VC是不支持的。将以上汇编代码拷贝到VC的函数int __stdcall RegistryCode(int a1,int a2,const char * key)函数内部,这样一个简单函数初步实现了,但是还需要作一些调整。

VC内联外部汇编代码需要注意以下几个事项:
A.  代码的修正
拷贝出来的汇编代码需要进行初步处理才能移植到VC的函数中,上面的汇编代码中地址头需要全部删除掉(这个可以在UltraEdit的列模式中复制),对于代码中的常数全部要加上0x,因为Ollyice拷贝出来的都是16进制数,对应跳转指令可以用原来的标示符号,如jnz     short  100022F5,改成jnz     short  A100022F5,将地址前加上一个字符,否则VC对于这样的跳转会将数字理解成数字而认为是错误代码,而不会根据目标标签自动计算偏移量。

B.  堆栈的平衡
由于VC默认为函数生成了保护寄存器的代码,也就是进行了寄存器压栈操作,这样栈顶就可能改变,因此拷贝过来的汇编代码中基于栈顶取数据的地址就不对了,因为堆栈栈顶已经被VC默认保护堆栈的PUSH指令改变了。最简单的做法就是先平衡堆栈,也就是先弹出压栈的寄存器,这样拷贝过来的汇编代码在函数内部运行的环境就是干净的,无污染的,而VC在DEBUG模式和RELEASE模式为函数生成的保护寄存器的代码是不同的,需要分别处理来平衡堆栈。(注:如果不想VC生成保护寄存器的代码,可以加上关键字:__declspec( naked ),这样就不需要平衡堆栈了,可以连这一步都省了,但是了解编译器的一些行为对内联汇编的成功与否很重要)


C.  地址的处理
对于汇编代码中出现的地址,有些是字符或者整数数组的首地址,需要在全局或者局部建立字符串数组,然后替换成字符数组的地址。对于VC而言,指针类型的变量本身就是地址,因此在汇编代码中直接使用指针名称,而不需要LEA(或者OFFSET伪指令)来计算地址。


D.  函数调用的处理
对于汇编中使用到的函数需要加入其相应的Lib文件,对于Windows Api只需要加入Windows.h文件即可,这样VC才会为使用到的函数加入导入表和函数符号。对于外部DLL中的函数调用需要注意的是,必须使用间接寻址方式调用函数,而不能是立即数地址,也就是使用FirstThunk+RVA的方式来寻址,由PE加载器动态填充的地址代替实际地址,而FirstThunk+RVA的地址在编译过程中就可以惟一确定。对于静态连接的函数如printf等这些函数,则使用直接调用方式,调用地址是立即数。而编译器对于有些外部导出函数,采用一个call(立即数)+ jmp(间接寻址)方式实现。

具体实现过程:

添加需要使用的全局字符串,定义如下:

char *key1="Software//abc//def";
char *key2="InstallCode";

由于DEBUG模式VC默认为函数生成了保护寄存器的代码,总共对4个寄存器进行了保护,因此我们在函数的入口处平衡堆栈,代码如下:
__asm
    {
      pop edi

      pop esi

      pop ebx

      pop ebp
    }
如果是RELEASE模式,则只对3个寄存器进行了压栈保护,因此我们在函数的入口处平衡堆栈,两种模式可以合成写成如下的方式:

//还原堆栈,VC为函数默认生成了保护寄存器的代码

  #ifdef _DEBUG   //DEBUG模式和RELEASE模式生成的保护寄存器的代码不一样

    __asm
    {
      pop edi

      pop esi

      pop ebx

      pop ebp
    }

  #else 
    __asm
    {
      pop edi

      pop esi

      pop ebp
    }

  #endif

上面的一段代码,可以使用在函数前面加上__declspec( naked )的方法来替代。



移植的部分代码加到上面的代码后面即可,具体修改如下:

__asm
  {
    sub     esp, 0x10

    lea     eax, dword ptr [esp]

    push    esi
    push    edi
    xor     edi, edi
    push    edi
    push    eax
    push    edi
    push    0x0F003F
    push    edi
    push    edi
    push    edi

    push    key1   //如果是指针直接使用指针名称,否则使用lea eax, key1;  push eax方式

    push    0x80000002

    call dword ptr [RegCreateKeyExA] //此处不能使用call RegCreateKeyExA,只能进行间接寻址调用 

    test    eax, eax

    jnz     short  A10002300 //使用标签让VC自动计算偏移地址,不能使用纯数组标签

    mov     esi, dword ptr [esp+0x24]
    
    mov     eax, key2

    mov     ecx, [eax]

    mov     edx, [eax+4]

    mov     eax, [eax+8]

    test    esi, esi

    mov     dword ptr [esp+0x0C], ecx
    mov     dword ptr [esp+0x10], edx
    mov     dword ptr [esp+0x14], eax

    je      short  A10002300  //使用标签让VC自动计算偏移地址

    
    push    esi

    call dword ptr [lstrlenA]  //此处不能使用call lstrlenA,只能进行间接寻址调用
    
    inc     eax
    
    lea     ecx, dword ptr [esp+0x0C]

    mov     edx, dword ptr [esp+0x08]

    push    eax
    push    esi
    push    1
    push    edi
    push    ecx
    push    edx

    call dword ptr [RegSetValueExA]  //此处不能使用call RegSetValueExA,只能进行间接寻址调用
  
    
    test    eax, eax

    jnz     short  A100022F5

    mov     edi, 1

A100022F5:

    mov     eax, dword ptr [esp+0x08]
    push    eax

    call dword ptr [RegCloseKey]    //此处不能使用call RegCloseKey,只能进行间接寻址调用

A10002300:

    mov     eax, edi
    pop     edi
    pop     esi
    add     esp, 0x10
    
    retn    0x0c
  }


全部源代码如下:

// PCInfoAPI.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

#define PCInfoAPI_EXPORTS

#ifdef PCInfoAPI_EXPORTS

#define PCInfoAPI_API extern "C" __declspec(dllexport)
#else
#define PCInfoAPI_API __declspec(dllimport)
#endif

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
           )
{
    return TRUE;
}


char *key1="Software//abc//def";

char *key2="InstallCode";


PCInfoAPI_API  int __stdcall RegistryCode(int a1,int a2,const char * key)
{
  //还原堆栈,VC为函数默认生成了保护寄存器的代码

  #ifdef _DEBUG //DEBUG模式和RELEASE模式生成的保护寄存器的代码不一样

    __asm
    {
      pop edi

      pop esi

      pop ebx

      pop ebp
    }

  #else 
    __asm
    {
      pop edi

      pop esi

      pop ebp
    }

  #endif


  __asm
  {
    sub     esp, 0x10

    lea     eax, dword ptr [esp]

    push    esi
    push    edi
    xor     edi, edi
    push    edi
    push    eax
    push    edi
    push    0x0F003F
    push    edi
    push    edi
    push    edi

    push    key1        

    push    0x80000002

    call dword ptr [RegCreateKeyExA]

    test    eax, eax

    jnz     short A10002300

    mov     esi, dword ptr [esp+0x24]

    //mov     esi,  key
    
    mov     eax, key2

    mov     ecx, [eax]

    mov     edx, [eax+4]

    mov     eax, [eax+8]

    test    esi, esi

    mov     dword ptr [esp+0x0C], ecx
    mov     dword ptr [esp+0x10], edx
    mov     dword ptr [esp+0x14], eax

    je      short A10002300
    
    push    esi

    call dword ptr [lstrlenA]
    
    inc     eax
    
    lea     ecx, dword ptr [esp+0x0C]

    mov     edx, dword ptr [esp+0x08]

    push    eax
    push    esi
    push    1
    push    edi
    push    ecx
    push    edx

    call dword ptr [RegSetValueExA]    
    
    test    eax, eax

    jnz     short A100022F5

    mov     edi, 1

A100022F5:

    mov     eax, dword ptr [esp+0x08]
    push    eax

    call dword ptr [RegCloseKey]    

A10002300:

    mov     eax, edi
    pop     edi
    pop     esi
    add     esp, 0x10
    
    retn    0x0c
  }

}
ET199加密狗ETFS文件全流程制作包:含汇编启动代码、C读写逻辑、HEX/BIN转换工具与实操视频 专为嵌入式工程师准备的ET199加密狗ETFS虚拟文件开发支持包,覆盖从底层代码编写到最终烧录的完整环节。包含STARTUP.A51汇编启动文件、ET199.h及ET199_32.h头文件定义、read.c等C语言读写实现模块;提供WriteRead工程全套VC6.0项目文件(.dsw/.dsp/.clw),可直接编译调试或二次开发;配套hexbin.exe工具用于HEX与BIN格式互转,内置ET199.bin和ET199.hex固件镜像,以及test.etfs标准虚拟文件样本;附AVI格式实操教程视频,演 阅读详情

相关推荐

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 410

为什么机器码、汇编不可移植,而C语言可以移植?

为什么机器码、汇编不可移植,而C语言可以移植?

challenglistic的博客 1340

低速信号设计之 LPC 篇

摘要:LPC总线作为服务器低速信号设计的关键技术,在BIOS芯片连接、Super I/O芯片控制和嵌入式管理等方面发挥着重要作用。其采用33MHz时钟频率和4位并行传输机制,理论速率达16.5MB/s。设计时需重点关注布线长度(建议<10cm)、信号完整性(45°走线、合理层间隔离)和过孔优化等要点。典型应用案例表明,通过规范设计可确保在工业控制等复杂环境中稳定工作。LPC总线凭借低成本、低引脚数和良好兼容性,仍是服务器低速外设连接的重要解决方案。

qq_16237389的博客 1167

几种常用的保护应用程序的方法,编写成类库

几种常用的保护应用程序的方法 ( 作者:老实和尚  coverlove@163.com )1、前言  目前很多程序员都没有软件安全的意识,对自己辛辛苦苦的劳动成果不加保护,而这些缺乏保护意识的程序在日益强大的SoftIce, OllyDBG(OllyICE), W32DASM等工具面前显得如此脆弱,一个稍微有点经验的Cracker可能在几分钟之内就可以轻易的突破防线;有些程序员

2307

英特尔® NUC迷你电脑实现无人值守自动开机配置指南

本文详细介绍了如何配置英特尔® NUC迷你电脑实现无人值守自动开机功能。从BIOS设置到操作系统级配置,涵盖硬件兼容性确认、电源恢复功能设置及常见问题解决,帮助用户轻松实现设备断电后自动恢复运行,适用于家庭服务器、企业终端等多种场景。

weixin_42638178的博客 476

Android dex, odex, oat, vdex, art文件介绍

下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式

he980725866的博客 3621

汇编语言的移植性

汇编语言是一种针对具体机器的低级语言,这里说的不同机器一般来讲是指CPU指令系统不相兼容的两种机器,比如常用的8086与51,DSP,ARM,等等,他们的指令系统都不是通用的。自然移植到别的机器上不行,举个例子来说吧,假如51,的P0端口可以用来点亮一盏灯,但是对8086或者其他单片机就不一定了,有可能是P1或者其他口了你所写的汇编语言是针对8086CPU的,每台机子上的8086核心都是一样的,所

donglindonglin的博客 3216

【OpenAirInterface知识-3】OAI端到端部署之5G基站部署

在上一篇文章中已经完成了5G核心网的部署,本篇文章将介绍OAI 5G基站的部署过程。

起名字难上难的博客 3423

将二进制文件加入VC资源后释放执行

转自:https://www.leavesongs.com/C/vc-resource-exe.html 标题不知道这么说好不好,感觉很乱。     我以前就很纳闷,为什么我一个木马的客户端,能配置好各种选项以后生成一个服务端。一个exe文件怎么生出另一个exe文件?     一般的木马生成、木马释放都使用的这个方法,dll也可以加到资源中,这样我们的程序就可以免去包含很多乱七八

多学多思 3243

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成

本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。

weixin_28318011的博客 636

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 1006

第三方二进制汇编代码在VC中的移植和应用收藏

作者:老实和尚  coverlove@163.com1、前言对于没有源代码的开发库中提供的函数或者关键代码(一般是dll或者exe程序提供)。我们不能分析出其某个函数或者某段代码的实现细节,而又想在自己的工程中进行代码复用,这时我们比较直观的做法就是移植其汇编代码到我们的开发环境中。  本文主要介绍在如何VC (Microsoft Visual C++ 6.0) 中内联汇编代码

大浪淘沙的专栏 754

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

如何在VC中汇编,调用Nasm编写的函数

导读:   我们一般会使用汇编来编写程序中效率瓶颈部分, 而这又包括两种方法, 一是采用内联汇编, 这是十分简洁方便的一个方法, 我们可以不必考虑如寄存器保护, 函数参数退栈之类繁琐的问题, 但其缺点是可移植性不强, 影响代码风格等. 而另一个就是本文要讲的, VC链接纯汇编函数.好,言归正传, 我们开始   一,工具   1) VC++2003, 本文所讲的操作都是基于此版本.   2)

xu的blog 1955

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

在VC2008下将32位C++内嵌汇编迁移到64位

http://blog.sina.com.cn/s/blog_6296cebc0100fa5g.html 在VC2008下将32位C++内嵌汇编迁移到64位 ——东方射日—— 为什么要汇编? 现在正在做的一个项目,是关于高密度计算的,由于计算量很大,从性能考虑,除了算法的优化外,其中的的核心代码是用汇编写的,也许有人说,现在还有用汇编的吗?编译器的优化已

逐月 1177

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

将32位C++内嵌汇编迁移到64位

现在正在做的一个项目,是关于高密度计算的,由于计算量很大,从性能考虑,除了算法的优化外,其中的的核心代码是用汇编写的,也许有人说,现在还有用汇编的吗?编译器的优化已经很好了,性能已经非常接近于汇编了,有必要用汇编实现吗?呵呵,再好编译器的优化也没有人工优化好。是的,两者的性能相差不大,可是也有10%-20%的差距啊,尤其是作为核心代码,在一个典型过程中要执行400万到1000万次,那么性能相差是相

0li's Blog 5140

libmad库的移植

win mobile 5上面播放mp3似乎已经有了可以依赖于win mobile提供的multi-media播放器的调用方法。这种显而易见的方法,我认为缺少一些主动性,只能微软怎么做,咱就怎么做。如果想做出个性化的软件或者播放器,或者实现在线边下载边播放的方案就很困难了。对于从moto的linux移植到win mobile的5mbox而言,我更熟悉传统的一些的处理mp3文件的方案。     基本

wenchuan_swjtu的专栏 1540

f77编程和c语言的区别,在fortran中l用F77编译器编译程序时出现问题?

高级语言、汇编语言、机器语言这三种语言统称“计算机语言”。其中,机器语言是最低级的,是一串一串的电流表示“0001101010010110010101000110”之类的数据,全部由0和1组成,这样的语言是机器语言,只有机器才能记住这样冗长而没规律的数据,所以,用机器语言来编程序几乎是不可能的。但要命令机器做一样事情,必须用机器语言,怎么办呢?于是,产生了汇编语言,汇编语言比机器语言简单一点,但还...

weixin_39963853的博客 322

用C++进行跨平台和可移植开发的注意事项

概述   今天聊聊C++的可移植性问题。如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列。即使你目前没有跨平台开发的需要,了解可移植性方面的知识对你还是很有帮助的。   C++的可移植性这个话题很大,包括了编译器、操作系统、硬件体系等很多方面,每一个方面都有很多内容。鉴于本人能力、精力都有限,只能介绍每一个方面最容易碰到的问题,供大伙儿参考。

System Architect 3956
上一篇: MS-07004分析和利用
下一篇: 关于文件系统设备堆栈的说明
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值