• 5.26~5.27


    https://blog.csdn.net/m0_72827793/article/details/130478513
    接着之前的内容

    32bit.exe为何运行不了?

    第一个问题当我运行32bbit.exe
    那是因为我编译出的程序时64位的程序
    在这里插入图片描述
    64位程序和32位程序,在编译的时候,具有差异,在32位下,指针是4 字节的,在64位下,指针是8字节的
    也就是说,所有32位定义的,pdword,pbyte,pvoid 等等,带有Pxxx的类型,都会发生变化,结构体所拿到的东西也就变了。
    所以编译成32位的程序,问题就解决了
    在这里插入图片描述

    下面程序的参数个数和意义分别是什么?

    在这里插入图片描述

    这两个参数
    argc是命令执行的个数,第二个是windows运行的入口
    主函数main中变量(int argc,char *argv[ ])的含义:
    argc用来统计你运行程序时送给main函数的命令行参数的个数。
    argv[ ]: 字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数.
    argv[0] 指向程序运行的全路径名
    argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
    argv[2] 指向执行程序名后的第二个字符串

    argv[argc]为NULL。
    原文链接:https://blog.csdn.net/xyw_blog/article/details/15686961

    在这里插入图片描述
    上面这个代码,判断是不是两个命令
    例如:
    在这里插入图片描述
    master1.exe 是1
    64bit.exe 是2
    但在数组里是0、1
    所以这个程序的参数应该是2个,一个是它本身,另一个是需要加载的EXE

    下面函数具体做了什么操作?

    在这里插入图片描述

    将二进制文件读入内存中
    在这里插入图片描述

    下面这段代码有什么用?

    在这里插入图片描述这段代码是先加载NTDLL。dll 模块,然后去里面找到 函数NtUnmapViewOfSection 的函数指针,最后调用这个函数
    调用了NtUnmapViewOfSection函数,去卸载了(LPVOID)ntHeader->OptionalHeader.ImageBase这个地址所对应的内存模块
    把这个地址所对应的内存模块从当前进程中卸载掉,为后续的EXE重新映射到内存做铺垫

    现在有个问题,如果,这个地址是当前进程中,在用的地址范围,这个卸载操作会不会引擎进程崩溃?

    任何正在使用的地址空间强制卸载,都会发生崩溃
    正在使用的内存地址空间突然不可访问后,CPU就会往上抛异常,告诉操作系统,最后操作系统就终止了当前进程的运行

    下面这个if检查什么

    在这里插入图片描述
    !pImageBase == 1 且 !relocDir == 1
    即pImageBase==0且relocDir ==0时执行

    下面这段代码是干什么的?

    在这里插入图片描述

    把读入的二进制文件复制到刚才拷贝的pImageBase中
    单步调试看一下窗口
    在这里插入图片描述
    DOS 头,NT头 拷贝过来

    下面这段代码是干啥的?

    在这里插入图片描述
    VA保存方式,相对于内存镜像基址pImageBas
    VA是在内存中用地址,PointerToRawData 这个是相对于文件偏移的地址
    既然是重新映射,那就得符合内存布局规律,所以地址也得是按照相对image 首地址去计算

    下面这个函数是干什么?

    在这里插入图片描述
    一些内存分配,和字串的拷贝,函数有命令行获取
    根据cmdline复制出两份,一份Unicode一份Ansi的cmdline
    hijackCmdline = true; 这个是一个,HOOK,函数的标记
    置为true ,后续是要设置IATHook 的

    对于HOOK怎么理解?

    把系统的函数调用流程劫持到我们的函数内
    动态获取,程序内部的函数参数,之后再在hook函数内部调用真正的api函数
    得到的调用参数
    比如,动态观察程序内部的运行情况,如果钩了文件函数,就可以知道这个程序动态跑的时候,操作过什么文件、
    钩了网络函数,后者内存函数,对应的操作细节,你就能知道了
    像打日志一样,按先后都打印出来,这个不就是程序分析报告么
    而且HOOK函数,可以劫持参数留作它用,也可以阻断这个函数调用流程,如果有有害参数,可以直接结束此次函数调用,直接返回,而不是调用真正的函数
    记得一点,HOOK 操作,可以劫持函数调用流程,可以加上我们的操作,截留信息等等
    最典型的例子,就是你打开一个病毒文件,装了杀毒软件的系统,就会告诉你这个文件打开失败,是因为杀软在底层劫持文件打开流程,提前检查了这个文件,所以在底层拒绝了这次打开操作

    最后再想一下,如果我们想获取文件打开信息,需要hook哪个函数?

    后续。。。。。。

  • 相关阅读:
    【python】subprocess用法示例
    Kafka - 15 Kafka Offset | 自动和手动提交Offset | 指定Offset消费 | 漏消费和重复消费 | 消息积压
    递推算法(c++)
    mybatis日志、反射、DataSource
    2023年系统设计面试如何破解?进入 FAANG 面试的实战指南
    Hazelcast系列(三):hazelcast管理中心
    js通过xpath定位元素并且操作元素以下拉框select为例
    软件测试/测试开发丨App自动化测试——显示等待高级使用
    计算机网络:随机访问介质访问控制之ALOHA协议
    css常用选择器
  • 原文地址:https://blog.csdn.net/m0_72827793/article/details/130897356