如何逆向分析windows api函数 FindFirstFile

如何逆向分析windows api函数 FindFirstFile,第1张

关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。涉及文件处理时,这个函数通常与vb的close命令相似。

应尽可能的使尺拍差用close,因为它支持vb的差错控制。注意陵皮这个函数使用的文件句柄与vb的文件编号是完全不同贺历的。

直接替换使用

float

float2

float3

float4

float

float2

float3

float4

float

float2

float3

float4

直接替换使用

float

float2

float3

float4

float

float2

float3

float4

float4x4

可直接替换

float

float2

float3

float4

float3

使用 dFdx 替代

使用 dFdy 替代

float

float4x4

float2

float3

float2

float3

float

可以直接替换悄薯

可以直接替换

fmod(x, y)

返回a / b的浮点余数

float

frac(x)

返回输入值的小数部分

可以直接替换

frexp(x, exp)

返回输入值的尾数和指数

fwidth(x)

返回 abs ( ddx (x) + abs ( ddy(x))

float2

isfinite(x)

如果输入值为有限值则返回true,否则返回false

isinf(x)

如何输入值为无限的则返回true

isnan(x)

如果输入值为NAN或QNAN则返回true

ldexp(x, exp)

frexp的逆运算,返回 x * 2 ^ exp

length(v)

返回输入向量的长度

float2

float3

lerp(x, y, s)

对输入值进行插值计算

float3

lit(n • l, n • h, m)

返回光照向量(环境光,漫反射光,镜面高光,1)

log(x)

返回以e为底的对数

float

log10(x)

返回以10为底的对数

float

log2(x)

返回以2为底的对数

可直接替换

max(x, y)

返回两个输入值中较大的一个

可直接替换

min(x, y)

返回两个输入值中较小的一个

可直接替换

modf(x, out ip)

把输入值分解为整数和小数部分

float

mul(x, y)

返回输入矩阵相乘的积

float

float2

float3

float4

noise(x)

Generates a random value using the Perlin-noise algorithm.

normalize(x)

返回规范化的向汪李量,定义为 x / length(x)

float3

pow(x, y)

返回输入值的指定次幂

float

radians(x)

角度到弧度的转换

float

reflect(i, n)

返回入射光线困运迟i对表面法线n的反射光线

float3

refract(i, n, R)

返回在入射光线i,表面法线n,折射率为eta下的折射光线v

float3

round(x)

返回最接近于输入值的整数

float

rsqrt(x)

返回输入值平方根的倒数

float

saturate(x)

把输入值限制到[0, 1]之间

float

sign(x)

计算输入值的符号

float

sin(x)

计算输入值的正弦值

可直接替换

sincos(x, out s, out c)

返回输入值的正弦和余弦值

sinh(x)

返回x的双曲正弦

float

smoothstep(min, max, x)

返回一个在输入值之间平稳变化的插值

float

float2

float3

float4

sqrt(x)

返回输入值的平方根

可直接替换

step(a, x)

返回(x >= a)? 1 : 0

float

tan(x)

返回输入值的正切值

float

tanh(x)

返回输入值的双曲线切线

float

tex2D(s, t)

2D纹理查询

tex3D(s, t)

3D纹理查询

transpose(m)

返回输入矩阵的转置

trunc(x)

Truncates floating-point value(s) to integer value(s)

可直接替换

程序都是以函数为一个单位。函数内的多条代码使函数完成了特定的功能,在分析当中也是以一个函数作为一个分析单位。在分析时,应当尽可能多的分析出这个函数所完成的具体功能。

反汇编中的函数一般都有如下格式:

1.1 第一种函数格式

push ebp

mov esp,ebp

 埋轮 ....

pop ebp

ret

1.2 第二种函数格式

这种函数没有特定的格式,但可以肯定弯笑信是在函数的末尾肯定有ret语句。

2、识别函数的返回值,形参,局部变量

函数一般是使用eax寄存器来保存返回值。但是一些编译器可能用其他的方式来传递返回值,因此,在分析程序的前期,需要确定该程序是用什么编译器进行编译的(通过PEId可以产看),才能确定其返回值是用什么方式进行传递的。

函数的形参个数可以通过函数平衡多少字节的栈空间来推理出。因为存在着许多的传参方式,所以这种方法并不是绝对正确的,因此要先观察出一个函数的传参方式是何种方式。

和函数的传参方式息息相关的函数调用方式:

不同的调用方式平衡堆栈的方式是不同的。C方式调用时,是调用者进行堆栈平衡。传参时,一般是自右往左将实参入栈。在32位下实参一般是4个字节一个,但也有例外的情况(比如传递一个结构体变量)。

在平衡堆栈时,一般是在函数调用语句后由调用者平衡堆栈。 

例如:

call fun 调用一个函数

add esp , 4 平衡堆栈.

stdCall 是被调用自己平衡

stdCall方式调用时, 形参入栈的方式和 C方式相同, 不同就在于平衡堆栈的形式. std方式调用是由被调用的函数自己本身来平衡堆栈也就是在函数返回的时候平衡堆栈.

ret 0x4 // stdCall平衡堆栈的实例

如果函数传入形参每个都是 4个字节的, 那么就可以算出升扒有多少个形参公式就是 :

形参个数 = 平衡堆栈用到的字节数 / 4

函数形参在汇编语言中随着调用方式不同其表现形式也跟着不同.

C方式和 std方式调用时,形参的表现形式为: [ebp+8] ,即 ebp+一个数字去索引.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12409077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存