两段代码,实现的功能是相同的,但代码的长度却有较大区别.
代码段一:
mov edi, offset szText or ecx,0FFFFFFFFH xor eax, eax repne scas BYTE ptr es:[edi] not ecx dec ecx
代码段二:
mov edi, offset szText or ...
PE文件头逻辑结构
[转自百度百科]
1988年王江民接触计算机开始于工控。王江民意识到要搞光机电自动化,必须依靠计算机来控制,不学计算机肯定会落后。“我38岁开始学计算机,没有感觉我老了,没有感觉我不行,只感到我的英语基础不好。再说,计算机是实践性非常强的学科。我搞计算机是用计算机,不是学计算机。”
在Win32汇编中,对于SEH异常处理回调函数的设置,只有3条简单的指令,但要真正理解起来,还真不容易.
指令如下:
push offset _Handler ;回调函数地址入栈
push fs:[0] ;原先的EXCEPTION_REGISTRATION 结构地址入栈
mov fs:[0],esp ;把当前栈顶地址赋予fs:[0]
如果只看这3条指令是无法理解的,必须结合单链表的头插入法来理解它.
首先,可以把fs:[0] 当作头指针来看待;(注意:fs:[0]就是NT_TIB结构中ExceptionL...
初学PE文件,总结一些经验。1、为什么在PE文件中有DOS文件头和DOS块? 因为,防止PE文件在DOS系统下执行。PE文件是在Windows系统下的可执行文件格式。如果在DOS系统下执行,就会显示一句:This program cannot be run in DOS mode .这句话是在DOS块中的。当然,你也可以在DOS块中安排一个16位汇编的程序,使得PE文件在DOS系统下也有一定的功能。
2、Windows装载器装载PE文件的第一步简要过程是怎样的? 首先,要读取文件头的前两个字节4D 5A,从而知道这是DOS文件头(标记是MZ);遍历DOS文件头的结构IMAG...
1. Opcode (operation code) :操作码
2. Instruction :指令
3. 64-Bit Mode :64位模式
4. compat/Leg mode :适用/支持 模式 ?
5. description :描述,说明
6. Valid :有效的
7. Invalid :无效的
8. r/m32 :寄存器或内存,32位(其它类推)
9. imm3...
刚学习指针的时候,不知道它是什么;老是和其它的数据区别不出来~~
过了好久,才知道,指针就是个地址而已~~
现在看来,指针不只是个地址了~~
指针啊~~你真的是无时不在、无处不有啊~~
EIP ,是指令指针寄存器;指令不是不等长的吗?EIP怎么知道每执行完一条指令就要增加(减少)多少字节呢?
呵呵~~我想,指令的长度一定是固定的,而每条指令读或写的数据长度也应该是有规定的~~比如,根据寄存器确定数据长度;要是没有寄存器参与,就要WORD PTR 或DWORD PTR 了~~
在处理字符串中,常用某个变量或寄存器来记录 字符个数 ,其实它也算个指针...
lodsb 指令:从esi 指向的源地址中逐一读取一个字符,送入AL 中; (然后,可以先判断这个字符是什么字符,如0dh,0ah 之类等,再执行相应的操作);
stosb 指令:一般跟随在lodsb 指令后面,将AL 中的字符逐一写入edi 指向的目的地址;
如果是lobsw ,表明要处理的是字,而不是字符;则采用的相应指令是:stosw ;那么要判断的寄存器是AX,而不是AL 了.
如果是lobsd ,表明要处理的是双字;则采用的相应指令是: stosd ;这时候,要判断的寄存器就是EAX 了.
好久不摸C语言了。
所以,在学习WIN32汇编的时候,不小心被两个函数给唬住了:lstrcpy ,lstrcat
在排毒(BAIDU)上搜了一下,才知道它们的原形竟然在C语言里!
strcpy 原形:char *strcpy(char *str1,char *str2) 功能:将str2字符串复制到str1中;
strcat 原形:char *strcat(char *str1,char *str2) 功能:把字符串str2连接到str1后面,原“\0”被取消。
返回值都是:str1 .
偶是个电脑业余爱好者,没有经过正规的学习.所以偶然发现一些小技巧就比较高兴.
以前我只是知道"删除键(BACKSPACE)"有删除字符的作用.
没想到它还能"后退":
即,我们在浏览网页的时候,如果要退回上一页,往往用鼠标去点击工具栏上的"后退"按钮,其实也可以按"删除键(BACKSPACE)"达到这个效果.还有,我们在打开文件夹的时候,往往也点击"向上翻"来退回上一个目录,现在也可以用"删除键(BACKSPACE)"代替的.
有WIN32汇编中,如果要表示的是16进制的数据,则在其后面加H字母;如果要表示的是2进制的数据,则在其后面加B字母;如果要表示的是10进制的数据,则在其后面什么也不加.示例:mov eax,10h ;这里10进制是16mov edx,10 ;这里10进制是10mov ebx,10000b ;这里10进制是10
;用WIN32汇编演示双重循环的用法(也可把内循环做成子程序,用外循环去CALL);从2个红球,3个白球,4个黑球中任意取出5个球,且其中必须有白球,有几种可能的组合情况?;============================================================================ .386 .model flat,stdcall option casemap:none
include windows.incinclude user32.incinclude kernel32.incinc...
经常反汇编的话,在调用子程序开始的地方,都会看到:push ebpmov ebp,espadd esp,FFFFFFF8 ;也可能是其它的值... ...
这种情况的指令形式。编译器采用的是“+”的方法来开辟局部变量的空间的。其实,我们要知道FFFFFFF8真正的值的话,就得采用“补码取反加1”才知道它的“绝对值”,是8。有没有更加方便的方法呢?有!我们知道,正数+负数=0(前提是两者绝对值相等),所以,我们用“0-负数”的方法也可以得到“正数”,即“绝对值”。00000000-FFFFFFF8=800000000-FFFFFFAC=54当然,这种算法涉及到最后一位的借位问题,把这点...
在学习Win32汇编的过程中,发现一个有趣的现象: 在使用wsprintf这个函数的时候,反汇编到调用这个函数的代码处,发现其后总是跟着这样的指令:add,esp,0000000c ,这里的0000000c (会随着参数的个数发生变化)其实就是12个字节,正好是传递给wsprintf函数的3个参数曾经使用的栈空间值.这条指令等于是把wsprintf的参数都扔掉了(主动清除堆栈)。这条指令是谁设的呢?编译器!