♂hook初探♂(持续更新)

news/2024/12/31 2:42:34/文章来源:https://www.cnblogs.com/T0fV404/p/18638633

主要是从攻防世界中的easyhook中学习,感觉好神奇.

参考了以下博客:

攻防世界逆向高手题之EASYHOOK-CSDN博客

RE套路/从EASYHOOK学inline hook - c10udlnk - 博客园

先贴源码:

 sub_401370(aPleaseInputFla);scanf("%31s", input_flag);if ( strlen(input_flag) == 19 ){sub_401220();		//未知名函数,一开始当然不会注意v4 = CreateFileA(FileName, 0x40000000u, 0, 0, 2u, 0x80u, 0);		//创建文件函数WriteFile(v4, input_flag, 19u, &NumberOfBytesWritten, 0);		//写入函数,这些系统函数通常不是重点,如果影响理解代码的话直接查API即可,  WriteFile(句柄, 写入字符串, 写入字节, 指向写入直接的指针, 0)sub_401240(input_flag, &NumberOfBytesWritten);if ( NumberOfBytesWritten == 1 )	//判断函数sub_401370(aRightFlagIsYou);elsesub_401370(aWrong);system(Command);result = 0;}else{sub_401370(aWrong);system(Command);result = 0;}return result;
}

然后要注意sub_401220():

int sub_401220()
{HMODULE v0; // eaxDWORD v2; // eaxv2 = GetCurrentProcessId();			//系统函数,获取进程ID,就是当前程序的IDhProcess = OpenProcess(0x1F0FFFu, 0, v2);		//系统函数,返回现有进程对象的句柄。v0 = LoadLibraryA(LibFileName);			//系统函数,将指定的可执行模块映射到调用进程的地址空间,这里LibFileName双击跟踪存入的是kernel32.dll模块,就是导入了它*(_DWORD *)WriteFile_0 = GetProcAddress(v0, ProcName);		//系统函数,返回指定的导出动态链接库(DLL)函数的地址。 ProcName存放的是WriteFile函数名,也就是导入WriteFile函数。lpAddress = *(LPVOID *)WriteFile_0;	//获取WriteFile函数地址if ( !*(_DWORD *)WriteFile_0 )		//无用函数,因为kernel32.dll模块的WriteFile函数一定存在return sub_401370(&unk_40A044);	//sub_401370函数类型puts函数,是通过主函数分析得到的,&unk_40A044处的字符串是获取原API入口地址出错,不用管他。unk_40C9B4 = *(_DWORD *)lpAddress;		//这里获取WriteFile函数的地址*((_BYTE *)&unk_40C9B4 + 4) = *((_BYTE *)lpAddress + 4);		//这里地址后四位也保持一样,不知道有什么用aHook1 = 0xE9;		//这里连同第二句是我犯下的第二个错误:这里转十六进制不是E9,是JMP的机器码指令,而不一开始并没有机器码的相关知识。aHook2 = (char *)sub_401080 - (char *)lpAddress - 5;		//这里是一个偏移地址,而且还是满足HOOK的连续地址。之所以这样写是因为汇编语言JMP address被编译后会变成机器指令码,E9  偏移地址,偏移地址=目标地址-当前地址-5(jmp和其后四位地址共占5个字节)。所以前面直接用E9,这里直接用偏移地址就省去编译生成机器码那一步。这也是HOOK的原型。return sub_4010D0();		返回一个函数,继续跟踪,因为前面并没有什么修改程序的行为
}

主要看下面,可以看到这里搞了jmp,而且注意aHook1和aHook2(这里是我修改过的名字)是连续的,也就是说,可以看成jmp sub_401080.

接下来看sub_4010D0():

BOOL sub_4010D0()
{DWORD v1; // [esp+4h] [ebp-8h] BYREFDWORD flOldProtect; // [esp+8h] [ebp-4h] BYREFv1 = 0;VirtualProtectEx(hProcess, lpAddress, 5u, 4u, &flOldProtect);WriteProcessMemory(hProcess, lpAddress, &aHook1, 5u, 0);//修改return VirtualProtectEx(hProcess, lpAddress, 5u, flOldProtect, &v1);
}
//VirtualProtectEx(进程,修改地址,修改区域大小,[修改其中权限,1,2,4对应执行,写,读],一个保存修改前权限的变量 ),所以这三行作用是对lpAddress所存储的地址处进行了5字节的权限修改操作,先改成读写再往此处写入以前面E9 偏移量地址处的5个字节(即上面的跳板指令),最后恢复权限,完成修改。

这就是hook,劫持程序流.

那么现在WriteFile被改写成了jmp也就是跳到sub_401080,我们看看它:

int __stdcall sub_401080(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped)
{int v5; // ebxv5 = sub_401000(lpBuffer, nNumberOfBytesToWrite); //加密函数sub_401140(); //这个是把WriteFile恢复的函数WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);if ( v5 )*lpNumberOfBytesWritten = 1;return 0;
}

sub_401000:

int __cdecl sub_401000(int input_flag, int _19)
{char i; // alchar v3; // blchar v4; // clint v5; // eaxfor ( i = 0; i < _19; ++i ){if ( i == 18 ){*(_BYTE *)(input_flag + 18) ^= 19u;       // 这里犯下第五个错误,写脚本时这种单独的if语句应该直接在外面单独成行,不然就要多写几个elif语句了,界面就会很乱!}else{if ( i % 2 )v3 = *(_BYTE *)(i + input_flag) - i;elsev3 = *(_BYTE *)(i + input_flag + 2);*(_BYTE *)(i + input_flag) = i ^ v3;}}v4 = 0;if ( _19 <= 0 )                               // 不会小于等于,所以不会在这里返回return 1;v5 = 0;while ( aAjygkfm[v5] == *(_BYTE *)(v5 + input_flag) )		//这里犯下第四个错误,前面的加密逻辑中我们没有可以参照的字符串,因为flag是推出来的,而真正的字符串在后面,所以逆向逻辑时首先要找到非输入的字符串才行!这里双击跟踪 aAjygkfm等于ajygkFm.\x7f_~-SV{8mLn{v5 = ++v4;if ( v4 >= _19 )return 1;}return 0;
}

写脚本,可得flag为:"-lag{Ho0k_w1th_Fun}"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio使用模拟器报错,解决办法

在进行鸿蒙应用开发时,很多开发者没有鸿蒙系统的设备,无法在鸿蒙系统真机上进行调试,这时就需要使用官方提供的模拟器。在菜单栏Tools---Device Manager,打开模拟器弹窗,登录华为账号后即可进行模拟器管理。但在模拟器下载后,点击右侧Actions启动时,会遇到提示报错“模拟…

为什么要做纯血鸿蒙操作系统?

在10月22日,华为最新的原生鸿蒙之夜暨全场景新品发布会上,余承东正式发布了“纯血鸿蒙”操作系统,这是继苹果iOS和安卓系统之后的全球第三大移动操作系统,同时也标志着国产操作系统实现了全面突破。(央视新闻报道https://mp.weixin.qq.com/s/IFatTQ7u7h92iGrr-xEedw)。那…

GIMP 处理 png 透明边缘

首先设置画布大小然后点击 图层 -> 图层到图像大小

时间的本质-计算视角

原作:Stephen Wolfram计算机视域下的时间 时间是人类经验的核心。然而,究竟什么是时间?在传统科学中,它常被比作空间坐标(尽管这种坐标对我们来说总是不断增长)。尽管这种描述在数学上可能很有用,但它并没有揭示时间的本质。 一旦我们开始用计算术语思考,就会觉得越来越…

中考英语优秀范文-002 Music 音乐

1 写作要求 作家雨果说过:“开启人类智慧的钥匙有三把,一是字母,二是数字,三是音符。”从这句话中,我们足可见音乐对人的发展的影响。请你根据以下提示,以Music为题,写一篇短文参加学校的英语作文竞赛。 提示: 1音乐使人充满活力,让人快乐; 2 没有音乐,生活就没有乐…

Windows11安装Linux子系统(WSL2)

1、确认BIOS中已经打开虚拟化 Virtualization Technology (我的机器默认已经打开 Enabled / Disabled,主板不同进入的地方不一样,自行搜索) 2、以管理员身份打开 PowerShell 3、输入(此步安装WSL): dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subs…

软工个人总结

结束了? 一、学期回顾 1.1 课程想象与现实 最初听闻软件工程课程,脑海中浮现的是一群程序员在电脑前敲打着代码,创造出一个个功能强大的软件。想象着自己能通过这门课,精通多种编程语言,独立开发出令人惊艳的应用程序。可是在第一次编程作业布置下来时,发现自己什么也不会…

UML之关联

关联指两个类之间的各种联系。UML使用各种单实线表示关联,但关联所能够表达的信息远不只是一条实线所传递的依赖。关联指两个类之间的各种联系。UML使用各种单实线表示关联,这个单实线可以是直线(垂直的、水平的或者倾斜的)、折线甚至曲线。 事实上,关联也是展示类的属性的…

代码随想录——动态规划13.分割等和子集

思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。背包的体积为sum / 2 背…

深度解析 Transformer 模型中的位置嵌入(Positional Embedding)

在自然语言处理中,词语的顺序对句子的意义至关重要。然而,传统的自注意力机制无法区分词语的位置。本文深入浅出地介绍了**位置嵌入(Positional Embedding)**的概念及其在Transformer模型中的作用,解释了它如何帮助模型理解词语的顺序,从而提升文本处理的准确性。通过简单…

java8--方法--格式化输出--printf--索引

System.out.printf("%1$s %2$tB %2$te %2$tY","Due date",new Date()); 效果图:ps: 1.一个字符串需要有多个格式化单词,通过建立索引实现,索引值用%$包围,$后紧跟格式化的目标类型,后面按顺序传入变量或填写内容 2.t指定日期类型,b指定填充月份的完…

前端重学之Number

Number (尾附IEEE754解读) mdn文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Numberjs里的number是双进度浮点数 用IEEE745 编码 0b 0o 0x 分别表示 二进制 八进制 十六进制```js 0.tostring() //报错 0 .tostring()//正确 ```IEEE7…