在内存中运行可执行程序,好处是可以给程序加壳,加密源程序,静态反汇编无法获得PE输入节,但是因为运行后仍然是独立的进程,所以没办法防止远程线程注入,挂接API钩子。1 typedef IMAGE_SECTION_HEADER ( * PIMAGE_SECTION_HEADERS)[ 1 ]; 2 3 // 计算对齐后的大小 4 unsigned long GetAlignedSize(unsigned long Origin, unsigned long Alignment) 5 { 6 return (Origin + Alignment - 1 ) / Alignment * Alignment; 7 } 8 9 // 计算加载pe并对齐需要占用多少内存 10 // 未直接使用OptionalHeader.SizeOfImage作为结果是因为据说有的编译器生成的exe这个值会填0 11 unsigned long CalcTotalImageSize(PIMAGE_DOS_HEADER MzH 12 , unsigned long FileLen 13 , PIMAGE_NT_HEADERS peH 14 , PIMAGE_SECTION_HEADERS peSecH) 15 { 16 unsigned long res; 17 // 计算pe头的大小 18 res = GetAlignedSize( peH -> OptionalHeader.SizeOfHeaders , peH -> OptionalHeader.SectionAlignment); 19 20 // 计算所有节的大小 21 for ( int i = 0 ; i < peH -> FileHeader.NumberOfSections; ++ i) 22 { 23 // 超出文件范围 24 if (peSecH[i] -> PointerToRawData + peSecH[i] -> SizeOfRawData > FileLen) 25 { 26 return 0 ; 27 } 28 else if (peSecH[i] -> VirtualAddress) // 计算对齐后某节的大小 29 { 30 if (peSecH[i] -> Misc.VirtualSize) 31 { 32 res = GetAlignedSize( peSecH[i] -> VirtualAddress + peSecH[i] -> Misc.VirtualSize 33 , peH -> OptionalHeader.SectionAlignment); 34 } 35 else 36 { 37 res = GetAlignedSize( peSecH[i] -> VirtualAddress + peSecH[i] -> SizeOfRawData 38 , peH -> OptionalHeader.SectionAlignment); 39 } 40 } 41 else if ( peSecH[i] -> Misc.VirtualSize < peSecH[i] -> SizeOfRawData ) 42 { 43 res += GetAlignedSize( peSecH[i] -> SizeOfRawData 44 , peH -> OptionalHeader.SectionAlignment); 45 } 46 else 47 { 48 res += GetAlignedSize( peSecH[i] -> Misc.VirtualSize 49 , peH -> OptionalHeader.SectionAlignment); 50 } // if_else 51 } // for 52 53 return res; 54 } 55 56 57 58 59 // 加载pe到内存并对齐所有节 60 BOOL AlignPEToMem( void * Buf 61 , long Len 62 , PIMAGE_NT_HEADERS & peH 63 , PIMAGE_SECTION_HEADERS & peSecH 64 , void *& Mem 65 , unsigned long & ImageSize) 66 { 67 PIMAGE_DOS_HEADER SrcMz; // DOS头 68 PIMAGE_NT_HEADERS SrcPeH; // PE头 69 PIMAGE_SECTION_HEADERS SrcPeSecH; // 节表 70 71 SrcMz = (PIMAGE_DOS_HEADER)Buf; 72 73 if ( Len < sizeof (IMAGE_DOS_HEADER) ) 74 return FALSE; 75 76 if ( SrcMz -> e_magic != IMAGE_DOS_SIGNATURE ) 77 return FALSE; 78 79 if ( Len < SrcMz -> e_lfanew + ( long ) sizeof (IMAGE_NT_HEADERS) ) 80 return FALSE; 81 82 SrcPeH = (PIMAGE_NT_HEADERS)(( int )SrcMz + SrcMz -> e_lfanew); 83 if ( SrcPeH -> Signature != IMAGE_NT_SIGNATURE ) 84 return FALSE; 85 86 if ( (SrcPeH -> FileHeader.Characteristics & IMAGE_FILE_DLL) || 87 (SrcPeH -> FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == 0 ) || 88 (SrcPeH -> FileHeader.SizeOfOptionalHeader != sizeof (IMAGE_OPTIONAL_HEADER)) ) 89 { 90 return FALSE; 91 } 92 93 94 SrcPeSecH = (PIMAGE_SECTION_HEADERS)(( int )SrcPeH + sizeof (IMAGE_NT_HEADERS)); 95 ImageSize = CalcTotalImageSize( SrcMz, Len, SrcPeH, SrcPeSecH); 96 97 if ( ImageSize == 0 ) 98 return FALSE; 99 100 Mem = VirtualAlloc( NULL, ImageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 分配内存 101 if ( Mem != NULL ) 102 { 103 // 计算需要复制的PE头字节数 104 unsigned long l = SrcPeH -> OptionalHeader.SizeOfHeaders; 105 for ( int i = 0 ; i < SrcPeH -> FileHeader.NumberOfSections; ++ i) 106 { 107 if ( (SrcPeSecH[i] -> PointerToRawData) && 108 (SrcPeSecH[i] -> PointerToRawData < l) ) 109 { 110 l = SrcPeSecH[i] -> PointerToRawData; 111 } 112 } 113 memmove( Mem, SrcMz, l); 114 peH = (PIMAGE_NT_HEADERS)(( int )Mem + ((PIMAGE_DOS_HEADER)Mem) -> e_lfanew); 115 peSecH = (PIMAGE_SECTION_HEADERS)(( int )peH + sizeof (IMAGE_NT_HEADERS)); 116 117 void * Pt = ( void * )((unsigned long )Mem 118 + GetAlignedSize( peH -> OptionalHeader.SizeOfHeaders 119 , peH -> OptionalHeader.SectionAlignment) 120 ); 121 122 for ( i = 0 ; i < peH -> FileHeader.NumberOfSections; ++ i) 123 { 124 // 定位该节在内存中的位置 125 if (peSecH[i] -> VirtualAddress) 126 Pt = ( void * )((unsigned long )Mem + peSecH[i] -> VirtualAddress); 127 128 if (peSecH[i] -> SizeOfRawData) 129 { 130 // 复制数据到内存 131 memmove(Pt, ( const void * )((unsigned long )(SrcMz) + peSecH[i] -> PointerToRawData), peSecH[i] -> SizeOfRawData); 132 if (peSecH[i] -> Misc.VirtualSize < peSecH[i] -> SizeOfRawData) 133 Pt = ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> SizeOfRawData, peH -> OptionalHeader.SectionAlignment)); 134 else // pt 定位到下一节开始位置 135 Pt = ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> Misc.VirtualSize, peH -> OptionalHeader.SectionAlignment)); 136 } 137 else 138 { 139 Pt = ( void * )((unsigned long )Pt + GetAlignedSize(peSecH[i] -> Misc.VirtualSize, peH -> OptionalHeader.SectionAlignment)); 140 } 141 } 142 } 143 return TRUE; 144 } 145 146 147 148 typedef void * (__stdcall * pfVirtualAllocEx)(unsigned long , void * , unsigned long , unsigned long , unsigned long ); 149 pfVirtualAllocEx MyVirtualAllocEx = NULL; 150 151 BOOL IsNT() 152 { 153 return MyVirtualAllocEx != NULL; 154 } 155 156 // 生成外壳程序命令行 157 char * PrepareShellExe( char * CmdParam, unsigned long BaseAddr, unsigned long ImageSize) 158 { 159 if (IsNT()) 160 { 161 char * Buf = new char [ 256 ]; 162 memset(Buf, 0 , 256 ); 163 GetModuleFileName( 0 , Buf, 256 ); 164 strcat(Buf, CmdParam); 165 return Buf; // 请记得释放内存;-) 166 } 167 else 168 { 169 // Win98 170 171 return NULL; 172 } 173 } 174 175 // 是否包含可重定向列表 176 BOOL HasRelocationTable(PIMAGE_NT_HEADERS peH) 177 { 178 return (peH -> OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) 179 && (peH -> OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size); 180 } 181 182 183 184 185 #pragma pack(push, 1 ) 186 typedef struct { 187 unsigned long VirtualAddress; 188 unsigned long SizeOfBlock; 189 } * PImageBaseRelocation; 190 #pragma pack(pop) 191 192 // 重定向PE用到的地址 193 void DoRelocation(PIMAGE_NT_HEADERS peH, void * OldBase, void * NewBase) 194 { 195 unsigned long Delta = (unsigned long )NewBase - peH -> OptionalHeader.ImageBase; 196 PImageBaseRelocation p = (PImageBaseRelocation)((unsigned long )OldBase 197 + peH -> OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); 198 while (p -> VirtualAddress + p -> SizeOfBlock) 199 { 200 unsigned short * pw = (unsigned short * )(( int )p + sizeof ( * p)); 201 for (unsigned int i = 1 ; i <= (p -> SizeOfBlock - sizeof ( * p)) / 2 ; ++ i) 202 { 203 if (( * pw) & 0xF000 == 0x3000 ) { 204 unsigned long * t = (unsigned long * )((unsigned long )(OldBase) + p -> VirtualAddress + (( * pw) & 0x0FFF )); 205 * t += Delta; 206 } 207 ++ pw; 208 } 209 p = (PImageBaseRelocation)pw; 210 } 211 } 212 213 // 卸载原外壳占用内存 214 BOOL UnloadShell(HANDLE ProcHnd, unsigned long BaseAddr) 215 { 216 typedef unsigned long (__stdcall * pfZwUnmapViewOfSection)(unsigned long , unsigned long ); 217 pfZwUnmapViewOfSection ZwUnmapViewOfSection = NULL; 218 BOOL res = FALSE; 219 HMODULE m = LoadLibrary( " ntdll.dll " ); 220 if (m) { 221 ZwUnmapViewOfSection = (pfZwUnmapViewOfSection)GetProcAddress(m, " ZwUnmapViewOfSection " ); 222 if (ZwUnmapViewOfSection) 223 res = (ZwUnmapViewOfSection((unsigned long )ProcHnd, BaseAddr) == 0 ); 224 FreeLibrary(m); 225 } 226 return res; 227 } 228 229 // 创建外壳进程并获取其基址、大小和当前运行状态 230 BOOL CreateChild( char * Cmd, CONTEXT & Ctx, HANDLE & ProcHnd, HANDLE & ThrdHnd, 231 unsigned long & ProcId, unsigned long & BaseAddr, unsigned long & ImageSize) 232 { 233 STARTUPINFOA si; 234 PROCESS_INFORMATION pi; 235 unsigned long old; 236 MEMORY_BASIC_INFORMATION MemInfo; 237 memset( & si, 0 , sizeof (si)); 238 memset( & pi, 0 , sizeof (pi)); 239 si.cb = sizeof (si); 240 241 BOOL res = CreateProcess(NULL, Cmd, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, & si, & pi); // 以挂起方式运行进程; 242 if (res) { 243 ProcHnd = pi.hProcess; 244 ThrdHnd = pi.hThread; 245 ProcId = pi.dwProcessId; 246 // 获取外壳进程运行状态,[ctx.Ebx+8]内存处存的是外壳进程的加载基址,ctx.Eax存放有外壳进程的入口地址 247 Ctx.ContextFlags = CONTEXT_FULL; 248 GetThreadContext(ThrdHnd, & Ctx); 249 ReadProcessMemory(ProcHnd, ( void * )(Ctx.Ebx + 8 ), & BaseAddr, sizeof (unsigned long ), & old); // 读取加载基址 250 void * p = ( void * )BaseAddr; 251 // 计算外壳进程占有的内存 252 while (VirtualQueryEx(ProcHnd, p, & MemInfo, sizeof (MemInfo))) 253 { 254 if (MemInfo.State = MEM_FREE) break ; 255 p = ( void * )((unsigned long )p + MemInfo.RegionSize); 256 } 257 ImageSize = (unsigned long )p - (unsigned long )BaseAddr; 258 } 259 return res; 260 } 261 262 // 创建外壳进程并用目标进程替换它然后执行 263 HANDLE AttachPE( char * CmdParam, PIMAGE_NT_HEADERS peH, PIMAGE_SECTION_HEADERS peSecH, 264 void * Ptr, unsigned long ImageSize, unsigned long & ProcId) 265 { 266 HANDLE res = INVALID_HANDLE_VALUE; 267 CONTEXT Ctx; 268 HANDLE Thrd; 269 unsigned long Addr, Size; 270 char * s = PrepareShellExe(CmdParam, peH -> OptionalHeader.ImageBase, ImageSize); 271 if (s == NULL) return res; 272 if (CreateChild(s, Ctx, res, Thrd, ProcId, Addr, Size)) { 273 void * p = NULL; 274 unsigned long old; 275 if ((peH -> OptionalHeader.ImageBase == Addr) && (Size >= ImageSize)) { // 外壳进程可以容纳目标进程并且加载地址一致 276 p = ( void * )Addr; 277 VirtualProtectEx(res, p, Size, PAGE_EXECUTE_READWRITE, & old); 278 } 279 else if (IsNT()) { 280 if (UnloadShell(res, Addr)) { // 卸载外壳进程占有内存 281 p = MyVirtualAllocEx((unsigned long )res, ( void * )peH -> OptionalHeader.ImageBase, ImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); 282 } 283 if ((p == NULL) && HasRelocationTable(peH)) { // 分配内存失败并且目标进程支持重定向 284 p = MyVirtualAllocEx((unsigned long )res, NULL, ImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); 285 if (p) DoRelocation(peH, Ptr, p); // 重定向 286 } 287 } 288 if (p) { 289 WriteProcessMemory(res, ( void * )(Ctx.Ebx + 8 ), & p, sizeof (DWORD), & old); // 重置目标进程运行环境中的基址 290 peH -> OptionalHeader.ImageBase = (unsigned long )p; 291 if (WriteProcessMemory(res, p, Ptr, ImageSize, & old)) { // 复制PE数据到目标进程 292 Ctx.ContextFlags = CONTEXT_FULL; 293 if ((unsigned long )p == Addr) 294 Ctx.Eax = peH -> OptionalHeader.ImageBase + peH -> OptionalHeader.AddressOfEntryPoint; // 重置运行环境中的入口地址 295 else 296 Ctx.Eax = (unsigned long )p + peH -> OptionalHeader.AddressOfEntryPoint; 297 SetThreadContext(Thrd, & Ctx); // 更新运行环境 298 ResumeThread(Thrd); // 执行 299 CloseHandle(Thrd); 300 } 301 else { // 加载失败,杀掉外壳进程 302 TerminateProcess(res, 0 ); 303 CloseHandle(Thrd); 304 CloseHandle(res); 305 res = INVALID_HANDLE_VALUE; 306 } 307 } 308 else { // 加载失败,杀掉外壳进程 309 TerminateProcess(res, 0 ); 310 CloseHandle(Thrd); 311 CloseHandle(res); 312 res = INVALID_HANDLE_VALUE; 313 } 314 } 315 delete[] s; 316 return res; 317 } 318 319 320 321 322 /**/ /**/ /**/ /* ******************************************************/ 323 { ******************************************************* } 324 { * 从内存中加载并运行exe * } 325 { ******************************************************* } 326 { * 参数: } 327 { * Buffer: 内存中的exe地址 } 328 { * Len: 内存中exe占用长度 } 329 { * CmdParam: 命令行参数(不包含exe文件名的剩余命令行参数)} 330 { * ProcessId: 返回的进程Id } 331 { * 返回值: 如果成功则返回进程的Handle(ProcessHandle), } 332 { 如果失败则返回INVALID_HANDLE_VALUE } 333 { ******************************************************* } 334 /****************************************************** */ 335 HANDLE MemExecute( void * ABuffer, long Len, char * CmdParam, unsigned long * ProcessId) 336 { 337 HANDLE res = INVALID_HANDLE_VALUE; 338 PIMAGE_NT_HEADERS peH; 339 PIMAGE_SECTION_HEADERS peSecH; 340 void * Ptr; 341 unsigned long peSz; 342 if (AlignPEToMem(ABuffer, Len, peH, peSecH, Ptr, peSz)) 343 { 344 res = AttachPE(CmdParam, peH, peSecH, Ptr, peSz, * ProcessId); 345 VirtualFree(Ptr, peSz, MEM_DECOMMIT); 346 } 347 return res; 348 } 349 350 // 初始化 351 class CInit 352 { 353 public : 354 CInit() 355 { 356 MyVirtualAllocEx = (pfVirtualAllocEx)GetProcAddress(GetModuleHandle( " Kernel32.dll " ), " VirtualAllocEx " ); 357 } 358 } Init; 359 360 361 362 363 364 365 366 int main( int argc, char * argv[]) 367 { 368 FILE * fp; 369 fp = fopen( " E://CProject//DBGVIEW.EXE " , " rb " ); 370 371 if ( fp ) 372 { 373 374 fseek(fp, 0l ,SEEK_END); 375 int file_size = ftell(fp); /**/ /* 获取文件长度 */ 376 fseek(fp, 0l ,SEEK_SET); /**/ /* 回到文件头部 */ 377 378 379 LPBYTE pBuf = new BYTE[file_size]; 380 memset( pBuf, 0 , file_size); 381 382 fread(pBuf,file_size, 1 ,fp); 383 384 DWORD id = GetCurrentProcessId(); 385 unsigned long ulProcessId = 0 ; 386 MemExecute( pBuf, file_size, "" , & ulProcessId); 387 delete[] pBuf; 388 389 } 390 391 return 0 ; 392 }
相关推荐
从内存中运行exe程序
1. 把你的程序读要内存 2. 以 CREATE_SUSPENDED模式CreateProcess打开svchost.exe 3. 修改svchost.exe页面的属性,然后把要运行的那个程序的内容拷贝到svchost.exe页面 4. 然后再运行 实质想当于是 披着/svchost.exe进程的相关信息/这张皮,而皮里面的肉都被改了
在内存中启动EXE程序(过程详解)
打开文件 这个文件可加密,打开文件的同时解密成EXE文件即可。 char szFileName[] = "Virus.exe"; HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_A...
动态加载EXE文件到内存执行1
动态加载EXE文件到内存执行 //***************************************************************
进程和可执行程序
内存中,而我们删除的程序自身是在磁盘中的,所以在这里并不影响程序继续运行。
Hive数据仓库分层架构实战:4层黄金模型×6大业务场景×万亿级数据优化方案
根据《2023数据中台成熟度报告》,78%的ETL任务性能瓶颈源于分层设计不合理。本文基于某头部电商平台PB级数据仓库建设经验,结合金融风控、用户画像、实时大屏等核心场景,深度解析ODS→DWD→DWS→ADS四层架构设计原则,揭秘万亿级数据治理方案与维度建模20大避坑策略。
TeXstudio完整安装配置教程(2025最新版)
至此,你已经完成了TeXstudio的完整安装和配置!现在你可以:✅ 使用TeXstudio编写LaTeX文档✅ 正确编译中英文混排的文档✅ 掌握基本的编辑和配置技巧LaTeX的学习曲线较陡,但一旦掌握,你会发现它在学术写作中的强大之处。建议从简单的文档开始练习,逐步掌握更高级的功能。祝你LaTeX写作顺利!如果有任何问题,欢迎在评论区留言交流。关键词:TeXstudio安装、LaTeX环境配置、中文LaTeX、TeX Live、学术论文写作更新日期:2025年10月。
C:从编译到运行,一个可执行程序的内存分区是如何构建与协作的?
本文详细解析了C语言程序从编译到运行过程中内存分区的构建与协作机制。重点介绍了代码区、栈区、堆区等核心内存分区的功能特点及交互原理,帮助开发者深入理解程序内存管理,避免常见内存错误并优化性能。
给STM32F103的7寸屏找个新UI:LVGL 8.2裸机移植保姆级教程(附避坑清单)
本文详细介绍了如何将LVGL 8.2裸机移植到STM32F103开发板,特别针对7寸大屏(800×480分辨率)进行优化配置。从环境准备、工程搭建到显示驱动移植、内存优化与性能调优,提供完整的解决方案和避坑清单,帮助开发者快速实现美观的用户界面。
程序的内存布局
代码在可执行程序中的对应关系 如何执行编译出来的a.out文件呢? 命令行敲如a.out文件,之后就可运行了。操作系统怎么知道这是一个可执行程序的呢?操作系统在接到./a.out这个命令后回去读文件头,读文件头看一下这个文件头里面对应的是不是可执行程序的信息。如果是的话,操作系统就知道这是一个可执行程序,操作系统就要为这个可执行程序分配一些内存空间来给其运行。这个内存空间很有可能一部分当做
YOLO26涨点改进| TGRS 2026 | 独家创新首发、注意力改进篇| 引入LCGA局部曲率引导注意力,保持局部稳定性的同时突出关键几何区域,含多种创新改进,促进YOLO26所有任务高效涨点
🔥本文提出LCGA(局部曲率引导注意力)模块,通过引入曲率信息改进YOLO26网络模型。LCGA在局部窗口内利用深度卷积构造曲率代理,调制标准窗口注意力,使模型更关注道路、边界等曲线型结构,提升遥感图像超分辨率中的几何保真度。相比普通注意力,LCGA能精准聚焦关键几何区域,减少边缘断裂和轮廓偏移,同时保持较低计算开销。实验表明LCGA显著提升性能,在UCMerced数据集上PSNR提升0.2148dB。文章提供了三种改进方案。
科技与伦理的平衡点:人类计算的伦理
科技与伦理的平衡点:人类计算的伦理 关键词 科技与伦理 人类计算 隐私问题 道德决策自动化 公平性与偏见 法律与社会责任 摘要 本
进程,可执行程序,可执行程序实例之间的关系
可执行程序是磁盘上的文件,实例是内存中的运行时代码和数据。
部分旧版统信国产系统下载资源
注:全部自来网络查找,建议到官网下载最新版。
Linux_动态库与静态库(其一)
1.动态库和静态库的定义 动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾。 静态库(.a):静态库是将一组目标文件(.o文件)打包成一个单一的归档文件。在编译时,链接器会将所需的目标文件代码复制到最终生成的可执行文件中,程序运行的时候将不再需要静态库,通常以.a结尾。 库的命名规则: lib+库名+后缀...
基于ADMM的TV正则化最小化稀疏实现图像重建
ADMM算法是一种求解带有约束条件的优化问题的有效方法,它可以将原问题分解成两个子问题,然后交替求解这两个子问题,直到收敛。为了解决这些问题,研究人员提出了许多图像重建方法,其中一种常用的方法是基于正则化的方法。在图像重建中,TV正则化是一种比较常用的正则化方法,可以有效地降低图像的噪声,并保持图像细节特征。通过本文的介绍和源代码的演示,我们可以看出基于ADMM的TV正则化最小化稀疏实现图像重建的方法是一种简单、高效、有效的图像重建方法,能够在一定程度上提高图像质量,对于实际应用具有一定的参考意义。
微信小程序 - 解决支付报错 requestPayment:fail access denied (微信支付提示错误requestPayment:拒绝访问失败,真机运行测试或打包编译上线后报错问题)
微信小程序,微信支付,wx.requestPayment,微信小程序支付报错requestPayment:fail access denied,调不起微信,无法唤起支付弹窗,支付失败,支付权限没问题,小程序上线后支付报错,小程序真机测试支付报错,微信小程序苹果ios系统手机无法支付,小程序发布上线后支付报错,本地测试没问题,拒绝访问失败,小程序调起支付API requestPayment:fail:access denied微信开发者工具正常支付,权限没问题,微信公众平台,依旧报错怎么办,检查了appid都
嵌入式中c语言运行过程,嵌入式C语言程序的运行
我们做C语言中这么多年,都知道这样一句话,C语言代码形成可执行程序,需要经过编译->汇编->链接三个阶段。背都背熟了,但是到底啥意思,每一步都会产生一些什么东西,很多人都不是太了解。今天就详细的来说说这个问题:先看下图,在这个图中,我详细的描述了,整个过程及中间的一些步骤:代码段,只读数据段,读写数据段,未初始化数据段属于静态区域。栈和堆属于动态区域。代码段,只读数据段和读写数据段将在...
深度学习工具包 DeepLearningToolbox
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[](https://bitdeli.com/free "Bitdeli Badge")
程序中内存布局
程序中内存布局 程序文件的一般布局 1、不同代码在可执行程序中的对应关系 程序与进程 1、程序与进程不同 a、程序是静态的概念,表现形式为一个可执行文件 b、进程是动态的概念,程序由操作系统加载运行后得到进程 c、每个程序可以对应多个进程 b、每个进程只能对应一个程序 2、文件布局在内存中的映射 各个段的作用 1、堆栈段在程序运行后才正式存在的,是程序运行的基础 2、.bss段存放的是未初始化的全局变量和静态变量 3、.text段存放的始程序中的可执行代码 4、data段保存的是已经初始化了的全局变量
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
静态内存 —— 动态内存(堆) —— 栈内存
一、三种内存 1、栈内存 保存栈对象:保存函数调用相关信息(局部非静态对象、函数参数、、、)。 生存期:调用函数开始时在栈区分配内存,函数结束时释放内存。 2、动态内存 保存动态对象:通过new在内存池中申请的,没有足够空间会抛出异常(std::bad_alloc),delete释放内存,并置空指针,少delete或者多delete都会造成...
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
C语言--程序的翻译环境(编译和链接)和运行环境
文章目录
编译和链接
有关C语言的编译和链接的相关理解 【只是粗略的了解步骤】
C程序的内存空间分配
可执行程序包括BSS段、数据段、代码段。 在类UNIX系统下可使用size命令查看可执行文件的段大小信息。如size a.out: ~/Desktop/MyC$ size a.out text data bss dec hex filename 1672 600 8 2280 8e8 a.out 1.数据段存放已初始化的...
汇编语言入门第四天(王爽-汇编语言)
一、可执行程序的文件装入内存并运行的原理 在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的P2程序,将P1从可执行文件中加载入内存,P1才得以运行,P1运行完毕后,应该将CPU的控制权交还给使它得以运行的P2程序。 二、基本指令: MOV AX,0 注解: AX = 0; ADD AX,2 注解:AX = AX + 2; ...
6282



被折叠的 条评论
为什么被折叠?



