动态调试
堆栈平衡
动态修改第一件事情: 从函数开始执行前的第一句代码开始, 到函数执行完毕, 保证它的 ESP(32) / RSP(64) 不发生变化, 也就是堆栈平衡
找call 思路
-
网络请求 发包函数等api函数 一般就是send 或则发包函数通过调用关系找call
-
系统弹窗断点 典型的就是 调用windows自带的控件了
-
内存的访问 某些地方 读取/写入粘贴板 可以下断点; 使用CE等搜索到关键内存地址, 然后下内存读写断点;
-
参数找CALL 这个call会有什么特殊的参数, 字符串搜索
-
常量访问 比如弹窗的字符串, 找到常量地址, 再下内存断断点
静态分析
PE文件结构
DLL注入方式
一篇文章带你了解Dll注入 Windows Process Injection(Windows进程注入)技术研究 https://www.cnblogs.com/LittleHann/p/6336950.html
注册列表注入
在进程中每一个进程加载user32.dll时、会受到DLL_PROCESS_ATTACH通知。在进行处理时、会取到注册列表键值HKEY_LOCAL_MACHINE\Software\Microsoft\windowsNT\CurrentVresion\Windows\AppInit_Dlls,并且会调用LoadLibrary去加载dll、若将参数值fdwReason设置为DLL_PROCESS_ATTACH时对自己会初始化。这样我们去加键值就会加载我们的dll、实现注入。
远程线程注入
烂大街 远程线程注入是window病毒用的广泛的一种、远程线程注入其实比较简单其实就是利用CreateRemoteThread函数创建远程线程调用LoadLibrary去加载我们我们的dll,实现注入。远程线程注入在之前的QQ尾巴病毒就是利用这个,还有多,如果有兴趣我们可以写一个类似的小程序。
apc注入
烂大街 在一个进程执行过程中、调用SleepEx或者WaitForSingleObjectEx函数时、系统会产生软中断。这时候线程在次被唤醒时、此线程会首先执行apc队列中被注册的函数、利用QueueUserAPC这个函数、并且去执行我们的dll加载代码 ,进而完成我们注入dll的目的。
message注入: message注入其实就是windows消息钩子钩子注入、SetWindowsHook函数是windows消息处理机制的一个平台、应用程序可以指定监视指定窗口的某种消息。它可以拦截进程的消息到指定的dll中导出函数、这个特性我们就可以将dll注入到程序中。
反射式dll注入
反射式dll注入不需要dll文件落地,减少被查杀的风险。首先将需要注入的dll写入进程内存,然后为该dll添加一个导出函数,利用这个导出函数让其自动的装载dll。注射器是将DLL文件写入目标进程内存。反射装载器实现的就是模拟dll装载器装载dll文件的操作。
反射式注入流程如下:
- 读入原始DLL文件至内存缓冲区;
- 解析DLL标头并获取SizeOfImage;
- 为DLL分配新的内存空间,大小为SizeOfImage;
- 将DLL标头和PE节复制到步骤3中分配的内存空间;
- 执行重定位;
- 加载DLL导入的库;
- 解析导入地址表(IAT);
- 调用DLL的DLL_PROCESS_ATTACH;
实现反射型DLL注入需要两个部分,注射器和被注入的DLL。 注射器的执行流程:
- 将待注入DLL读入自身内存(避免落地)
- 利用VirtualAlloc和WriteProcessMemory在目标进程中写入待注入的DLL文件
- 利用CreateRemoteThread等函数启动位于目标进程中的ReflectLoader
输入法注入
系统切换输入法时候,输入法管理器imm32.dll就会加载IME模块,这样就形成了输入法注入的充要条件。由于Ime文件本质上只是个存放在C:\WINDOWS\system32目录下的特殊的DLL文件,因此外挂开发者们便可以利用这个特性,在Ime文件中使用LoadLibrary()函数来加载待注入的各类非法恶意DLL文件。
LSP劫持注入
其实这个是利用windows程序加载自己目录的dll特性,伪造系统的dll,然后在我们的dll内去调用系统原来的函数。进而实现劫持注入到程序,这样我们就可以为所欲为。
全局钩子注入
利用windows的消息机制,可以在事件发送到os之间设置一条钩链,来钩取不同的消息,如,利用SetwindowsHookEx可以钩取一个键盘消息。并且调用钩子处理函数来处理这个消息,所达到的效果和dll注入是一样的(执行dll内部的代码)
DLL 入口点
- hModule 参数:指向DLL本身的实例句柄;
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//添加想要执行的代码
//当dll被进程加载时DLLMain被调用
//printf(" process attach of dll");
break;
case DLL_THREAD_ATTACH:
//添加想要执行的代码
//当有线程被创建时,DLLMain被调用
printf(" thread attach of dll");
break;
case DLL_THREAD_DETACH:
//添加想要执行的代码
//当有线程结束时,DLLMain被调用
printf(" thread detach of dll");
break;
case DLL_PROCESS_DETACH:
//添加想要执行的代码
//当dll被进程卸载时,DLLMain被调用
printf(" process detach of dll");
break;
}
return TRUE;
}无痕注入?
https://blog.csdn.net/qq_38474570/article/details/128264332
windows 的各种钩子
消息钩子(Message Hook)
它允许一个应用程序拦截和监视其他应用程序发送的消息,例如键盘输入、鼠标事件或窗口消息。通过消息钩子,一个应用程序可以截获并处理其他应用程序发送的消息,从而实现自定义的消息处理逻辑。消息钩子可以全局地监控所有的消息,也可以局部地监控特定的窗口消息。
消息钩子的使用场景很广泛。一些常见的应用包括: 全局快捷键:通过消息钩子,一个应用程序可以注册全局快捷键,当用户按下指定的快捷键时,会触发应用程序的相应操作,即使应用程序没有焦点。所以有个先后注册,热键冲突问题 输入监控:消息钩子可以用于监控系统中的键盘和鼠标输入。这在实现键盘记录器、输入录制、或者游戏辅助程序等功能时很有用。 窗口管理:通过消息钩子,可以对窗口的创建、销毁、移动、大小调整等进行拦截和处理,实现窗口的自定义行为。
消息钩子是通过调用 SetWindowsHookEx 函数来安装的。它需要提供一个钩子回调函数,这个函数会在被监控的消息发生时被调用。
SetWindowsHookEx ,安装钩子 UnHookWindowsHookEx,卸载钩子
[C&C++ 转载] 【转】基于C++的Hook API实现(一)
常用的 HOOK 类型
-
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
-
WH_CBT Hook 在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:
激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件; 完成系统指令; 来自系统消息队列中的移动鼠标,键盘事件; 设置输入焦点事件; 同步系统消息队列事件。 Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
-
WH_DEBUG Hook 在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。
-
WH_FOREGROUNDIDLE Hook 当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。
-
WH_GETMESSAGE Hook 应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。
-
WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACK Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。WH_JOURNALPLAYBACK是system-wide local hooks,它們不會被注射到任何行程位址空間。(估计按键精灵是用这个hook做的)
-
WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。WH_JOURNALRECORD Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALRECORD是system-wide local hooks,它們不會被注射到任何行程位址空間。
-
WH_KEYBOARD Hook 在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。
-
WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。
-
WH_MOUSE Hook WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。
-
WH_MOUSE_LL Hook WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。
内核模块钩子(Kernel Module Hook)
内核模块钩子是在操作系统内核模块加载和卸载时,通过修改内核的相关数据结构来拦截特定的系统调用或功能。这种钩子的设计比较底层,因为它直接操作内核模块,所以需要特殊的权限才能实现。
内核模块钩子通常用于监控和修改操作系统内核行为,从而实现系统级别的功能或安全策略。 例如,可以使用内核模块钩子来监控文件系统操作、进程管理、网络通信等。这种技术在一些安全软件、防火墙、或者监控工具中被广泛使用。
驱动对象钩子(Driver Object Hook)
驱动对象钩子(Driver Object Hook),用于拦截和修改设备驱动程序的行为。
在Windows操作系统中,每个设备驱动程序都有一个对应的驱动对象(Driver Object),其中包含了驱动程序的函数指针表。驱动对象钩子通过修改驱动对象中的函数指针来实现对设备驱动行为的拦截和修改。
IAT钩子(Import Address Table Hook)
IAT钩子(Import Address Table Hook)是一种用户空间的钩子技术,用于修改应用程序调用动态链接库(DLL)函数的行为。IAT是每个可执行模块的一个数据结构,其中包含了模块所依赖的DLL函数地址。通过修改IAT表中的地址,IAT钩子能够将应用程序调用的函数重定向到自定义的函数,从而修改其行为。
EAT钩子(Export Address Table Hook)
EAT钩子(Export Address Table Hook)是一种用户空间的钩子技术,用于拦截其他模块调用目标模块导出函数的行为。类似于IAT钩子,EAT钩子通过修改导出函数表中的地址,将其他模块调用目标模块的函数重定向到自定义函数。这种钩子技术常用于对目标模块的导出函数进行修改或拦截,从而实现自定义功能或增强目标模块的行为。
Inline 钩子
Inline 钩子是一种在目标函数的开头插入一段代码(通常是一段跳转指令)的技术,用于拦截目标函数的调用。这种钩子技术通常用于修改特定函数的行为或获取函数调用的参数和返回值。Inline钩子在特定的场景下很有用,但它可能会对目标函数的性能产生一定的影响,因为每次调用目标函数都需要执行额外的代码。
windows 中的多网卡
多网卡路由
route print
PS C:\WINDOWS\system32> route print
===========================================================================
接口列表
3...e0 be 03 3f 2a 31 ......Realtek PCIe GbE Family Controller
9...00 ff 37 7c 23 11 ......Sangfor SSL VPN CS Support System VNIC
7...........................Wintun Userspace Tunnel
5...00 50 56 c0 00 01 ......VMware Virtual Ethernet Adapter for VMnet1
38...a4 ef 15 fa 50 9c ......Altobeam 6032-USB 11b/g/n Wireless Network Adapter #2
1...........................Software Loopback Interface 1最前面的数字即是网卡号 跳数越低,代表路由成本越低,优先级越高
# 清除默认路由
route delete 0.0.0.0
# 根据网卡接口号
route -p add 0.0.0.0 mask 0.0.0.0 [网卡的网关地址] metric [跃点数] IF 网卡接口号]
# route -p add 0.0.0.0 mask 0.0.0.0 192.168.137.1 metric 20 IF 4
# 根据网卡IP段
# route -p add [IP段] MASK [子网掩码] [网线的网关地址]
# route -p add 10.10.10.0 MASK 255.255.255.0 10.10.10.1route -p add 10.10.10.0 mask 255.255.255.0 10.10.10.254
route -p add 47.110.142.43 mask 255.255.255.0 192.168.20.1
# 172.16.21.0 255.255.255.0 2.0.1.16
route -p add 172.16.21.0 mask 255.255.255.0 2.0.1.16
route add 192.168.20.0 mask 255.255.255.0 192.168.4.1 metric 2 if 2命令说明:添加一条路由记录,所有到192.168.20.0/24网段的数据包,都通过2号接口(网卡)走192.168.4.1的网关,优先级为2。
同时路由多网卡
更改组策略]的方法解决的,方法如下:
本地计算机策略→计算机配置→管理模块→网络→Windows连接管理器→最小化到Internet或Windows域的同时连接数→(右键)编辑→已启用→最小化策略选项→0=允许同时连接。