标签搜索

反汇编c语言

wflaaa
2024-05-09 / 0 评论 / 28 阅读 / 正在检测是否收录...

jcczhil



xor eax, eax

1 ^ 2 = 3

3 ^ 2 = 1

1 ^ 1 = 0

mov eax, 0

ret 改变 eip 寄存器的值, mov eip, [esp] add esp,4
eip: 当前程序代码运行的位置 永远指向

`写代码时

调用函数 一般有三个规则

参数传递的不同样

push xx 到堆栈中
前几个参数放到寄存器中,这样可以加快调用, fastcall

平栈 方式不通

内平栈  ret xxx
外平栈 ret结束之后, add esp,xxx

_cdecl

call xxx
add esp,xxx

sub 等价 cmp
但 sub 会产生实际的减法效果。
cmp 只会影响 eflags 寄存器

jge
根据 eflags 寄存器来 判断是否需要进行跳转。

jcc 指令

for()

for 循环的 伪代码表现形式

初始化代码:

i = 0;

jmp 比较代码

累加的代码:

i++;

比较代码:

i < 50;
jcc 比较时,会反过来比较。 因为汇编中若满足条件则直接跳出循环。 而在c语言中,若满足条件,则继续执行。故相反。

jcc 结束循环

执行 for 循环体:

jmp 累加的代码

结束循环:

do {
    // 循环体

} while (exp);

循环开始:

循环体代码:

jcc 循环开始

while(exp)
{

}

循环开始:
比较 与for循环一样,判断条件在汇编中与c语言是反过来的。
jcc 循环结束

循环体代码

jmp 循环开始
循环结束

if()
{
if 代码
}
else if(xx)
{
else if 代码
}
else{
else 代码
}

if elseif else 伪代码形式

jcc elseiflab
jcc elseiflab

if代码
jmp 判断结束

elseiflab:

jcc elselab
elseif 代码
jmp 判断结束

elselab:
else代码

switch 优化

多个 case 标签 并且连续 小表,根据表来进行快速跳转。

`

我在网上找了个教学书有兴趣的可以和我一起学习

4

评论 (0)

取消