170507 汇编-直接定址表,反编译-算法分析

1625-5 王子昂 总结《2017年5月7日》 【连续第218天总结】

A. 汇编语言 第十六章 100%

加密与解密 算法分析 100%

B. 直接定址表:

标志是table,作用是建立一种key和value的对应关系。更接近于字典

eg:

table  db '0123456789ABCDEF'

mov bx,3

mov ah,table[bx]

则ah中就送入了table中的第4位的值,'3'的ASCII码值

还可以eg:

table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180 ; 把table作为字符串偏移地址表

ag0 db '0',0 ;以0标志字符串结束

ag30 db '0.5',0

...

mov bx,1

add bx,bx ;因为地址表的单位是字,所以每个是2字节

mov bx,table[bx]

...

mov ah,cs:[bx] ;bx此时为对应内容的偏移地址,通过这种方法取出对应的内容


还可以直接在直接定址表中存放子程序的地址,这样可以更加方便地调用


OD中,直接修改内存进而屏蔽程序的某些功能或改变程序流程的方法称为patch(补丁)或爆破

在C++规范中参数按照从右往左的顺序入栈,因此在汇编代码中则是依次将对应的寄存器push入栈(为了保护现场)后,在子程序中调用相应的寄存器放置参数

跟着书本进行了一遍C++代码与汇编代码的比较,理解起来略有困难,但是一点一点看完还是挺有收获的

xor指令:异或,两参数按位比较,不同得1,相同得0

本程序中用于置零:xor esi,esi ;将esi置0

jle指令:jump low equal,cmp比较结果为小于等于时跳转至标号,否则不动

本程序中用于判断,包括for的结束条件和if中使用<=时

在进入循环之前,将循环中会用到的寄存器push入栈(若循环中也用到了栈,则必须在循环内完全清空使用部分,避免影响外部)来保护环境,留出相应的寄存器给循环内使用

C++的for循环转换为汇编指令时,赋初值完成后会先进行结束条件判断,如果符合则直接跳至结尾,不符合则将寄存器push,然后开始循环

eg:

;for(i=3,j=0;i<len;i++,j++)

mov edi,[esp+18] ;函数的参数len的值从栈中取出放入di寄存器

mov ecx,3 ;给i=0

xor esi,esi ;code=0

xor eax,eax ;j=0

cmp edi,ecx ;len<=i的比较

jle end ;若len<=i,即i>len,即不满足i<len,则跳转至循环结束的位置

push ebx ;满足循环条件,寄存器入栈保护环境,开始循环

...;循环体

pop ebx ;还原环境。注:若初次判断就不符合循环条件,则直接跳过循环,不对寄存器入栈,因此也不需要出栈还原环境。

end: ... ;循环结束

C++中的数组调用时,如name[i],Table[j],在汇编代码中显示为

mov dl,[ecx+ebp] ;ebp中存放的是name的首地址

mov bl,[eax+405030] ;405030是数据表的首地址

;ecx和eax分别对应i和j,实际上为偏移地址

C.明日计划

PYQT

汇编

加密与解密

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值