第三方二进制汇编代码在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 阅读详情
作者:老实和尚  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格式实操教程视频,演 阅读详情

相关推荐

分别用VB、Delphi、VC++、ASM四种语言写的一个修改EXE文件图标的多源码示例

分别用VB、Delphi、VC++、ASM四种语言写的一个用UpdateResource修改EXE文件图标的多源码示例

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

第三方二进制汇编代码在VC中的移植和应用收藏 function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyit=window.open(http:

大浪淘沙的专栏 901

VB代码演示如何注入/操作汇编指令.rar

一个VB汇编CALL注入源码,演示如何操作汇编指令,使用此类不需要任何第三方软件支持,并且开源,内带两个实例,一个是网游诛仙CALL的注入,还有一个是演示如何操作汇编指令,汇编基础类里基本包含了常用的汇编指令,如果用户觉得不够可以使用OD等有汇编,功能的软件提取机械吗添加类内..   提示一下:   有些CALL使用ECX,EDX等寄存器来实现,类里可能没有,但是同类的EAX我绝对是加入的,如果使用EAX程序逻辑不会出现错误的话,请用EAX可以代替,一般都可以的.

dll文件的动态调用

dll文件动态调用时需要知道dll文件中的函数名字,生成dll文件后函数名字可能会变化(动态调用dll文件中的函数会失败,只有dll文件没有lib文件时,需要对dll文件进行动态调用才能使用dll文件中的函数。函数能够准确找到对应的导出函数。def文件通过右击源文件进行添加。运行结果如下,可以看出,能够正确调用subtruct函数进行计算。()返回值为0),这时候需要用def文件进行命名。这里导出两个函数add和subtruct。主函数中添加上述代码即可完成动态调用。def文件中给两个导出函数命名,确保。

weixin_44087011的博客 873

修改VB6的编译器C2.exe使它可以输出汇编代码

修改VB6的编译器C2.exe使它可以输出汇编代码;VB6.exe可以将cls模块、普通模块、窗体代码frm先生存汇编代码文件,然后再继续编译,但我们看不到这些代码,是因为编译器C2.exe隐藏或删除了,为了在VB6的程序里可以嵌入汇编代码或C代码,就要让C2.exe将这些汇编代码文件保留下来,修改其中嵌入的汇编代码或C代码,供汇编代码编译器如masm32等或C语言编译器cl.exe继续编译为obj文件,然后再链接成exe可执行文件或dll文件。 将这个程序生成的可执行文件命名为C2.exe,将VB6原来的C2.exe命名为C3.exe,再编译时就可生成汇编代码了。 这个程序事实上截留了VB6传给C2.exe的命令行参数,再调用原来的C2.exe而使得汇编代码保留下来

嵌入式调光控制库:轻量级软启/渐变/记忆逻辑实现

调光控制是智能照明系统的核心基础功能,涉及亮度调节、人机交互与电气安全多重需求。其底层原理依赖于对相位角或PWM占空比的精确时序控制,并需融合软启动、渐变过渡、状态记忆等工程化逻辑。这类轻量级调光行为逻辑层,不直接操作硬件寄存器,而是以确定性、无动态内存、可配置的方式封装用户意图到目标亮度值(0–100%)的映射过程,显著提升产品鲁棒性与跨平台复用能力。广泛应用于TRIAC交流调光、LED直流PWM驱动及DALI/Matter等智能照明协议网关中,尤其适合资源受限的Cortex-M系列MCU和FreeRTO

weixin_28949937的博客 579

InlineHook

计算偏移 = 自己创建的函数的地址 - 要Hook的函数地址 - 5,第一个字节为0xE9,构成无条件跳转指令。将前面构造的无条件跳转写入Hook函数地址处,大小为5字节,并保存之前的数据,以便修复。构建自己函数的时候一定要加上调用约定,否则新函数会默认使用C语言的调用约定,这回。加载函数所在的模块,获取要Hook的函数地址。导致在函数返回过程中,因堆栈不平衡而报错。根据要hook函数的原型创建自己的函数。修改目标页属性,是其可读可写可执行。

m0_46135508的博客 638

离线安装PlutoSDR硬件支持包全攻略:没有MathWorks账号也能搞定MATLAB集成

本文详细介绍了在没有MathWorks账号和网络环境的情况下,如何离线安装PlutoSDR硬件支持包并实现MATLAB集成的完整解决方案。从驱动安装、设备识别到MATLAB支持包的离线部署,提供了全面的步骤指导和常见问题排查方法,特别适合高校实验室、军工单位等内网环境使用。

js777的博客 269

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

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

xu的blog 1955

【AI Agent 实战】OpenClaw 全面解析 + 全平台一键部署教程(本地 AI 智能体)

本文收录于 AI 智能体 & 自动化实战系列,手把手带你从零部署本地可控的 AI 执行助手关键词:OpenClaw、AI Agent、本地 AI 部署、自动化助手、Docker 部署

爱人爱己,风生水起 8027

①Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

MS-A1-50X1系列作为MODBUS TCP通信的服务器进行动作。可通过MODBUS TCP 通信,将 MS-A1-50X1 系列产品通过 RS485 采集的仪器仪表之类的值作为通信数 据输出到 PLC,上位机等。

2401_89571741的博客 1399

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

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

逐月 1177

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

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

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

0li's Blog 5140

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 936

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1045

libmad库的移植

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

wenchuan_swjtu的专栏 1540

Allegro172版本DFM功能介绍

Allegro172版本提供了实时DFM检查的功能,让违反要求的地方实时以DRC的形式报出来,让加工不可加工因素在设计的时候同步避免。打开Constraint,选择Manufacturing, 所有DFM相关DRC都在这。把所有下面DRC开关(DFM,DFA,DFT)都选择on,选择OK。这个规则和物理和间距规则等等都没有关系,单独的一个加工规则。这些DRC大部分是正常的,正常的可以去修改规则来消除。等待DRC刷新,板子上会出现很多DRC,类似下图。下面介绍如何调用和产生DFM规则。一直往下点击next。

weixin_54787054的博客 1341

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

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

System Architect 3956

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

weixin_39963853的博客 322

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 代理上网相关代码收藏
下一篇: 程序的自我修改收藏
大浪淘沙1
博客等级 码龄19年 42粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值