Asm的魅力(二)

纹理特征提取方法——灰度共生矩阵(GLCM ) 灰度共生矩阵(Grey Level Co-occurrence Matrix)也叫做空间灰度级依赖矩阵(SGLDM),它是一种基于统计的纹理提取的方法。 阅读详情

 Author:charme
Data:2009.9.4
Index:hi.baidu.com/charme000

废话:
上一篇大牛牛们都说是出力不讨好,呼呼!我还是一贯作风吧:一笑而过。
做个简单的类比:
开发黑客软件的人笑只会使用软件入侵的菜菜肤浅,如果认可这个挂点的话,那研究asm本身实质的人就应该嘲笑利用asm搞逆向和破解的人了。

而实际上这是几个不同的领域,所以没有什么吃力不讨好的说法。
会写软件的人必然懂得入侵的原理,所以懂asm的人逆向只是个时间问题。

曾子曰:自作孽,不可活!
如果为了凑篇精华,拼凑代码科普出来,基本等于没有创造!!!我不干那样的事情!!

还是相信女王大牛的教诲:这个世界永远注重的是创造。

正文:
程序语言中的结构体是常见的访问内存中存储数据的一种方式,有点不必说了,大家接触过结构的都明白。那么asm中的结构用的当然也比较多。

结构可以嵌套,但是初学者必然的会有一些迷惑。

(一)明白结构访问的本质
首先看一个C语言中的结构使用:

代码:
Struct A
{
   Int charme;
}*a;

Struct B
{
  A c;
}*b

那么我们常常见到这样的访问方法:b->c.charme
那么->是个什么东西?(到现在我都不知道这叫个什么操作符,呼呼)为什么我们不写成这样的:b.c.charme?不就是访问成员嘛!!!到这里就是重点了,->操作符的本质是什么?

再看一段程序:

代码:
int  _ClientLogin( LPVOID _lpStruct)
{
  TranSocket  *stSock;
  ...
  int k = stSock->dwIndex;    //相当于取stSock.dwIndex 赋值给k
  ...
  return (0);
}

这是含笑大哥程序里摘出来的一段,重点注释部分。
看完这个我们可能就明白了,stSock只是一个指针,指向TranSocket结构的一个指针。这样做只是为TranSocket结构预留了一个空间,方便以后的初始化。
这就是->的本质!!!!!!!!!!!!!!!!!!这个必须搞清楚的,搞清楚了这个才能理解怎么嵌套。

(二)asm中的结构嵌套的错误
那么就之前的那个结构嵌套。很多人可能会这样写(我之前也是这么写的,呼呼):

代码:
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include user32.inc
includelib user32.lib
includelib kernel32.lib

aa struct
   charme dd ?
aa ends

bb struct
    charme1 dd ?
    cc aa <>
    
bb ends

.data?
p2 bb <>  ;;;;;;;注意
p1 aa <>  ;;;;;;;;注意

szEAX      db 8 dup('0'),0

strr1 dd ? 
.data
strr db "charme",0
.code
ExchangCode  proc w32BitCode:DWORD,lpCode:DWORD
    push  ebx
    push  ecx
    push  esi
    mov  esi,lpCode
    mov  eax,w32BitCode
    mov  ecx,8
    @@nextchar:  push  ecx
    rol  eax,4
    mov  ebx,eax
    and  ebx,0000000Fh
    cmp  bl,09
    jle  @@char0_9
    add  bl,07h
    @@char0_9:  add  bl,30h
    mov  BYTE PTR [esi],bl
    inc  esi
    pop  ecx
    loop  @@nextchar
    pop  esi
    pop  ecx
    pop  ebx
    ret
ExchangCode  endp 
main proc
    mov p1.charme,20h
    mov ebx, p2.cc.charme
        
    push offset szEAX
    push ebx
    call ExchangCode
    
    push 40h
    push offset strr
    push offset szEAX
    push 0
    call MessageBox
    
    
    ;push 03e8h
    ;call Sleep
    
    push 0
    call ExitProcess
main endp
end main

asm中没有->这样的操作符,那怎么实现b->c.charme这样的访问呢?只好是像上面这样写了
结果显示p2.cc.charme的值是0,意图来看应该是显示20h。
错误在哪里?
OD调试看看,可以很清楚的看到,内存空间中:
P1.charme--------------------------0400xxxxh
Charme1
P2.cc.charme----------------------0400yyyyh
根本就是两个变量,怎么可能访问到呢,,照这样看来我们这样修改下:
mov ebx, p2.cc.charme+4,就输出20h,但实际上这只是投机,只是跳过了charme1的空间,访问了下p1.charme,一点也不能通用。

(三)重写asm结构嵌套
之所以出现上面的错误,实际上还是因为没有真正的理解了结构访问成员的本质。Asm的魅力在于最大限度的接近人的思维,所以他很灵活,但是灵活的话就需要你掌握本质。否则灵活的旁边就是混乱。(我也搞不清楚这俩词到底有啥区别,呼呼)

那么在来看看

代码:
.386
.model flat,stdcall
option casemap:none

include D:/MASMPlus/Include/windows.inc
include D:/MASMPlus/Include/kernel32.inc
include D:/MASMPlus/Include/user32.inc
includelib D:/MASMPlus/Lib/kernel32.lib
includelib D:/MASMPlus/Lib/user32.lib


X struct
  a  dd  10h
  b  db  10 dup(?)
X ends

Y struct
  cc  dd  ?
  d  dd  ?
  e  db  ?
Y ends

M struct
  p  X  <>
  q  Y  <>
M ends

.data
stMy  M  <>

szEAX      db 8 dup('0'),0
szTitle db "charme",0

.code
ExchangCode  proc w32BitCode:DWORD,lpCode:DWORD
    push  ebx
    push  ecx
    push  esi
    mov  esi,lpCode
    mov  eax,w32BitCode
    mov  ecx,8
    @@nextchar:  push  ecx
    rol  eax,4
    mov  ebx,eax
    and  ebx,0000000Fh
    cmp  bl,09
    jle  @@char0_9
    add  bl,07h
    @@char0_9:  add  bl,30h
    mov  BYTE PTR [esi],bl
    inc  esi
    pop  ecx
    loop  @@nextchar
    pop  esi
    pop  ecx
    pop  ebx
    ret
ExchangCode  endp
start:
  ;;正确做法一
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;lea   ebx, stMy ;;指向M结构的一个指针

  ;mov eax,(M ptr [ebx]).p.a;;必须加上M ptr因为C里面我们也看到了,实际上这个指向M结构的指针已idngyao确定是某个结构的,,因为你lea   ebx, stMy只是初始化了一个指针,并没有给你要初始化的结构分配空间
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  ;;正确在做法二
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;mov ebx,sizeof M
  ;;mov eax,stMy[ebx].p.a
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  ;;正确做法三
  lea esi,stMy.p
  mov ebx,(X ptr [esi]).a
  
  
  
  push offset szEAX
  push ebx
 
  call ExchangCode
  
  push 40h
  push offset szTitle
  push offset szEAX
  push 0
  call MessageBox
  
  ret

end start

上面我用了三种方法,实际上本质是一样的。

看看方法一和方法三,你可以对比出一个规律来:就是我们确定了指针,一定要明确他是要初始化一个什么样的结构。

方法二是可扩展的。
比如有一个叫做AA的结构,先假设他有两个成员
我们定义一个结构数组:aa AA 3 dup(<0,0>)
那么我们可以循环赋值,下面给一个示例:

代码:
AA struct
   Ch1 dd ?
Ch2 dd ?
AA ends

.data
Align word
aa AA 3 dup(<0,0>)

.code
Start:
Mov edi,0
Mov ecx,3
Mov eax,1
Loopp:
Mov (AA ptr aa[edi]).ch1,eax
Mov (AA ptr aa[edi]).ch2,eax
Add edi,TYPE AA  ;;或者是SIZEOF AA,这里获得的大小就是结构数组里单个数组的大小
Inc eax
Loop loopp

Push 0
Call ExitProcess
End start

当然我们也可以每个ch1 ch2初始化不同的值,含笑大哥提到了有两种方法:
接受键盘输入和预设初值为一个数组

方法一和C语言里的访问形式就很接近了,但是很多人这样写:

代码:
lea   ebx, stMy

mov eax, [ebx].p.a

这样是不对的,,,[EBX]并不足以确定一个他属于什么样的结构,当然结构里的成员无从得知了。


不管怎么样吧!asm里使用结构对程序的组织和效率是很有帮助的。。

EditPlus汇编语言ASM高效开发模板配置方案 经过这一整套配置,你的 EditPlus 已不再是简单的记事本替代品,而是一个专为汇编优化的迷你IDE。它拥有:✅ 语义级语法高亮✅ 智能补全与模板输入✅ 外部构建链无缝集成✅ 错误定位与快速跳转✅ 跨平台编码兼容这一切都源于两个小小的配置文件:.stx和.acp。正如一位老程序员所说:“工具不在贵,而在懂你。当你能在 10 秒内完成一次汇编链接并定位错误,你就知道什么叫“生产力自由”了 🎯。所以,还等什么? 阅读详情

相关推荐

asm的魅力系列(浅显易懂)

学习汇编的入门资料(共5个章节)ppt格式,可以轻易复制里面的东西

记asm的从零到入门的摸索过程

asm是一个操作class字节码文件的框架。通过对底层class文件进行修改,以达到一些全局的目的。 对于asm的初次接触源于自己对于Android中埋点方式的感兴趣,因为有用过一些三方埋点框架,完全不用添加任何额外的代码,却能采集到app中的很多时间,包括但是不限于点击事件输入事件,页面跳转等等。对于他们的实现比较感兴趣,自己想过一些方式实现,本来想通过hook的方式,替换掉View中的OnCl...

lemon15588的博客 1691

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?

海思(Hi3521a)uboot详细分析(6)——uboot启动第二阶段start_armboot函数分析

uboot 在start.S中完成了第一阶段启动后,由汇编语言调用C语言函数start_armboot进入第二阶段的启动,在海思给的Uboot代码中,该函数定义在/u-boot-2010.06/arch/arm/lib/board.c。它主要完成了: 全局变量的初始化 初始化硬件及软件数据结构 初始化uboot堆管理器 flash驱动初始化 环境变量重定向 输入输出初始化 其..................

Biao 3209

山区道路边坡落石隐患检测数据集VOC+YOLO格式241张1类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

高空作业栏杆检测数据集VOC+YOLO格式230张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

二维数组(矩阵)对角线输出

今天在BBS里面看到这样的面试题目,   1,二维数组(N*N),沿对角线方向,从右上角打印到左下角如N=4: 4*4二维数组  { 1 2 3 4 } { 5 6 7 8 } { 9 10 11 12 } {13 14 15 16 } 打印顺序  4 3 8 2 7 12 1 6 11 16 5 10 15 9 14 13 要求半个小时内写出可完整运行的代码。 ...

venusdrogon的专栏 1220

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

如何在字节码层面实现方法拦截:探索 Java Agent 与 ASM 的魅力

通过本文的探索和实践,我们深刻体会到了 Java Agent 和 ASM 的魅力,它们为我们提供了无限的可能性,让我们能够更加灵活和精确地控制和改变程序的行为。这样,当我们将生成的 JAR 文件作为 Java Agent 使用时,Java 虚拟机会读取 JAR 文件中的 MANIFEST.MF 文件,并根据其中指定的入口类启动 Java Agent。使用 ASM 库进行字节码的读取和修改。总体而言,这段代码的作用是在指定的类中的每个方法中插入一段代码,在方法调用处打印堆栈信息,用于统一处理异常的情况。

BASK2311的博客 715

光伏板太阳能板尘土灰尘脏污检测数据集VOC+YOLO格式1006张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

嵌入式SPI总线抽象设计:跨平台驱动与分层解耦实践

SPI(串行外设接口)是嵌入式系统中应用最广泛的同步串行通信协议,其核心价值在于高吞吐、低开销与硬件简洁性。其工作原理基于主从架构、全双工/半双工时序及片选(CS)控制,依赖CPOL/CPHA组合定义四种标准模式。在工程实践中,SPI常面临硬件资源受限、多外设共用总线、MCU平台迁移等挑战,导致驱动复用率低、维护成本高。通过结构体+函数指针实现的分层抽象——将物理总线、协议适配与设备驱动解耦,可显著提升代码可移植性与扩展性。该方法天然支持硬件SPI与GPIO模拟SPI双模式切换,并已在STM32等主流MCU

weixin_42601134的博客 60

脚本的魅力 二

前面文章(http://blog.youkuaiyun.com/gangyilovevc/archive/2009/06/05/4245807.aspx) 介绍过手工爆破飞秋方法,其实说到底无非就是修改两条指令,关键是怎么找,找到了就是 两句话。/*     飞秋(FeiQ) 一款局域网既是通讯工具。ver2.4    by: ListenWind    email: gan

gangyilovevc的专栏 748

三相SST固态变压器详细设计案例

本案例针对400kVA、30kHz三相固态变压器(SST)开展详细设计,核心采用输入串联输出并联(ISOP)拓扑架构(模块化多电平矩阵变换器M3C简化版),重点完成高频变压器的参数计算、绕组设计、损耗分析及液冷温升验证,同时覆盖系统级架构设计、半导体损耗估算及整机效率优化,全流程基于当前电力电子技术可行性展开。

qq_32103755的博客 3305

探索代码世界的新视角:MyGitBooks与ASM

探索代码世界的新视角:MyGitBooks与ASM 在编程学习和实践中,拥有一个强大的资源库和深入理解底层机制的能力至关重要。今天,我们要向您推荐一个独特且富有洞察力的开源项目——,这是一个关于Java字节码操作语言(ASM)的学习资源集合,旨在帮助开发者更透彻地理解和利用ASM。 什么是ASM? ASM是一个低级别的Java字节码操纵框架,它允许你在运行时动态生成类或修改现有类。通过ASM,您可...

gitblog_00085的博客 377

DC-DC电源PCB布局实战:从EMI优化到热管理

本文深入探讨了DC-DC电源PCB布局的核心实战技巧。文章从分析电流环路入手,强调通过优化“黄金三角”布局以最小化环路面积,从而有效抑制EMI并提升效率。详细阐述了功率器件摆放、地线分割、敏感信号布线、电感下方铺铜策略以及热管理设计等关键步骤,为工程师提供了一套从理论到实践的完整布局指南。

z5a6b的博客 722

PID控制器(位置式和增量式)

PID控制算法

zhinian_hao的博客 4512

FRASM push的使用

push只能保存16位寄存器不能保存8位寄存器   push ah这都是违法的 功能是备份和还原数据    .MODEL SMALL  .STACK 64 ;******************************************  .DATA ;******************************************  .CODE MAIN PROC F

grett的专栏 1836

matlab电偶极子源码,电偶极子的MATLAB场模拟

电偶极子周围电场电势分布的MATLAB三维模拟Matlab可以用于模拟四维场的效果,本文以电偶极子的电场和电势场为例展示MATLAB在该方面领域的应用。摘要电偶极子由一个正电荷和一个负电荷组成,其电场和空间电势分布与单电荷相比具有一些重要的特性。本文将给出电场和电势场的近似表达式。这两个量的精确表达式是复杂的,不太常用,因此 MATLAB 被采用来操作精确值和绘制三维分布的远区域, 近区域和一侧区...

weixin_35135480的博客 3150

ASM(active shape models)算法介绍

ASM是基于统计学习模型的特征点提取的一种方法。这个方法是95年就提出来的,不过至今仍是我认为比较好的人脸特征点提取的方案。方法的提出人Tim Cootes后来还提出了aam算法,也很有名,但如果简单是特征点的定位的话,我认为asm的效果可能更好一些。ASM跟大多数统计学习方法一样,也包括train和test(or fit)两部分,也就是形状建模build和形状匹配fit。这个算法其实很简单,可以

迭代的是人,递归的是神 2万+

Windows下TensorRT+YOLOv11部署避坑指南:从CUDA配置到模型加密全流程

本文详细解析了在Windows平台部署YOLOv11与TensorRT的全流程,重点涵盖从CUDA环境配置、工程编译适配到模型加密保护的实战指南。基于wang-xinyu的tensorrtx仓库,提供了详细的版本选择、编译问题修复方案,并深入探讨了如何对TensorRT引擎进行加密,以实现高效且安全的端到端部署。

vscode5coder的博客 450

萤石摄像头批量下载视频后FFmepg拼接

本文描述萤石摄像头,如何批量下载视频,然后把视频片段拼接为一个完整的视频,亲测有效。有问题,可以下面留言

烤鱼哥哥的博客 1202

用汇编的眼光看C++(之嵌入汇编)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式汇编是对纯汇编文件的一种有益补充。通常会有下面几种情况使用到汇编:(1)提高代码的工作效率 ,使用到cpu的一些特殊指令,比如说mmx指令;(2)对硬件进行某种特殊的操作,比如说关中断等,这在内核级的代码中是比较常见的。但是我们讲究嵌入式汇编的一些基本点和大家一起讨论一下,建...

javasee 276

DFT笔记 DC/AC mode与Func

DFT scan可以分为DC和AC两种,区别如下图。

m0_61544122的博客 5730
上一篇: 使用RSA1024算法防止软件被Keygen
下一篇: SMC之抛砖引玉(VC++6.0)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值