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
汇编
加密与解密