
一直到今天才找到滴水的逆向练习
arg_0= dword ptr 8
arg_4= dword ptr 0Ch
push ebp //保存当前执行函数栈栈底
mov ebp, esp //平栈,将当前函数栈顶赋给栈底,相当于开辟新空间执行下面的代码
push ebx
push edi //使用中的寄存器压栈,当前函数执行完之后需要将两个寄存器中原先的值弹回寄存器
mov eax, [ebp+arg_0]
mov edi, [ebp+arg_4]
mov [edi], eax
cpuid
mov [edi+4], eax
mov [edi+8], ebx
mov [edi+0Ch], ecx
mov [edi+10h], edx
pop edi
pop ebx //弹回原先寄存器
leave
retn 8
重点分析中间代码
mov eax, [ebp+arg_0]
mov edi, [ebp+arg_4] //只能分析出将栈空间中两个值存入寄存器,具体这两个值是什么未知
mov [edi], eax //将存入eax中的值存入edi中存的地址值,由此得出[ebp+arg_4]中存的是个指针变量
cpuid //百度查了半天才知道,cpuid是获取cpu的信息,返回值会存在下面四个寄存器中
mov [edi+4], eax
mov [edi+8], ebx
mov [edi+0Ch], ecx
mov [edi+10h], edx //将四个寄存器中的值依次存入edi存放的地址位置
由此大概可以推断出,该函数的功能应该是获取CPU信息
问题:最后的leave指令是否将压栈的原函数栈底弹回来了???
为什么中间要将存入eax中的值存入edi中存放的地址???
本文通过滴水的逆向练习,深入探讨如何获取CPU信息。主要内容涉及代码分析,重点关注特定指令的作用,如leave指令是否恢复原函数栈底,以及eax到edi的值传递目的。
261

被折叠的 条评论
为什么被折叠?



