Win32汇编——过程控制(进程调试和进程隐藏)

来源:互联网 发布:求质数的算法 编辑:程序博客网 时间:2024/06/09 21:33
进程调试(有权限的前提下,没有权限请自觉提权)
1.获取运行中的进程句柄
1.1 从窗口句柄获得进程句柄
FindWindowGetWindowThreadProcessIdOpenProcess.if eaxmovhProcess,eax.endif

1.2 从进程快照获取进程句柄
涉及函数和结构:
PROCESSENTRY32 结构
CreateToolhelp32Snapshot:可以获取进程、线程、堆和模块等对象的列表,用法相似,以进程列表为例
.data?stProcessPROCESSENTRY32<?>hSnapShotdd?.codeinvokeCreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0movhSnapShot,eaxmovstProcess.dwSize,sizeof stProcessinvokeProcess32First,hSnapShot,addr stProcess.whileeax;处理 PROCESSENTRY32 中进程信息invokeProcess32Next,hSnapShot,addr stProcess.endwinvokeCloseHandle,hSnapShot

2.读写进程地址空间
读进程内存:ReadProcessMemory
写进程内存:WriteProcessMemory
函数注意事项:
(1)应具有相应的权限
(2)一般不会出现只读写了一部分内存的情况,因为函数会检查指定大小的内存是否为可存取
(3)基指是位于目标进程的地址空间中的
(4)进程的代码段是不可写的,但可通过 WriteProcessMemory 函数去写目标进程的代码段

3.调试 API 的使用
书 p480-489

进程隐藏(远程线程)
1.相关函数:
在其他进程的地址空间申请内存:VirtualAllocEx (需拥有 PROCESS_VM_OPERATION 权限)
创建远程线程:CreateRemoteThread (需拥有 PROCESS_CREATE_THREAD 权限)
建立的过程大致如下:
(1)VirtualAllocEx 申请一块够大的内存,内存块的属性应该是 PAGE_EXECUTE_READWRITE
(2)WriteProcessMemory 将所需代码拷贝进所申请内存
(3)CreateRemoteThread 创建远程线程

2.技术问题:代码重定位及导入函数
2.1 代码重定位
利用call指令将返回地址压入到堆栈的特性,使用call/pop/sub 3个指令的组合来计算代码当前的位置和设计时的位置的偏移值之差,用此差值去修正包含绝对值的指令,以达到重定位的目的。代码如下:
dwVardd?call@F@@:popebxsubebx,offset @Bmoveax,[ebx + offset dwVar]

2.2 导入函数

要在远程代码中使用API函数,就要手动完成系统工作,自己装入DLL,并使用GetProcAddress 函数获取全部要使用的API 函数的入口地址。此过程需用到DLL 文件的名称和函数的名称,这些字符串应放在全局变量中,因此又涉及到重定位的问题。


2.3 远程线程示例:P495


原创粉丝点击