逆向工程入门教程第二篇,持续更新ing

admin 2022年1月17日00:40:41评论69 views字数 2210阅读7分22秒阅读模式

Winter

Solstice

点击蓝字 关注我们

一 加密函数

1. base64加密函数

(1)buuctf 刮开有奖1(未转换)

逆向工程入门教程第二篇,持续更新ing

逆向工程入门教程第二篇,持续更新ing

逆向工程入门教程第二篇,持续更新ing

逆向工程入门教程第二篇,持续更新ing


二、功能函数

1. 排序函数

(1)buuctf 刮开有奖1(未转换)

逆向工程入门教程第二篇,持续更新ing

逆向工程入门教程第二篇,持续更新ing

2.数学函数

ctfshow - 数学不及格(线性求解斐波拉契数列)返回值为斐波那契数列第n项

逆向工程入门教程第二篇,持续更新ing

三、各种库函数

三 各种库函数

C语言

stdlib.h 库 strtol()

描述

逆向工程入门教程第二篇,持续更新ing

声明

下面是 strtol() 函数的声明。

逆向工程入门教程第二篇,持续更新ing

参数

逆向工程入门教程第二篇,持续更新ing

返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。

实例

下面的实例演示了 strtol() 函数的用法。

逆向工程入门教程第二篇,持续更新ing

让我们编译并运行上面的程序,这将产生以下结果:

数字(无符号长整数)是 2030300
字符串部分是 | This is test|
  • 1

  • 2


stdlib.h 库 atoi()

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。特别注意,该函数要求被转换的字符串是按十进制数理解的。atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。


#include <stdlib.h>

#include <stdio.h>

 

int main(void)

{

    int n;

    char *str = "12345.67";

    n = atoi(str);

    printf("n=%dn",n);

    return 0;

}

输出为 n = 12345



#include <stdlib.h>

#include <stdio.h>

 

int main()

{

    char a[] = "-100";

    char b[] = "123";

    int c;

    c = atoi(a) + atoi(b);

    printf("c=%dn", c);

    return 0;

}

输出为 c = 23


四、WINDOWS核心编程

Hello,world

逆向工程入门教程第二篇,持续更新ing

字符类型

逆向工程入门教程第二篇,持续更新ing

窗口定义

Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数)。


在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口类。该函数只需要一个参数,即指向 WNDCLASS 窗口类的指针。因为 WNDCLASS 类包含了窗口所拥有的基本属性。

结构原型:

逆向工程入门教程第二篇,持续更新ing

成员解析:

逆向工程入门教程第二篇,持续更新ing

style 类风格解析

逆向工程入门教程第二篇,持续更新ing

*call的使用

__cdecl

__cdecl 是 C Declaration 的缩写,表示 C 语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。


__stdcall

__stdcall 是 Standard Call 的缩写,是 C++ 的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是 this 指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X 表示参数占用的字节数,CPU 在 ret 之后自动弹出 X 个字节的堆栈空间,称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。


__pascal

__pascal 是 Pascal 语言(Delphi)的函数调用方式,也可以在 C/C++ 中使用,参数压栈顺序与前两者相反。返回时的清栈方式与 __stdcall 相同。


__fastcall

__fastcall 是编译器指定的快速调用方式。由于大多数的函数参数个数很少,使用堆栈传递比较费时。因此 __fastcall 通常规定将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。不同编译器编译的程序规定的寄存器不同,返回方式和 __stdcall 相当。

__thiscall

__thiscall 是为了解决类成员调用中 this 指针传递而规定的。__thiscall 要求把 this 指针放在特定寄存器中,该寄存器由编译器决定。VC 使用 ecx,Borland 的 C++ 编译器使用 eax。返回方式和 __stdcall 相当。


__fastcall 和 __thiscall 涉及的寄存器由编译器决定,因此不能用作跨编译器的接口。所以 Windows 上的 COM 对象接口都定义为 __stdcall 调用方式。


C 语言中不加说明默认函数为 __cdecl 方式(C中也只能用这种方式),C++ 也一样,但是默认的调用方式可以在 IDE 环境中设置。


例子:test1(par1, par2, par3);

逆向工程入门教程第二篇,持续更新ing

*大写标识符的含义

在 Winodows 的定义中包含着许多大写标识符,这些标识符有很多都是以两个或三个字母作为前缀,且其后紧跟一个下划线:


CS_HREDRAW DT_VCENTER SND_FILENAME

CS_VREDRAW IDC_ARROW WM_CREATE

CW_USEDEFAULT IDI_APPLICATION WM_DESTROY

DT_CENTER MB_ICONERROR WM_PAINT

DT_SINGLELINE SND_ASYNC WS_OVERLAPPEDWINDOW


这些标识符其实都是宏定义,前缀标明该常量所属的一般类别,含义如下表:

逆向工程入门教程第二篇,持续更新ing


原文始发于微信公众号(Th0r安全):逆向工程入门教程第二篇,持续更新ing

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月17日00:40:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   逆向工程入门教程第二篇,持续更新inghttps://cn-sec.com/archives/739492.html

发表评论

匿名网友 填写信息