西湖论剑wp
BabyRE
给数组中的每一个函数都设置断点
开始动调,第一个函数,给输入的值进行检验是否是数字
第二个函数进行按位取反
取反后的结果
下个函数是IAT hook .替换GetLastError函数 替换为sub_4019D0函数
GetModuleHandle函数:获取一个应用程序或动态链接库的模块句柄
GetModuleHandleA(0);返回0x00400000,而*模块句柄实际上就是模块在当前进程空间的装入地址。exe程序装入句柄一般为 0x00400000 。所以GetModuleHandle(NULL); 返回的值为 0x00400000;GetModuleHandle(“kernel32”);返回值是0x7c800000(这个值正是kernel32.dll中的Image base的值)。*
这里lpModuleName为kernel32
然后在kernel32模块中找GetLastError函数地址再将其替换这就是hook IAT的过程:先从程序句柄0x00400000中找kernel32.dll再从kernel32中找getlasterror。刚好两个循环
这里双击也可以查看
再给替换的函数加上断点
注意dword_4085C0是IAT之后的GetLastError函数
下一个函数是替换dword_408148的值
C 库函数 int atexit(void (*func)(void)) 当程序正常终止时,调用指定的函数 func。您可以在任何地方注册你的终止函数,但它会在程序终止的时候被调用。func – 在程序终止时被调用的函数。
如果有多处atexit那么执行顺序是什么呢?
#include<stdio.h>
#include<stdlib.h>
void functionA ()
{
printf("这是函数A\n");
}
void functionB ()
{
printf("这是函数B\n");
}
void functionC ()
{
printf("这是函数C\n");
}
int main ()
{
/* 注册终止函数 */
atexit(functionA );
printf("启动主程序...\n");
atexit(functionC );
printf("退出主程序...\n");
atexit(functionB );
return(0);
}
可以看出来多出atexit是以栈的执行顺序调用的
所以总结一下执行顺序
- sub_401170 输入检验 ->
- sub_401230 对某一内存数据进行按位取反
- sub_4012B0 IAT hook 替换GetLastError函数 替换为sub_4019D0函数
- main sub_4019D0 dword_408148, “dcbahgfelkjiponm”
- sub_401670 base8 加密后memcmp(&unk_4081D0, a16230465152334, 0x60u);
- sub_4015C0 sub_401CC0加密后memcmp(Buffer, a67339fc92b4875, 0x28u);
- sub_4014E0 执行RC4,后比较密文memcmp(&unk_4084C0, &unk_408090, 0x70u) )
ebpf程序:eBPF 于 2015 年推出,是 Linux 的 一项 功能,可以直接在 Linux 内核中运行程序,而不是在无法直接访问内核资源的“用户空间”中运行程序。 eBPF 源于 BPF,本质上是处于内核中的一个高效与灵活的虚类虚拟机组件,以一种安全的方式在许多内核 Hook 点执行字节码。
资料链接:
VT是什么意思?
VT,全称是,Virtualization Technology,即是虚拟化技术,虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
VT实现:VT 入门番外篇——最小 VT 实现 - 寂静的羽夏 - 博客园 (cnblogs.com)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com