Welcome

我是一个来自中国成都的二进制学习者。目前在学习逆向的过程中。水平有限,欢迎交流。

除了二进制以外的爱好是兵击(hema)和贝斯。

拼尽全力 然后 剩下的事情就是命运说了算了。

181004(隐藏进程)

一、隐藏进程:

隐藏进程:隐藏特定进程的技术(stealth process),专业术语叫Rootkit,指通过修改(Hooking)系统内核来隐藏进程、文件、注册表的一种技术。
IAT钩取通过操作进程的特定IAT值来实现API钩取,而API代码修改技术则将API代码的前五个字节修改为JMP XXXXXXXX来钩取API。
(1)正常调用API时
调用API时,首先使用CALL 指令调用API,在相应API执行完毕后,返回到调用代码的下一条指令的地址处。
(2)钩取之后:

首先把dll注入目标进程,API起始地址5个字节代码被修改为JMP XXXXXXXX(仅修改五个字节),在我们的XXXXXXXX的位置,首先把APi修改回原样然后调用一次,之后钩取。
注:当API的前五个字节是我们修改过后的时,也即API被钩取。
使用API代码修改技术可以钩取进程中使用的任意API。要钩取的API代码长度要大于五个字节但是所有API代码长度都大于5个字节。

进程隐藏,用户模式下最常用的是ntdll.ZwQuery-SystemInformation()API钩取技术。

为了隐藏某个特定进程,要潜入其他所有进程内存,钩取相关API。

用户模式下检测进程的API分为2类
1、 CreateToolhelp32Snapshot()&EnumProcess()
2、 ZwQuerySystemInformation()

180921(计算器中显示字)

通过DLL注入实现IAT钩取的技术。较为好实现,但是如果目标API不在目标进程IAT中,就无法使用该技术.(动态加载dll=凉凉)

为了确认需要钩取的API,可以使用PEView查看导入的API,然后对API进行文档查询.

查询发现计算器的SetWIndowTextW()、SetDlgItemTextW()比较引人注目(???),而后者又调用了前者,所以我们假设只要钩取前者就OK.

(API后面跟的是W就是说是宽字符(Wide character)版本.若后面跟的是A则是ASCII码字符版本。宽字符说的是Unicode码。)
XySher
跟着流程查看栈窗口。
XySher
覆写时要逆序进行。每个Unicode中的汉字占2个字节
XySher
程序开始时,PE装载器会将user32.SetWindowTextW()API地址记录到该地址(01001110),该地址是IAT区域。

而我们钩取IAT过后,将IAT保存的API起始地址变为用户函数的起始地址。

像这样,先向目标进程注入用户DLL,然后在进程的IAT区域中更改4个字节大小的地址,就可以轻松钩取指定API。这种技术也称为IAT钩取技术。

练习实例
XySher
诶这次居然成了 舒服
XySher
...下载下来的是原版 难免 难免.

在实际操作中,必须先确定提供API的DLL已经正常加载到相应进程,如果相应API在钩取前尚未被加载,则应该先调用LoadLibrary()API加载它。

把数字和中文进行1:1的对应可以不加任何修改地使用原缓冲区。

在IAT中查找到user23.dll对应的IID后,在IAT中查找SetWindowTextW API的位置,然后修改其中内容,从而实现对API的钩取。
MySetWindowTextW()函数主要有2个功能,它首先将阿拉伯数字转换为中文数字(字符串),然后调用原来的user32.SetWindowTextW()API。

隐藏进程
全局钩取(Global Hooking),能钩取所有进程。
修改API代码(Code Patch)实现API钩取。

180920(记事本WriteFileAPI钩取+调试器)

记事本WriteFileAPI钩取

调试器(Debugger)进行调试的程序
被调试者(Debuggee):被调试的程序
调试器用来确认被调试者是否正确运行,发现程序错误。调试器能够逐一执行被调试者的指令,拥有对寄存器与内存所有访问权限。
调试器无法处理或者不关心的调试事件最终由OS处理。
EXCEPTION_BREAKPOINT异常是必须被处理的。断点对应的汇编指令为INT3,IA-32指令为0xCC。代码调试遇到INT3指令即中断运行,异常事件被传送到调试器。

实验中首先将notepad用od打开,然后进行一次操作,在od中使用api设置断点手法,通过对进程栈的查看找到数据缓冲区的地址,可以进而通过对目标地址内容的操作达到对程序运行的字符串的修改.我们通过这种方法得知了我们应该修改被调试进程内存的哪一部分。

注意我们在设置断点后,起始地址遇到INT3(0xCC)指令就,EIP的值会增加1个字节.(被调试者的地址因此改变了),但OD等调试器不会显示INT3指令,会自动把字节恢复。

为了防止程序执行流陷入死循环,应该脱钩,即修改起始地址处的0xCC为0x6A,取消对API的钩取。
通过DebugActiveProcess()API将调试器附加到该运行的进程上.
WaitForDebugEvent()发生调试事件,就会将相关事件信息设置到其第一个参数的变量,然后立刻返回。
ReadProcessMemory()来获取第一个字节并暂时存储,WriteProcessMemory()来把第一个字节下断点。

脱钩过程不是必须的,可以取消对相关API的调用,也可以调用用户自定义的函数.
Windows OS是一个多线程(multi-thread)操作系统,同一进程 可以同时运行多个线程。
必须在调试器终止前“脱钩”

调试器

WinDbg

OD和IDA pro都是用户态调试器,WinDbg不仅是用户态调试器,还是内核态调试器,主要用于内核模式调试。可以用来直接下载系统文件符号(Symbol),获取系统内部结构体及API的相关信息。还能用来读取、分析windows OS的转储文件。
图形用户界面比较差。

180919(API钩取)

钩取

一、钩取

钩取是一种截取信息,更改程序执行流向、添加新功能的技术。
API(Application Programming Interface,应用程序编程接口)。用户使用系统资源时,通过微软提供的Win32API向系统内核(Kernel)申请。
钩取API可以①自由选择和api调用前后使用钩子代码②查看或操作传入API的参数或API的返回值③取消对API的调用,或更改执行流
XySher
调试器拥有被调试进程的所有权限!
代码注入更难以被杀毒软件检测到。

180918(使用汇编编写注入代码)

使用汇编编写注入代码

一、目标:

使用汇编可以生成比C语言更自由、更灵活的代码。将纯汇编写的ThreadProc()函数注入目标进程。

二、OD汇编

XySher
Ctrl+G能点击这个NewOriginhere,也就是我们的 此处为EIP选项。
XySher
(原来空格打游戏是跳来跳去,总按,现在玩逆向,空格改指令,快乐的1p。)
勾选这个会把输入代码比已有代码段的地方填充为NOP(No Operation)指令,以整体对齐代码(Code Alignment).
XySher
照着书上填完的汇编代码红了一片…
把字符串填了个XySherlock然后为了保持大小填了两个00 按书上对应的灰色区域就是这里的
XySher
XySher
我们需要先点击这个分析视为再分析才有效
XySher
嘿嘿,快乐。

在后面的操作中发现了一个小小的有趣的地方
XySher
在连续打入感叹号的时候会有一条被识别为 and dword ptr ds:[ecx],esp.
这个地方如果开了dep就会将一个部分标记为不可执行,如果没开dep的话可以进行一下利用,输入3的倍数余2的“!”来在这个位置添加一个and dword ptr ds:[ecx],esp指令

180918(代码注入)

代码注入(Code Injection)

一、代码注入

代码注入是一种向目标进程插入独立运行代码并使之运行的技术。一般调用CreateRemoteThread()API以远程线程形式运行插入的代码,所以也被称为线程注入。
这个API在DLL注入的时候曾经用来调用自己写的DLL,它的函数原型如下
HANDLE WINAPI CreateRemoteThread(
in HANDLE hProcess, in LPSECURITY_ATTRIBUTES lpThreadAttributes,
in SIZE_T dwStackSize, in LPTHREAD_START_ROUTINE lpStartAddress,
in LPVOID lpParameter, in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);
Dll注入处就曾说ThreadProc()和LoadLibrary()都有一个4字节的参数,并返回一个4字节的值。通过CreateRemoteThread()驱使目标进程调用LoadLibrary()函数可以加载指定的DLL文件
代码注入相比DLL注入要更方便,考虑的事情更少,而且几乎不会留下任何痕迹。

二、练习

XySher
跟着书上做的实验notepad的pid是C4
XySher
又一个没跑成的实验==行吧 跟着源码走一遍
XySher
main()函数调用了传入dwPID的InjectCode函数。
XySher
直接注入ThreadProc()进程会导致代码引用地址的内容并不存在于目标进程而出现错误。所以必须同时注入相关字符串以及API地址。(所以本程序中用了THREAD_PARAM结构体接收数据)
在InjectCode()函数中,设置好THREAD_PARAM结构体,然后调用api为data与code分配内存,并将它们注入目标进程,最后调用CreateRemoteThread()API,执行远程线程。

三、代码注入调试练习

XySher
Debugging option是这里的
勾选过后打开
代码注入还是失败,跟着书上找。

180917(PE Tools)

上那个网站发现好像挂了然后就google了一下,好像改成在github的开源项目了
看了一下吾爱破解的xp虚拟机还真有 诶毛熊nb
XySher
PE Tools获取运行中进程列表,并将之显示在主窗口中。(也显示pid)petools拥有进程内存转储功能。

一、进程内存转储

转储(dump)就,将内存中的内容转存到文件。
可以通过使用反转储技术来给转储带来困难。
通过转储可以比调试器更快速简单的查看字符串。
XySher
我转储我自己==
完整转储(DumpFull)从ImageBase转储SizeOfImage大小的区域
部分转储(DumpPartial)从指定地址开始转储指定大小部分 (可以自行设置起点和长度)
区域转储(DumpRegion)转储状态标识为COMMIT的内存区域。

二、PE编辑器

XySher
点击了转存之后,(吾爱破解是真狠啊汉化的到位)

180911(DLL注入)

一、DLL注入

从技术细节来说,DLL注入命令其他进城自行调用LoadLibrary()API,加载用户指定的DLL文件。DLL注入与一般DLL加载的区别在于,加载的目标进程是其自身或其他进程。
DLL被加载到进程后会自动运行DllMain()函数,用户可以把想执行的代码放到DllMain()函数。
DLL注入工作原理就是从外部促进目标进程调用LoadLibrary()API,所以强制调用执行DLL的DllMain()函数。

二、练习myhack.dll

1、打开虚拟机用记事本打开一个新建txt,用Process Explorer发现pid是960
Image
2、 按照书上所说
Image
好的吧…也没下载到index.html 看来注入失败了 用本地试一下
Image
Image
行的吧,看来被拦截下来了==

但是根据对书上内容的学习,我们知道了借助创建远程线程的方法可以成功“渗透”指定进程,进而可以随意操作

源代码实例
Tchar.h中的tchar在unicode下是wchar(双字符),而普通是char。

180907(windows消息钩取)

#一、钩子
Hook,即钩子。
偷看或截取信息而在中间设置岗哨的行为叫“挂钩”,偷看或操作信息的行为就是人们常说的钩取(hooking)
GUI(图形用户界面)是以事件驱动方式工作的。当发生事件时,OS(操作系统)把事先定义好的消息发送给相应的应用程序,应用程序分析收到的信息后执行相应动作。

键盘输入事件发生时,WM_KEYDOWN被添加到[OS message queue]。OS从中取出消息,添加到相应的[application message queue]中,应用程序发现新消息,调用相应事件处理程序处理。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。
在windows内存中,每个文件在内存中被os使用句柄来标识。应用程序被运行时,就会使得每一个可执行文件或者dll文件拥有一个独一无二的实例句柄

Hook procedure(钩子过程)是由操作系统调用的回调函数。安装消息钩子时,“钩子”需要存在某个dll内部,且dll的实例句柄(instance handle)即是hMod。
若挂钩线程ID(dwThreadID)是0那么是全局钩子(Global Hook)。影响全部进程
当使用SetWindowsHookEx()设置好钩子之后,生成指定消息系统会将相关的dll文件强制注入(injection)相应进程,然后调用“钩子”过程。

#二、键盘消息钩取练习
(跟书上相同)