# 第14章课后作业

##### **练习**

1：分析 OpenProcess 的调用链

2：使用 C++ 调用 CreateProcess API，运行 calc.exe 程序

3：使用 P/Invoke 通过序数调用 OpenProcess，运行 calc.exe 程序

4：使用 D/Invoke 调用 OpenProcess，运行 calc.exe 程序

5：D/Invoke 还有其他方式获得对模块以及 API 的句柄，例如通过方法 **GetPebLdrModuleEntry** 来获得对 DLL 的句柄。请查看 D/Invoke 的仓库 README 文档并分别进行尝试

6：查阅资料，分别在 VBA 以及 PowerShell 中调用 OpenProcess，运行 calc.exe 程序

7：在 .NET 中，执行 Shellcode 的经典方式为使用 **VirtualAlloc** 分配内存空间、使用 **Marshal.Copy** 写入 Shellcode，使用 **CreateThread** 创建线程，以及使用 **WaitForSingleObject** 来等待线程的结束。根据描述以及 API 的文档写出 C# 代码，分别使用 P/Invoke 以及 D/Invoke。

8：用 PE Bear 分析 **ws2\_32.dll** 各项重要属性

9：为什么在 **calc\_dllmain()** 中的 CreateThread 函数下面调用 **WaitForSingleObject** 会导致死锁？

10：使用 C# 的 **P/Invoke** 与 **D/Invoke** 分别获得 **explorer.exe** 的进程句柄，并获得相关进程信息，例如 **PID**、**命令行参数**等。

11：请用**二进制形式**写出下列数字的**负数**：133，4869，51203

12：下述代码片段中，RAX 中保存着函数 **LoadLibraryA** 的地址，该函数只需要 1 个参数，**DLL 名称**，假设该参数值为 **ws2\_32.dll**，请填写空白部分缺失的代码：

```
mov rsi, 0x6c6c;
________;
mov rsi, ________;
push rsi;
________;
sub rsp, ____;
call rax;
________;
```

13：使用 WinDBG 解析 ws2\_32.dll，不借助 PE Bear 等工具的提示，完整地完成对关键属性的数值提取，例如 IAT 表的 RVA

14：根据所学知识，编写弹出 calc.exe 程序的 Shellcode，分别用 **WinExec** 或者 **CreateProcessA**。

15：根据所学知识，完成正向 Shell 的 Shellcode

16：根据所学知识，以及研究 x86 与 x64 调用约定的差异，完整 x86 版的逆向 Shell 的 Shellcode