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)相应进程,然后调用“钩子”过程。

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

180626(内嵌补丁)

一、内嵌补丁(Inline Patch)

它是“内嵌代码补丁“(Inline Code Patch)的简称。常用于对象程序经过运行时压缩(加密处理)而难以修改的情况。
运行时压缩代码的Ep代码先将加密的OEP代码解密,然后再跳转到OEP代码处。
内嵌补丁在文件设置被称为“洞穴代码”的“补丁代码”,在EP代码解密后修改JMP指令跳转到洞穴代码的运行。
把特定地址区域的值加和后存储到寄存器中,将寄存器中的值与既定的值进行比较,这个值叫校验和(计算所得),若相同则跳转到OEP处,不同则输出错误信息。

二、Patchme练习

在书上的操作基础上额外几个基本的小操作。
1、 在循环的地方看od循环结束的第一条指令下断点(F2)然后F4运行到目标指令(当红色的地址变成了白底红字则为跑到了该断点。
2、 在运行过加密的指令后od不会进行重新分析,所以当我们抵达了一个看起来就像data段的地方时要右键点击点击分析。这样od将会重新分析,显示出已经解密过的代码段。
注意:函数传参的参数遵循小端序,传参顺序和我们看见的参数push进入的顺序是相反的。
3、 内嵌补丁代码设置位置
(1) (补丁代码较少)设置到文件的空白区域
(2) 拓展最后节区后设置
(3) 添加新节区后设置
注意:为了在程序中进行解密处理,一定要在节区头添加可写属性,获得相应内存的可写权限(当对无写权限的内存进行“写”操作时,会引发非法访问异常)
方法使用的空白区域可能被程序加密了,需要根据程序加密方式对我们的cave code也加密过后写入,否则经过解密的代码就不是我们想要写入的代码了。