局部变量,全局变量与内存
本文会使用IDA分析局部变量,全局变量在内存的存储
目录
使用IDA分析局部变量
使用IDA分析全局变量
总结
使用IDA分析局部变量
#include <stdio.h>int main()
{int nNum = 1;float fNum = 2.5;char ch = 'A';printf("int %d, float %f, char %c", nNum, fNum, ch);return 0;
}
使用IDA跟进到main函数,F5调出反汇编
摁下tab键,进入汇编界面,Rename函数名为main
Rename函数名为main
CODE XREF: 当前函数被一个或多个地方引用,摁下CTRL+X可以查看调用main()的地方
局部变量汇编分析
.text:00411760 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00411760 main proc near ; CODE XREF: j_main↑j
.text:00411760
.text:00411760 var_FC = qword ptr -0FCh
.text:00411760 var_24 = byte ptr -24h
.text:00411760 var_1D = byte ptr -1Dh
.text:00411760 var_14 = dword ptr -14h
.text:00411760 var_8 = dword ptr -8
.text:00411760 argc = dword ptr 8
.text:00411760 argv = dword ptr 0Ch
.text:00411760 envp = dword ptr 10h
.text:00411760
.text:00411760 push ebp ; 把调用者函数的EBP压入堆栈
.text:00411761 mov ebp, esp ; 开辟栈帧
.text:00411763 sub esp, 0E4h ; 开辟函数局部变量空间
.text:00411769 push ebx ; 保存易失性寄存器
.text:0041176A push esi
.text:0041176B push edi
.text:0041176C lea edi, [ebp+var_24] ; ebp+var_24 <==> ebp-24h lea取局部变量地址到edi EDI = EBP-36 36个字节要初始化作为局部变量的空间
.text:0041176F mov ecx, 9
.text:00411774 mov eax, 0CCCCCCCCh
.text:00411779 rep stosd
.text:0041177B mov ecx, offset unk_41C003
.text:00411780 call sub_41130C ; CheckForDebuggerJustMyCode VS系统函数
.text:00411785 mov [ebp+var_8], 1 ; int nNum = 1
.text:0041178C movss xmm0, ds:dword_417BE8 ; xmm0寄存器用于处理浮点数,2.5存入寄存器
.text:00411794 movss [ebp+var_14], xmm0 ; float fNum = 2.5
.text:00411799 mov [ebp+var_1D], 41h ; char ch ='A'
.text:0041179D movsx eax, [ebp+var_1D] ; 把ch扩展为4个字节,为压栈做准备
.text:004117A1 push eax ; ch压栈
.text:004117A2 cvtss2sd xmm0, [ebp+var_14] ; float拓展为double
.text:004117A7 sub esp, 8 ; 开辟堆栈空间
.text:004117AA movsd [esp+0FCh+var_FC], xmm0 ; double入栈
.text:004117AF mov ecx, [ebp+var_8]
.text:004117B2 push ecx ; 把nNum的值保存到ecx后入栈
.text:004117B3 push offset aIntDFloatFChar ; 格式化字符串后入栈 offset取地址4个字节大小
.text:004117B8 call sub_4113A2 ; 调用printf函数
.text:004117BD add esp, 14h ; 平衡堆栈
.text:004117C0 xor eax, eax ; 把eax清0,等价于 return 0
.text:004117C2 pop edi ; 恢复易失性寄存器
.text:004117C3 pop esi
.text:004117C4 pop ebx
.text:004117C5 add esp, 0E4h ; 清理main函数开辟的局部变量空间
.text:004117CB cmp ebp, esp
.text:004117CD call sub_411230 ; CheckEsp() 用于在程序的运行时检查堆栈指针是否被篡改
.text:004117D2 mov esp, ebp ; 恢复栈帧
.text:004117D4 pop ebp
.text:004117D5 retn ; 将程序的控制流转移到调用它的指令的下一条指令
.text:004117D5 main endp
main函数主体堆栈,堆栈存储的是函数的局部变量,函数参数
- push EBP EBP存储当前函数的栈底地址,调用者函数栈底地址压入堆栈
- mov EBP,ESP 开辟栈帧
- sub esp, 0xXXX 为函数局部变量开辟空间
- push ebx,esi,edi 保存易失性寄存器
- 为局部变量空间堆栈初始化为0xCC
- 如果main函数有新的局部变量或者调用函数,都会引发堆栈变化
- main函数执行完毕开始恢复堆栈
- pop 寄存器 恢复易失性寄存器
- add esp,0xXX 恢复局部变量的空间
- mov esp,ebp ESP=EBP=函数调用者的栈底地址
- pop ebp 恢复原先的栈底
- retn 将执行main后下一条汇编指令地址给EIP寄存器,恢复程序控制流转,也恢复了原先的栈顶
一些细节:
rep stosd:完成对局部变量的初始化
.text:00411769 push ebx ; 保存易失性寄存器
.text:0041176A push esi
.text:0041176B push edi
.text:0041176C lea edi, [ebp+var_24] ; ebp+var_24 <==> ebp-24h lea取局部变量地址到edi
.text:0041176F mov ecx, 9
.text:00411774 mov eax, 0CCCCCCCCh
.text:00411779 rep stosd ; 把9个栈空间初始化为0xCC
汇编:
- rep 重复操作,重复操作的次数是ecx的值
- stosd:把EAX值复制到EDI寄存器指向的地址,一次复制4个字节
- stosw:把EAX值复制到EDI寄存器指向的地址,一个复制2个字节
- stosb:把EAX值复制到EDI寄存器指向的地址,一次复制1个字节
之前的操作中,保存易失性寄存器,每个寄存器8个字节,共计24字节
lea edi, [ebp+var_24] ; ebp+var_24 <==> ebp-24h edi寄存器指向main函数局部变量空间的尾地址
下面代码,给局部变量空间初始化
000F176F B9 09 00 00 00 mov ecx,9
000F1774 B8 CC CC CC CC mov eax,0CCCCCCCCh
000F1779 F3 AB rep stos dword ptr es:[edi]
"rep stos dword ptr es:[edi]" 的执行步骤如下:
- 使用ES:EDI指定目标内存区域的起始地址。
- 使用ECX指定要重复执行的次数。
- 将EAX中的值作为DWORD数据写入ES:[EDI]指向的内存位置,然后根据DF(方向标志位)决定EDI是递增还是递减,以定位下一个内存位置。
- 重复步骤3,直到ECX达到零,或根据DF决定的方向不再满足条件。
因此,"rep stos dword ptr es:[edi]" 指令将会将EAX寄存器中的DWORD数据连续地写入以ES:[EDI]为起点的目标内存区域,并且重复执行次数由ECX指定。这通常用于快速地内存初始化或者进行内存拷贝操作。
但是在64位下,不再使用ES:EDI模式寻址,64位模式下采用了平坦模型(Flat Model),所有线性地址都直接映射到相同的物理地址空间,即,你可以直接使用RDI寄存器作为指针来操作内存地址,而无需使用ES寄存器进行段寻址。
在x64dbg下验证
DF(Direction Flag)是x86处理器的一个标志位,用于指示字符串操作的方向。
当DF标志位被设置为0时,字符串操作是从低地址向高地址进行的,也就是正向(forward)操作。例如,使用REP MOVS指令将数据从源内存区域复制到目标内存区域时,数据会按照从源地址递增到目标地址的顺序进行复制。
当DF标志位被设置为1时,字符串操作是从高地址向低地址进行的,也就是反向(backward)操作。例如,使用REP MOVS指令将数据从目标内存区域复制到源内存区域时,数据会按照从源地址递减到目标地址的顺序进行复制。
得以验证在64位下,直接可以通过EDI寻址操作,不再使用ES:EDI寻址
为什么要每个字节初始化为0xCC
0xCC表示int33异常 0xCC指令是软中断指令,它会导致CPU进入一个中断处理例程。如果程序在调用函数时忘记初始化局部变量,那么在访问这些未初始化的变量时,CPU会立即进入一个中断处理例程,程序会停止运行,并且IDE或调试器会提示有异常产生。
这个地址存储的是浮点数
可以在Edit-->Operand type,选择合适的数据类型,正确的话,就会把16进制数据转换为对应的值。选择floatinteresting point
常见的操作数大小指定符号:
byte ptr
:指定一个数据操作数为8位字节(byte)。word ptr
:指定一个数据操作数为16位字(word)。- dword ptr:指定一个数据操作数为32位字 (dword)
mmword ptr
是一个指示符,指示使用 64 位内存操作。
下面这两句代码在不同的工具中解析虽然不同,但意思一样。估计IDA 7.0 解析时是按照x86,而VS2019是按照x64,x64中已经不使用DS:EDI寻址了
VS2019: movss xmm0,dword ptr [__real@40200000 (0AF7BE8h)]
IDA: movss xmm0, ds:dword_417BE8
dword ptr [__real@40200000 (0AF7BE8h)] = ds:dword_417BE8 都表示以后面地址为首,取四个字节的数据
xmm0
是 XMM 寄存器中的第一个寄存器- 在 x86 指令集中,有 8 个 xmm 寄存器(xmm0~xmm7),每个寄存器的大小为 128 位(16 字节)
- movss:将一个单精度浮点数(32 位)从源操作数移动到目标操作数。
- movsx:将源操作数进行符号扩展后移动到目标操作数,源:8位,目标:16位,从低位存,高 8 位设置为源操作数的符号位,不改变大小,拓展位数 默认情况下,内存操作数被假定为 32 位的双字(DWORD)数据类型。
- cvtss2sd:将单精度浮点数(4)转换为双精度浮点数(8)
- xor:用于执行两个二进制数按位异或操作。当两个对应位的值不同时,结果位为 1,否则为 0。
cmp指令:用于比较两个操作数的大小关系,并根据比较结果设置标志位。cmp
指令会将 operand1
减去 operand2
的值,并根据结果设置标志位寄存器(如零标志位、符号标志位等)。
- 零标志位(ZF):如果两个操作数相等,则 ZF 被设置为 1;否则被设置为 0。
- 符号标志位(SF):如果结果为负数,则 SF 被设置为 1;否则被设置为 0。
- 位标志位(CF):用于无符号数比较,如果
operand1
小于operand2
,则 CF 被设置为 1;否则被设置为 0。
使用IDA分析全局变量
#include <stdio.h>int nNum = 1;
float fNum = 2.5;
char ch = 'A';int main()
{printf("int %d, float %f, char %c", nNum, fNum, ch);return 0;
}
局部变量汇编分析
.text:00411760 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00411760 main proc near ; CODE XREF: j_main↑j
.text:00411760
.text:00411760 var_D8 = qword ptr -0D8h
.text:00411760 argc = dword ptr 8
.text:00411760 argv = dword ptr 0Ch
.text:00411760 envp = dword ptr 10h
.text:00411760
.text:00411760 push ebp
.text:00411761 mov ebp, esp ; 开辟栈帧
.text:00411763 sub esp, 0C0h ; 给局部变量开辟空间
.text:00411769 push ebx ; 保存易失性寄存器
.text:0041176A push esi
.text:0041176B push edi
.text:0041176C mov edi, ebp ; 从EDI从低地址向高地址初始化局部变量空间
.text:0041176E xor ecx, ecx
.text:00411770 mov eax, 0CCCCCCCCh
.text:00411775 rep stosd
.text:00411777 mov ecx, offset unk_41C003
.text:0041177C call sub_41130C
.text:00411781 movsx eax, byte_41A03C ; 把字符拓展为4字节,压入堆栈
.text:00411788 push eax
.text:00411789 cvtss2sd xmm0, dword_41A038 ; 把float拓展为double
.text:00411791 sub esp, 8
.text:00411794 movsd [esp+0D8h+var_D8], xmm0 ; 把xmm0压入堆栈 这种压入堆栈方式相当于先抬升,esp变小,在压入xmm,从低地址填充到高地址
.text:00411799 mov ecx, dword_41A034
.text:0041179F push ecx
.text:004117A0 push offset aIntDFloatFChar ; 压入的是字符串的地址,共计四个字节
.text:004117A5 call sub_4113A2
.text:004117AA add esp, 14h ; ch(4) + xmm0(8) + ecx(4) + 字符串地址(4) = 20字节 = 0x14 平衡堆栈
.text:004117AD xor eax, eax ; 清0 eax,相当于 return 0
.text:004117AF pop edi ; 恢复易失性寄存器
.text:004117B0 pop esi
.text:004117B1 pop ebx
.text:004117B2 add esp, 0C0h ; 恢复函数局部变量空间
.text:004117B8 cmp ebp, esp
.text:004117BA call sub_411230 ; CheckEsp检查当前函数栈帧是否被破坏
.text:004117BF mov esp, ebp ; 恢复栈帧
.text:004117C1 pop ebp
.text:004117C2 retn
.text:004117C2 main endp
总结
- 全局变量保存在data段,在程序编译链接就确定了;局部变量保存在stack段
- 访问局部变量往往是通过[ebp-0xXXX],全局变量往往是一个地址[0xXXX]
- 把局部变量或者全局变量压入堆栈需要使用寄存器
- 给局部变量赋值,mov [esp-0xXXX],值
- 函数有返回值往往借助寄存器,值或者地址
相关文章:
局部变量,全局变量与内存
本文会使用IDA分析局部变量,全局变量在内存的存储 目录 使用IDA分析局部变量 使用IDA分析全局变量 总结 使用IDA分析局部变量 #include <stdio.h>int main() {int nNum 1;float fNum 2.5;char ch A;printf("int %d, float %f, char %c", nNu…...
Python爬虫异常处理实用技巧分享
当我们编写爬虫程序时,经常会遇到各种各样的异常情况,比如网络连接失败、页面解析错误、请求被拒绝等等。这些异常情况可能导致程序中断或者无法正常运行,给我们的数据采集工作带来一定的困扰。所以,掌握一些实用的异常处理技巧对…...
【性能测试】Jmeter —— jmeter计数器
jmeter计数器 如果需要引用的数据量较大,且要求不能重复或者需要递增,那么可以使用计数器来实现 如:新增功能,要求名称不能重复 1,新增计数器 计数器:允许用户创建一个在线程组之内都可以被引用的计数器…...
Python 布尔类型和比较运算符
视频版教程 Python3零基础7天入门实战视频教程 布尔( bool)表达现实生活中的逻辑,即真和假,True表示真,False表示假。 实例: # 布尔类型定义 b1 True b2 False print(f"b1{b1},类型是{type(b1)}") prin…...
蓝牙核心规范(V5.4)10.1-BLE 入门笔记(1)
ble 规范 深入了解蓝牙LE需要熟悉相关的规格。蓝牙LE的架构、程序和协议由一项关键规范完全定义,称为蓝牙核心规范。产品如何使用蓝牙以实现互操作性由两种特殊类型称为配置文件和服务的规范集合所涵盖。图1展示了BLE规范类型及其相互关系。 1.1 蓝牙核心规范 蓝牙核心规范是…...
Java高级之泛型、自定义泛型、通配符的使用
泛型与File 文章目录 一、为什么要有泛型?1.1、什么是泛型?1.2、泛型的设计背景1.3、泛型的概念 二、在集合中使用泛型三、自定义泛型结构2.1、泛型方法的使用 四、泛型在继承上的体现五、通配符的使用5.1、通配符的使用5.2、有限制条件的通配符的使用 …...
代码随想录二刷day32
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣122. 买卖股票的最佳时机 II二、力扣55. 跳跃游戏三、力扣45. 跳跃游戏 II 前言 一、力扣122. 买卖股票的最佳时机 II class Solution {public int ma…...
linux基础篇
文章目录 linux基础篇1.Linux文件系统结构:2.常用的Linux指令:3.Shell指令:4.Linux服务管理:5.Linux磁盘挂载:其他 linux基础篇 1.Linux文件系统结构: 根目录 /bin目录:二进制可执行文件存放处boot目录:启…...
文心一言插件开发全流程,ERNIE-Bot-SDK可以调用文心一言的能力
文心一言插件开发 前言插件插件是什么工作原理申请开发权限 开始第一步:安装python第二步:搭建项目manifest 描述文件:ai-plugin.json插件服务描述文件:openapi.yaml开发自己的plugin-server 第三步:上传插件 SDK相关链…...
Keepalived+LVS负载均衡
Keepalived 是一个用于实现高可用性的开源软件,它基于 VRRP(Virtual Router Redundancy Protocol)协议,允许多台服务器协同工作,以确保在某个服务器出现故障时服务的连续性。Keepalived 的核心思想是将多台服务器配置成…...
接口测试学习
1、curl 命令 无参:curl -X POST -H"Authorization: abcdefghijklmn" https://xxx.xxxxx.com/xxxx 有参:curl -X POST -H"Authorization:abcdefghijklmn " -H"Content-Type:application/json" https://xxx.xxxxx.com/…...
怎么用外网访问自己的网站?快解析内网端口映射来实现
想要访问服务器上的网站需要直接或间接访问服务器IP地址,但是如果服务器没有公网IP地址,那么就需要借助外网进行访问。当我们需要远程访问内网的Web服务器时,我们需要使用一些技术来实现此目的。这就需要通过使用类似快解析内网端口映射方式进…...
zabbix学习1--zabbix6.x单机
文章目录 1. 环境2. MYSQL8.02.1 单节点2.2 配置主从 3. 依赖组件4. zabbix-server5. agent5.1 yum5.2 编译 附录my.cnfJDK默认端口号 1. 环境 进入官网查看所需部署环境配置以及应用版本要求https://www.zabbix.com/documentation/current/zh/manual/installation/requiremen…...
Flink 的 Kafka Table API Connector
Flink datastream connectors 和 Flink table api connectors 的区别: Flink DataStream Connectors和Table API Connectors是Flink中用于连接外部数据源的两种不同的连接器。 1. Flink DataStream Connectors: - Flink DataStream Connectors是用于将外部数据源连…...
tcpdump 命令
一、TCPDUMP指定IP 在网络流量分析过程中,我们经常需要对指定的IP进行抓取和分析。使用TCPDUMP指定IP非常简单,只需要通过命令行参数-i指定需要抓取的网卡,并使用host参数指定目标IP地址即可:tcpdump -i eth0 host 192.168.0.1 上…...
哪些测试项目可以使用自动化测试?
通常,软件测试v的测试方式分为人工测试和自动化测试,人工测试是由测试人员编写并执行测试用例,然后观察测试结果与预期结果是否一致的过程;自动化测试是通过测试工具来代替或辅助人工去验证系统功能是否有问题的过程。 采用自动化测试需要满…...
【八大经典排序算法】冒泡排序
【八大经典排序算法】冒泡排序 一、概述二、思路解读三、代码实现四、优化 一、概述 冒泡排序由于其简单和易于理解,使其成为初学者学习排序算法的首选,也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到…...
【IEEE会议】第五届机器人、智能控制与人工智能国际学术会议(RICAI 2023)
【IEEE列表会议】第五届机器人、智能控制与人工智能国际学术会议(RICAI 2023) 2023 5th International Conference on Robotics, Intelligent Control and Artificial Intelligence 第五届机器人、智能控制与人工智能国际学术会议(RICAI 20…...
如何在本地 Linux 主机上实现 Yearning SQL 审核平台的远程访问?
文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…...
android.support.multidex.MultiDexApplication:DexPathList
修改项目的build.gradle文件,使用multidex并添加multidex库作为依赖,如下所示: android { defaultConfig { ... minSdkVersion 21 targetSdkVersion 28 multiDexEnabled true } ... } dependencies { compile com.android.support:multidex…...
云HIS医院信息化系统:集团化管理,多租户机制,满足医院业务需求
随着云计算、大数据、物联网等新兴技术的迅猛发展,HIS模式的理念、运行机制更新,衍生出了新的HIS模式——云HIS。云HIS是基于云计算、大数据、互联网等高新技术研发的医疗卫生信息平台,它实现了医院信息化从局域网向互联网转型,并…...
Docker拉取nginx镜像,部署若依Vue前端
前言 本文主要用来描述,如何用nginx部署若依项目的前端。 一、Docker 拉取 Nginx镜像 命令:docker pull nginx 二、Vue项目打包 2.1 先配置线上后端路径 说明:由于我打包命令是 npm run build:stage ,所以项目生效的环境文…...
简单介绍神经网络中不同优化器的数学原理及使用特性【含规律总结】
当涉及到优化器时,我们通常是在解决一个参数优化问题,也就是寻找能够使损失函数最小化的一组参数。当我们在无脑用adam时,有没有斟酌过用这个是否合适,或者说凭经验能够有目的性换用不同的优化器?是否用其他的优化器可…...
JL653—一个基于ARINC653的应用程序仿真调试工具
JL653是安装在PC机Windows操作系统上面的一层接插件,它能够真实地模拟ARINC653标准规定的功能性行为,从而可以供研发人员在PC机Windows环境下高效、快速的进行基于ARINC653的应用程序的开发、调试等。 JL653提供了ARINC 653 Part 1中要求的以下服务&…...
MQTT Paho Android 支持SSL/TLS(亲测有效)
MQTT Paho Android 支持SSL/TLS(亲测有效) 登录时支持ssl的交互 这是调测登录界面设计 代码中对ssl/tls的支持 使用MqttAndroidClient配置mqtt客户端请求时,不加密及加密方式连接存在以下几点差异: url及端口差异 val uri: String if (tlsConnect…...
STM32——SPI通信
文章目录 SPI(Serial Peripheral Interface)概述:SPI的硬件连接:SPI的特点和优势:SPI的常见应用:SPI的工作方式和时序图分析:工作模式传输模式与时序分析工作流程 SPI设备的寄存器结构和寄存器设…...
Linux虚拟机局域网IP配置
前言 应用程序包部署在主机(Window)的虚拟机(Linux CentOS7)上,把主机当做一个服务器,在局域网中访问部署在主机上的应用程序,配置Linux网络。 文章如有侵权,无意为之,…...
MacOS删除.DS_Store文件
目录 .DS_Store是什么删除命令防止再生命令 .DS_Store是什么 在 Mac OS X 系统下,几乎绝大部分文件夹中都包含 .DS_Store 隐藏文件,这里保存着针对这个目录的特殊信息和设置配置,例如查看方式、图标大小以及这个目录的一些附属元数据。 而在…...
ARM Linux DIY(十一)板子名称、开机 logo、LCD 控制台、console 免登录、命令提示符、文件系统大小
文章目录 前言板子名称uboot Modelkernel 欢迎词、主机名 开机 logoLCD 控制台console 免登录命令提示符文件系统大小 前言 经过前面十篇文章的介绍,硬件部分调试基本完毕,接下来的文章开始介绍软件的个性化开发。 板子名称 uboot Model 既然是自己的…...
【Unity程序技巧】Unity中的单例模式的运用
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
零基础网站制作视频教程/中国万网域名注册官网
问题 使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据 这是由于浏览器的同源策略导致的,目的是为了安全。在前后端分离开发模式备受青睐的今天,前端和后台项目往往会在不同的环境下进行开发,这时…...
外包公司做网站图片哪里整的/站长统计
本文介绍了车载通信系统的安全要求,以及HSM硬件安全模块和软件安全结构的相关内容。 本文来自本实验室龚思陈的学习笔记。 车载通信系统的安全要求 攻击的种类: 对安全的攻击 (1) 未授权的突然刹车 (2) 袭击主动制动功能 (3) 篡改危险警告信息 对…...
怎么建设网站多少钱/网店推广常用的方法
Canary机制Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。我们知道,…...
hfs网络文件服务器可以做网站/凡科网建站系统源码
02–Django笔记–模板标签和过滤器 一、搭建渲染模板 渲染模板的文件位于应用文件夹中的 views.py 文件中 渲染模板即为请求后返回的html文件的渲染 之后修改 views.py 创建渲染函数 # from mysite.blog.models import Blog from django.shortcuts import render, get_obje…...
商城网站制作方案/it培训机构排名及学费
一、编译boost库 第一步:下载boost库,下载地址http://sourceforge.net/projects/boost/files/boost/1.55.0/ 第二部:解压boost库,例如解压到F:\Third-party libs\boost\boost_1_55_0 第三部:开始->程序->Microso…...
2018年做淘宝客网站还能挣钱吗/发布外链的步骤
大家好,我是为人造的智能操碎了心的智能禅师。今天内容很有料,禅师这里就不多说了。只提醒一句,有彩蛋。全文大约4000字。读完可能需要好几首下面这首歌的时间?天下武功,唯快;新秀出世,求快2009年的一个下…...