分类
易语言例程

32位程序实现64位函数的真正底层调用,syscall

前言:

  • 本源码直接使用syscall汇编实现底层的x64函数的调用,不走任何多余的流程(包括64位的ntdll也不走)

实现:

  • 其实实现起来也不困难:

32位程序实现64位函数的真正底层调用,syscall

用CE看ntdll最后走向内核的实现,无非都是很简单的:

32位程序实现64位函数的真正底层调用,syscall

  • 先把rcx值给r10,然后赋值eax内核调用号(SSDT函数序号),然后判断CPU是否支持快速调用,支持就直接使用syscall,不支持使用int 2E中断门。

  • 本源码相当于直接将64位这些函数的实现过程直接使用汇编写了出来,其实并不复杂,主要是64位传参和32位的约定不同,64位使用rcx,rdx,r8,r9传递前4个参数,从第五个参数开始才使用rsp堆栈传参,明白了这一点,实现64位的syscall其实并不困难。

  • 64位内存读写测试(可以看到在0x100000000处成功申请内存并实现读写和内存属性修改):

32位程序实现64位函数的真正底层调用,syscall测试:真正的系统驱动信息获取(利用NtQuerySystemInformation_x64实现,纯粹的32位NtQuerySystemInformation是不可能实现的,论坛上的驱动信息获取基本没有几个正确的,看驱动的入口点地址就看得出来,64位长的入口点地址才是64位系统下的驱动应该有的地址):

32位程序实现64位函数的真正底层调用,syscall

PS:

  • 更多功能可自行拓展

分类
网络相关源码

使用Etw监听系统网络事件,支持TCP/UDP、IPV4/IPV6

利用Microsoft-Windows-Kernel-Network监听系统文件变动消息(包括Send,Recv的IP地址和包大小、Connid,支持IPV4和IPV6的监听):

使用Etw监听系统网络事件,支持TCP/UDP、IPV4/IPV6

Network事件由内核层提供,一旦事件开始运行,用户层基本无法绕过。(资源监视器的网络监视使用本方法实现)

PS:

  • 程序启用事件监视必须拥有管理员权限!

  • 程序启用事件监视必须拥有管理员权限!

  • 若监视程序异常退出,请务必手动停止监视事件

  • 若监视程序异常退出,请务必手动停止监视事件

分类
易语言例程

一个程序加载3个ntdll 全网最稳重载

一个程序加载3个ntdll 全网最稳重载,至于重载一个Dll可以干些什么,可以自己想想。

一个程序加载3个ntdll 全网最稳重载

分类
易语言例程

实现Dll的替换加载

实现原理:加载Dll的时候系统会使用ZwOpenFile进行打开Dll文件,此时,我们只需要hook了ZwOpenFile函数,然后进行简单的替换就可以实现替换加载Dll了!

实现图:

实现Dll的替换加载

Hook处理部分:

实现Dll的替换加载

查看其Dll列表

实现Dll的替换加载

,发现连列表中的路径也是错误的,这是因为我们只替换了Dll加载时被打开的句柄,R3下系统仍然以为我们加载的main.e,实际上main.e更不不可能用LoadLibrary加载起来,真正加载的是“测试Dll.dll”(在PCHunter中可以看到这个Dll被标红)

我们不能只局限于伪装加载文件系统上的Dll,也可以尝试内存加载Dll用这个方法进行替换,不过处理文件句柄这个坑我实在没法处理,就摆烂了。

分类
易语言例程

函数ntdll.dll RtlRemoteCall的实现过程

函数RtlRemoteCall是ntdll中的一个未文档化的函数,其功能主要是修改EIP,实现远程线程调用。

该函数的实现过程易语言版的在此:

函数ntdll.dll RtlRemoteCall的实现过程

该函数的内部实现过程其实非常简单,主要是使用NtGetContextThread获得线程上下文,然后用NtWriteVirtualMemory写入参数信息,最后使用NtSetContextThread修改EIP信息,实现跳转。

效果如下:

函数ntdll.dll RtlRemoteCall的实现过程