随笔分类 - 逆向工程
摘要:一、介绍 Go 语言是一个强类型静态语言,实现了 CSP 并发模型,并在 2012 年才发布首个稳定版。由于Go语言方便跨平台交叉编译,所以吸引了恶意软件开发者使用Go来开发恶意软件。 Go编译器会静态链接构建二进制文件,把标准库函数和第三方 package 进行静态编译,还将runtime 和 G
阅读全文
摘要:一、介绍 Rootkit这一概念最早出现于上个世纪九十年代初期,CERT Coordination Center(CERT/CC)于1994年在CA-1994-01这篇安全咨询报告中使用了Rootkit这个词汇。在这之后Rootkit技术发展迅速,这种快速发展的态势在2000年达到了顶峰。2000年
阅读全文
摘要:一、介绍 Linux系统的用户层(也就是ring3)使用操作系统提供的各种服务(ring0),需要通过软件中断(0x80,中断描述符表中对应系统调用处理),从ring3切换到ring0,通过系统调用来获取对应系统服务。 二、实现 1.基于修改 sys_call_table 的hook方式 系统调用表
阅读全文
摘要:C++逆向总结 一、call前的this指针参数传递 Windows和Linux下的大部分编译器将this指针存放到ecx寄存器中传递,就是在call某个对象成员函数时。但是,也有部分编译器使用rdi寄存器传递的。 如上图所示,第一个参数是用ecx寄存器传递的,后面的两个参数都是栈传递。我们可以通过
阅读全文
摘要:一、概念 ntoskrnl.exe(Windows 启动内核)是用于基于 NT 的 Microsoft 操作系统的启动过程中的重要组件。它还负责一系列系统服务,例如进程和内存管理、安全管理、对象管理、硬件虚拟化等。它包含几个子系统:缓存管理器、I/O 管理器、配置管理器、本地过程调用、内存管理器、进
阅读全文
摘要:一、窗口程序 窗口程序也就是非终端程序,带有图形化界面窗口的程序。 这类程序的起始函数一般为WinMain函数,start函数中会调用该函数。 关于WinMain函数的定义如下: int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINST
阅读全文
摘要:一、Windows特殊程序 bootim Windows系统目录下的bootim程序起源于Windows 8,负责显示启动菜单。 svchost SVCHOST.EXE位于Windows\system32系统文件夹,其文件描述为“Generic Host Process for Win32 Serv
阅读全文
摘要:我们通过GetProcAddress函数去获取Nt函数,哪怕函数名hash化,还是很容易在动态调试时被发现调用了哪个函数,并且杀软都对ntdll库整体hook了。 决定自己手动实现一下通过syscall调用Nt函数。 Nt函数都是由ntdll.dll导出的,也就是说我们需要的汇编指令都在ntdll库
阅读全文
摘要:一、概念 输入法: 输入法 (IME) 是一种可让用户输入文本的用户控件。Android 提供了一种可扩展的输入法框架。借助该框架,应用可以为用户提供备选输入法,例如屏幕键盘,甚至语音输入。安装所需的 IME 后,用户可以从系统设置中选择要使用的 IME,并在整个系统中使用该 IME;同时只能启用一
阅读全文
摘要:一、概述 IAT hook,就是我们要hook的目标函数在导入表IT中,通过修改目标函数所在IAT中项的地址为我们自定义函数的地址,从而实现函数hook。 在这里我们要hook的目标是一个远程进程,采用之前博客《Windows上的进程注入》一文中用到的反射式dll注入这一技术,在其中添加额外的IAT
阅读全文
摘要:一、概念 进程注入,是在正在运行的进程中注入自己代码并运行的一种方法。 我个人的理解,进程注入可以分为线程注入、dll注入、以及PE注入。 线程注入,也是最简单的进程注入,通过创建远程线程的方式在目标进程创建一个线程,执行自己的任务。 dll注入,通过编写一个自己的dll库文件,并把它注入到目标进程
阅读全文
摘要:一、概念 DLL(Dynamic-link library)是Windows操作系统上实现的共享库,又称动态链接库。DLL 的文件格式与 EXE 文件的文件格式相同,即还是32位和64位Windows的可移植可执行文件(PE文件)。 SO 是Linux操作系统上实现的共享库,又称动态链接库。SO 的
阅读全文
摘要:PLT表和GOT表应用于Unix/Linux上的ELF文件,至于Windows系统PE文件使用的是IAT表。 PLT 过程链接表,用于调用链接时地址未知的外部函数,并在首次调用时访问并进行地址解析(获取真正的地址)。 GOT 全局偏移表,用于储存真正的地址。这是链接器在执行链接时需要填充的部分,保存
阅读全文
摘要:一、概念 一个真实物理设备与设备对象可以是一对多的关系,驱动程序或驱动对象与设备对象也可以是一对多的关系。 设备栈 第一种理解:每一个设备对象都可以绑定一个真实硬件设备(也可以不绑定),当一个硬件设备被多个设备对象所绑定时,这组设备对象被称为设备栈(一般最初是至少有一个设备对象的)。 第二种理解:I
阅读全文
摘要:用户模式下调试 常用命令 1.导入符号文件相关 命令>>>导入符号文件:.sympath pdb符号文件路径程序重新加载:.reload查看模块中的符号信息:x 模块名+'!'+'*'查看模块中某些包含"xxx"的方法:x 模块名+'!'+"xxx"+'*' PS: '*'是通配符设置断点:bu 模
阅读全文
摘要:符号文件包含大量二进制文件在运行时不需要的数据。 符号可以包括变量名称、类型(如果适用)、存储地址或寄存器以及任何父符号或子符号。 符号示例包括变量名(本地和全局)、函数以及模块的任何入口点。 调试器从位于本地文件系统的或从远程符号服务器加载的符号文件中获取其有关符号的信息。 (PS:使用符号服务器
阅读全文
摘要:一、Tenet介绍 项目地址:https://github.com/gaasedelen/tenet 作者博客地址:http://blog.ret2.io/2021/04/20/tenet-trace-explorer/ 看雪大佬的翻译:https://bbs.pediy.com/thread-26
阅读全文
摘要:一、函数定义 long ptrace(enum __ptrace_request request,pid_t pid,void *addr,void *data); request:决定要执行的操作; pid:是目标进程的进程id; addr:地址值 data:根据request值变化作用,存放数据
阅读全文