本质理解壳之 添加节

深入理解 Embedding层的本质 继上文https://blog.youkuaiyun.com/weixin_42078618/article/details/82999906探讨了embedding层的降维效果,时隔一个月,分享一下嵌入层在NPL领域的巨大作用。   本文的发表建立在了解文本转向量(如one-hot)的用法的前提上。   首先,继续假设我们有一句话,叫“公主很漂亮”,如果我们使用one-hot编码,可能得到的编码如下... 阅读详情

 

http://frfj.blogspot.com/2008/08/blog-post_26.html

 

代码含注释
流程如下:
1 将文件映射到内存得到基地址
2 检验PE标志
3 添加新节
3.1 增加节个数
3.2 得到文件对齐和节对齐值
3.3 通过节个数得到最后一节节头的地址和新节节头的地址
3.4 构建新节节头,包括name,Characteristics,misc.VirtualSize(实际大小),
通过VirtualSize文件对齐得到SizeOfRawData
3.5 通过最后一节节头VirtualAddress+VirtualSize节对齐后得到新节的VirtualAddress
通过最后一节节头PointerToRawData+SizeOfRawData文件对齐后得到新节PointerToRawData
3.6 修改SizeOfImage大小为新节的VirtualAddress+VirtualSize节对齐值
3.7 通过新节的PointerOfRawData(文件中的新节位置),将新节清0
4 修改 AddressOfEntryPoint, 旧的保存到新节最后, 新的指向新节首地址
5 将新节数据填充到新节中

 


.386
.model flat, stdcall
option casemap:none

include AddSection.Inc

APPEND_SIZE                     equ 2000h ;;添加到文件尾的大小

.const

g_szTargetFile    db 'target.exe', 0
g_szNewSectionName db ".cjay", 0
g_szOpenFileFailed      db "打不开文件", 0
g_szErr                 db "错误", 0
g_szDone      db "成功", 0
g_szDoneCap      db "Good Job", 0
g_szGetFileSizeFailed  db "获取文件大小失败", 0
g_szCreateMapFailed   db "创建文件映射失败", 0
g_szMapFileFailed   db "映射文件失败", 0
g_szInvalidPE    db "无效PE文件", 0

.data
g_bError   db 0 ;错误代码
g_dwNewSectionSize      dd 0 ;新节长度


;; 函数定义
CryptFile proto szFname : LPSTR ;;加密文件
AddSection proto pMem : LPVOID, pSectionName : LPVOID, dwSectionSize : DWORD ;; 添加新节
PEAlign proto dwTarNum : DWORD, dwAlignTo : DWORD ;;对齐

.code
Start:
  invoke CryptFile, offset g_szTargetFile
  invoke ExitProcess, 1

CryptFile proc szFname : LPSTR
  LOCAL hFile : HANDLE
  LOCAL hMap : HANDLE
     LOCAL pMem : LPVOID
     LOCAL dwOrigFileSize : DWORD ;;存放原始文件大小
     LOCAL dwNTHeaderAddr : DWORD ;;存放NT头地址
   
  xor eax, eax
  mov hFile, eax
  mov hMap, eax
  mov pMem, eax
 
  mov g_bError, al
  mov eax, offset EndNewSection - offset NewSection
  mov g_dwNewSectionSize, eax
 
  ;; open File
  invoke CreateFile,szFname, /
        GENERIC_READ+GENERIC_WRITE,/
        FILE_SHARE_READ+FILE_SHARE_WRITE,/
        NULL,/
   OPEN_EXISTING,/
        FILE_ATTRIBUTE_NORMAL,/
                     0
     .IF eax == INVALID_HANDLE_VALUE
       jmp OpenFileFailed
     .endif
  mov hFile, eax
 
  invoke GetFileSize, hFile, NULL
  .IF eax == 0
    jmp GetFileSizeFailed
  .endif   
 
  mov dwOrigFileSize, eax
  add eax, APPEND_SIZE
  xchg eax, ecx
 
  ;; create memory map
  xor ebx, ebx
  invoke CreateFileMapping, hFile, ebx, PAGE_READWRITE, ebx, ecx, ebx
  .IF eax == 0
    jmp CreateMapFailed
  .endif
  mov hMap, eax
 
  ;; map file to memory
  invoke MapViewOfFile, hMap, FILE_MAP_WRITE+FILE_MAP_READ+FILE_MAP_COPY,ebx,ebx,ebx
  .IF eax == 0
    jmp MapFileFailed
  .endif
  mov pMem, eax
 
  ;; check PE
  xchg eax, esi
  assume esi : ptr IMAGE_DOS_HEADER
  .IF [esi].e_magic != 'ZM'
    jmp InvalidPE
  .endif
  add esi, [esi].e_lfanew
  assume esi:ptr IMAGE_NT_HEADERS
  .IF word ptr [esi].Signature != 'EP'
    jmp InvalidPE
  .endif
  mov dwNTHeaderAddr, esi
 
  ;; add section
  invoke AddSection,pMem,offset g_szNewSectionName,g_dwNewSectionSize
  ;; return New Section Addr(VA)
  push eax
  mov esi, dwNTHeaderAddr
  assume esi : ptr IMAGE_NT_HEADERS
  ;;AddressOfEntryPoint
  mov ebx, dword ptr [esi].OptionalHeader.AddressOfEntryPoint
  add ebx, dword ptr [esi].OptionalHeader.ImageBase
  ;; Save the old entry
  mov eax, offset OrigAddressOfEntry
  mov dword ptr [eax], ebx
  ;; New Rntry is at New Section start
  pop eax
  assume eax : ptr IMAGE_SECTION_HEADER
  push dword ptr [eax].VirtualAddress
  pop dword ptr [esi].OptionalHeader.AddressOfEntryPoint
 
 mov esi, offset NewSection
 mov edi, dword ptr [eax].PointerToRawData
 add edi, pMem
 mov ecx, g_dwNewSectionSize
 cld
 rep movsb
 
LogicShellExit:
 ;; close handle & write it
 .IF pMem != NULL
  invoke UnmapViewOfFile, pMem
 .endif
 .IF hMap != NULL
  invoke CloseHandle, hMap
 .endif
     .IF hFile != NULL
       invoke CloseHandle, hFile
     .endif
     .IF g_bError == 0
        ;; show success message 
         invoke MessageBox, NULL, offset g_szDone, offset g_szDoneCap, MB_ICONINFORMATION
     .ENDIF       
     ret
;; ----- Show error message -----
OpenFileFailed:
     lea eax, g_szOpenFileFailed
     jmp ShowErr
GetFileSizeFailed:
     lea eax, g_szGetFileSizeFailed
     jmp ShowErr 
CreateMapFailed:
     lea eax, g_szCreateMapFailed
     jmp ShowErr
MapFileFailed:
     lea eax, g_szMapFileFailed
     jmp ShowErr
InvalidPE:         
     lea eax, g_szInvalidPE
     jmp ShowErr
ShowErr:
      invoke MessageBox, NULL, eax, offset g_szErr, MB_ICONERROR
      mov al, 1
      mov g_bError, al
      jmp LogicShellExit
;; ----- NEW SCETION-----
NewSection:
  call GetEip
GetEip:
  pop eax
  add eax, offset OrigAddressOfEntry - offset GetEip
  mov eax, dword ptr [eax]
  jmp eax
  OrigAddressOfEntry dd ?
EndNewSection:

CryptFile endp

AddSection proc uses ebx ecx edx esi edi, pMem:LPVOID, pSectionName:LPVOID, dwSectionSize:DWORD
  LOCAL dwNTHeader : LPVOID
  LOCAL dwFileAlign : DWORD ;文件对齐
  LOCAL  dwSecAlig : DWORD ;节对齐
  LOCAL dwLastSecTbl : DWORD ;最后一节地址(VA)   
  mov esi, pMem
  add esi, dword ptr [esi+03ch]
  mov dwNTHeader, esi
  assume esi : ptr IMAGE_NT_HEADERS
  mov cx, word ptr [esi].FileHeader.NumberOfSections
  movzx ecx, cx
  inc word ptr [esi].FileHeader.NumberOfSections
  push dword ptr [esi].OptionalHeader.FileAlignment
  pop dwFileAlign
  push dword ptr [esi].OptionalHeader.SectionAlignment
  pop dwSecAlig
 
  add esi, sizeof IMAGE_NT_HEADERS ;Section Header Base
  mov eax, sizeof IMAGE_SECTION_HEADER
  mov ebx, ecx
  imul ebx
  add esi, eax
 
  push esi
  sub esi, sizeof IMAGE_SECTION_HEADER
  mov dwLastSecTbl, esi
  pop esi ;; esi保存了新节地址
  ;; 设置新节
  assume esi : ptr IMAGE_SECTION_HEADER
  push esi
  lea edi, [esi].Name1
  mov esi, pSectionName
CopySectionNameLoop:
  lodsb
  test al, al
  jz EndCopySectionNameLoop
  stosb
  jmp CopySectionNameLoop
EndCopySectionNameLoop:
  pop esi
  ;;属性
  push 0E00000E0h
  pop dword ptr [esi].Characteristics
  ;;VirtualSize
  push dwSectionSize
  pop dword ptr [esi].Misc.VirtualSize
  ;;SizeOfRawdata
  invoke PEAlign, dwSectionSize, dwFileAlign
  mov dword ptr [esi].SizeOfRawData, eax
  ;;VirtualAddress, PointerToRawData
  mov eax, dwLastSecTbl
  assume eax : ptr IMAGE_SECTION_HEADER
  mov ecx, dword ptr [eax].VirtualAddress
  add ecx, dword ptr [eax].Misc.VirtualSize
  mov ebx, dword ptr [eax].PointerToRawData
  add ebx, dword ptr [eax].SizeOfRawData
 
  invoke PEAlign,ecx,dwSecAlig
  mov dword ptr [esi].VirtualAddress, eax
  invoke PEAlign,ebx,dwFileAlign
  mov dword ptr [esi].PointerToRawData, eax
  ;; SizeOfImage
  mov eax, dword ptr [esi].VirtualAddress
  add eax, dword ptr [esi].Misc.VirtualSize
  invoke PEAlign,eax,dwSecAlig
  mov edx, dwNTHeader
  assume edx : ptr IMAGE_NT_HEADERS
  mov dword ptr [edx].OptionalHeader.SizeOfImage, eax
 
  push dword ptr [esi].PointerToRawData
  pop edi
  add edi, pMem
  ;; clear new Section
  mov ecx, dwSectionSize
  xor eax, eax
  cld
  rep stosb
 
  ;; return New Section Address(VA)
  mov eax, esi
  assume esi : nothing
  assume eax : nothing
  assume edx : nothing
  ret
AddSection endp

PEAlign proc uses ecx edx, dwTarNum : DWORD, dwAlignTo : DWORD
  mov ecx, dwAlignTo
  mov eax, dwTarNum
  xor edx, edx
  div ecx
  cmp edx, 0 ;; edx保存余数
  jz AlreadyAligned
  inc eax
AlreadyAligned:
  mul ecx
  ret
PEAlign endp

end Start

第十二章 软件壳(一)(Android 软件壳) 文章目录软件壳Android 软件壳 软件壳 Windows 平台的软件壳 压缩壳 着重于减小软件体积 代表 UPX ASPack NSPack 不采用软件保护技术 没有用于进行调试器检测的代码 加密壳 产品众多 大多被恶意软件用来对抗杀软查杀 可配合压缩壳进行多次加密,达到较高强度的加密效果 保护壳 比加密壳更难脱壳 强调高强度的代码保护,包括对调用 API 的方法抽取、多进程保护、内存校验、反调试器与虚拟机、系统注入等 代表 Armadillo ASProtect SafeGu 阅读详情

相关推荐

SolidWorks抽壳功能实战:从基础操作到高级应用

本文系统讲解了SolidWorks抽壳功能,从基础的单面、多面及闭合抽壳操作,到锥体、圆柱等特殊几何体的应用,再到应对不规则实体和实现部分抽壳的高级技巧。文章重点剖析了操作逻辑、常见失败原因及排查思路,旨在帮助用户深入理解并掌握这一核心建模功能,提升设计效率。

weixin_29281915的博客 436

Smarty---section 简介

section:  section的产生是为解决foreach的不足的,与foreach一样,它用于设计模板内的循环块,它较为复杂,可极大程序上满足程序需要,所以在程序中我习惯使用它而不使用foreach,基本原形为: {section name = name loop = $varName[, start = $start, step = $step, max = $max, show

Tech_web的专栏 705

理解的层次:从表面到本质的认知过程

《理解的层次:从表面到本质的认知过程》引言 认知是人类智慧和技术的基石。从简单的观察和记忆,到复杂的思维和决策,认知过程贯穿于我们日常生活的方方面面。然而,我们如何理解这些认知过程?它们又如何影响我们的学习和工作?《理解的层次:从表面到本质的认知过程》这本书旨在探讨这些问题,并通过详细的案例分析,揭示出认知过程中的多层次

AI天才研究院 1220

smarty中section的使用

在smarty的使用过程中,有很多时候需要将一个数组输出到模板中来处理,以下将演示如何将一个索引(index)数组和关联(assocaite)数组在页面中展现出来。 本文中假设有如下一个索引数组 1、索引数组 $people = array('tony','sweety','abc','four'); $smarty->assign('people',$people);

mingbo9的博客 294

22.聚合的核心-为什么说聚合是业务规则的保护壳-深入理解聚合本质

本文探讨了DDD战术设计中聚合(Aggregate)的核心价值。文章通过一个订单修改地址的案例,揭示了传统贫血模型存在的问题:业务规则泄露、数据一致性风险、模型职责不清。聚合的本质是为业务规则和数据一致性提供"保护壳",它将相关领域对象捆绑为单一单元,通过聚合根作为唯一访问入口,封装业务逻辑并维护内部一致性。重构后的代码将业务规则内聚到Order聚合中,使其成为规则的守护者,解决了贫血模型的痛点。聚合是DDD中最核心的概念之一,掌握聚合就掌握了DDD的精髓。

yonggeit的博客 3062

PEiD查壳工具深度解析与实战应用

PEiD或许已经不再时髦,界面土得掉渣,数据库十年不更新……但它所体现的静态特征分析思想,依然是现代二进制检测的核心基础。无论是YARA规则、沙箱检测,还是AI驱动的恶意软件分类模型,本质上都在重复同一件事:寻找异常模式。所以,不要问“PEiD还能不能用”,而要问:“我能不能看懂它为什么会这么判断?当你不再依赖工具的输出,而是能自己推理出结论时——恭喜你,已经踏上了真正的逆向之路 💪。

weixin_32251525的博客 1450

PE File中取Section,用RVA还是用PointerToRawData?

在Dump PE File的section table时候,一开始选用RVA来计算section的地址,以期望能取到Section信息,后来发现不完全正确,应该用PointerToRawData的值。 如果根据自己定义的内存对齐的值,将FileAlignment和SectionAlignment设为相同的对齐方式,这个时候生成的PE文件,RVA和PointerToRawData的值指向同一个

qiqi5045的专栏 2795

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

大神教你用python识别电脑上面的恶意软件

导读:本文将利用静态分析技术揭示这些恶意软件的功能。 在本文中,我们将介绍恶意软件静态分析的基础知识。静态分析是对程序文件的反汇编代码、图形图像、可打印字符串和其他磁盘资源进行分析,是一种不需要实际运行程序的逆向工程。虽然静态分析技术有欠缺之处,但是它可以帮助我们理解各种各样的恶意软件。 通过细致的逆向工程,你将能够更好地理解恶意软件二进制文件在攻击目标后为攻击者提供的好处,以及攻击者可以隐藏并继续攻击受感染计算机的方式。正如你将看到的,本文结合了描述和实例,每个部分都介绍了静态分析技术,然后说明其在实际分

pythonxiaopeng的博客 1130

Sciter教程_00_创建HelloWorld工程

本教程记录Sciter工程的创建和编译运行的过程。

qq_36707072的博客 2277

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4567

AI 套壳,不在于 AI,在壳。

并不一定要曾经泡在某个具体的行业里埋头苦耕,然后解决了某个前人没有解决过的科研问题并成功发表一篇文章的人,才有这个资格——有这样的经历当然更好,但这都不是做产品的必要条件,做产品是一个工程问题,工程问题有工程问题的解决方式。所以,「我们到底能不能提供满足用户要求的 AI 质量」这个让人迷茫、不具备实操的指导性的问题,其实应该转换成这个更加具备落地可行性的问题——我们的产品在功能、交互、服务稳定性、工程化层面,换句话说在「壳」的层面,是否做到了比 Chatbot 功能更好用、更省时间、更让人放心。

Yansoul_的博客 401

基于STM32L4XX、HAL库的RTL8211FSI-CG以太网收发器(PHY)驱动程序设计

一、简介:RTL8211FSI-CG是Realtek公司生产的一款高性能、低功耗的单端口10/100M以太网收发器(PHY)。它通过RMII(Reduced Media Independent Interface)或MII接口与MAC控制器连接。

zhusl6688的博客 531

理解矩阵和特征向量的本质

理解矩阵和特征向量的本质 原文地址 最近复习矩阵论中,又是一堆定理和证明突然发现学了这么常时间的矩阵论、线性代数,记住的只是一堆莫名其妙的定理而已,一些本质的东西都没有搞清楚。 比如,为什么要有矩阵,它仅仅是一堆数的组合吗,集合也是数的组合,为什么不能代替矩阵? 特征值和特征向量的含义是什么?描述的是什么“特征”? 矩阵乘法的含义是什么? 相似变

sduuntion的专栏 2万+

DeiT详解:知识蒸馏的Transformer

DeiT模型(8600万参数)仅用一台 GPU 服务器在 53 hours train,20 hours finetune,仅使用 ImageNet 就达到了 84.2 top-1 准确性,而无需使用任何外部数据进行训练,性能与最先进的卷积神经网络(CNN)可以抗衡。其核心是提出了针对 ViT 的教师-学生蒸馏训练策略,并提出了方法,使得在视觉领域训练得又快又好。

走在深度学习前沿的小宋 2637

视频流推理的工程架构:YOLO模型如何做到单卡处理16路1080P实时流?

<think>我们只需要根据内容生成摘要,不超过150字。内容是关于YOLO模型单卡处理16路1080P实时流的技术分析,包括方案对比、架构设计等。摘要要简洁,突出关键点。</think>本文深度解析了YOLO模型单卡处理16路1080P实时流的技术方案,对比EagleEye、TensorRT+DeepStream、华为CANN及RK3588四条路线,重点介绍流水线架构、并发模型及显存优化,指出消费级显卡(如RTX 4090)即可实现高并发智能视觉分析。

2601_95807009的博客 162

节空白区添加自己的代码【滴水逆向44笔记】

我们了解PE结构就知道,节与节之间有一些空白区,那么我们能否在这些空白区添加自己的代码呢?答案是肯定的,我们来看看这一节课的内容:

WdIg-2023的博客 734

第244篇 视觉SLAM后端之BA优化——Bundle Adjustment的原理

本文介绍了SLAM后端优化中的Bundle Adjustment(BA)技术。BA通过同时优化相机位姿和3D路标点位置,最小化重投影误差,解决前端估计的累积误差问题。文章详细讲解了BA的数学原理,包括目标函数构建、Gauss-Newton法和Levenberg-Marquardt法求解过程,以及利用稀疏性和Schur补加速计算的关键技术。对比了全量BA和增量BA的优缺点,并介绍了Ceres、g2o等工程实现工具。BA作为SLAM后端的核心算法,其理解深度直接影响系统性能优化能力。

郑伟强dev的专栏 350

映射的本质是理解

映射中的两个集合并非因果关系,而是一直存在在那里,只是有某种联系(f)。

2yS的博客 1059

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python编程的真谛:超越语法,理解编程本质

Python语法是编程的起点,但真正的精髓在于理解编程的更广泛概念。编程风格、项目结构、函数式编程、算法分析和面向对象编程共同构成了编程的核心能力。这些技能不仅让你编写更好的代码,还培养了解决复杂问题的能力。编程是一种思维方式,赋予你创造和改变世界的能力。语法只是语言,逻辑、设计和问题解决才是编程的灵魂。超越Python语法,拥抱编程的本质,你将发现无限可能。写出好代码的第一步,不是敲键盘,而是学会思考。

朱雀随云记的博客 1323

STM32F407中文手册

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

ELF 文件格式深度解析:从节区到段,链接视图与运行视图的统一理解

本文系统介绍了ELF二进制文件格式的核心结构,重点解析了节区(Section)与段(Segment)的区别与联系。ELF文件包含文件头、程序头表(段信息)、节区内容和节区头表四部分,分别服务于链接器和加载器。节区是链接视角的逻辑单元,包含.text、.data等代码数据;段是运行视角的内存映射单元,由多个节区按属性聚合而成。文章还详细阐述了ELF的动态链接机制、安全优化特性,并提供了常用分析工具。理解ELF的双重抽象设计,是进行系统编程、安全分析和性能优化的基础。

lcreek的博客 1933

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

线性代数的本质大白话理解

【代码】线性代数的本质大白话理解。

qq_36812406的博客 2585

如何理解程序员职业的本质

如何理解程序员职业的本质 程序员这个职业,和其他职业非常不一样。这大概是由软件的本质决定的。 自动化 其他行业的工作,都需要由人来完成;今天做的事情,明天可能还要同样的做一遍。但这是人类工作的方式,不是机器工作的方式。 软件,仔细想想,它不就是一系列可以重复执行的命令么? 为了让机器去做重复的工作,我们才需要编码,通过各种编程语言告诉机器如何去完成一项特定的工作,而在这之后,这项工作就由机器完成了...

qq_35313772的博客 583

认清现实重新理解游戏的本质

游戏会成为我们工作和学习拖延的帮凶,游戏对我最大的危害就是拖延,玩了几十年游戏的人生注定不会过的那么精彩,因为所有的精彩都留在了虚拟的游戏世界(游戏开发商服务器数据库里的一条数据)游戏一直麻痹着我的神经,让我一次次假期变得拖延,让我一次次工作变得拖延,人生也被分为了游戏和现实两个部分,花大量时间在游戏中,最终带来的恶果让我过上注定平庸的一生,

https://blog.youkuaiyun.com/m0_74834215 915
上一篇: linux ThunderBird收发邮件
下一篇: linux挂在samba服务器
gnuser
博客等级 码龄20年 35粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值