今天当我处理我的一些代码时,我在屏幕上打印缓冲区时发出了哔哔声.这是产生哔哔声的神秘人物:''我不知道你是否能看到它,但当我试图像这样打印时,我的电脑发出哔哔声:
cout<<(char)7<<endl;
Run Code Online (Sandbox Code Playgroud)
另一个值得关注的问题是,"嘟嘟"声不是来自我的车载蜂鸣器,而是来自我的耳机/扬声器
这只是我的电脑还是cout功能有问题?
编辑:
但那么为什么打印这个角色会产生哔哔声呢?这是否意味着我可以通过cout函数发送其他此类字符以产生不同的效果?
我正在尝试读取notepad.exe的PEB目前我正在尝试通过注册ProcessCreation回调来访问PEB,然后等待直到创建notepad.exe.创建记事本时,我使用它的PID打开过程并使用ZwQuerryProcess(PROCESS_BASIC_INFORMATION)找到PEB.
但是,当我尝试读取INFORMATION-> PEB之外的异常时(我假设这是因为我无法访问内存)
当我第一次发现这个时,我记得有人提到了KeStackAttachProcess,它与访问另一个进程上下文中的地址相对应.
问题是我不知道如何检查上下文更改是否成功.一旦我被认为在另一个背景下,我仍然无法访问peb.有谁知道如何访问记事本的PEB?
这是我目前用于查找和访问PEB的代码:
假设hgtPid =记事本的PID
void ModuleDumperThread(){
NTSTATUS Status = STATUS_SUCCESS;
HANDLE hProcessHandle = NULL;
PLIST_ENTRY Next;
PLDR_DATA_TABLE_ENTRY LdrDataTableEntry;
CLIENT_ID clientID;
ACCESS_MASK DesiredAccess = PROCESS_ALL_ACCESS;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE hProcessId = hgtPid;
PROCESS_BASIC_INFORMATION BasicInfoReal;
ULONG SizeReturned;
PEPROCESS ep;
KAPC_STATE *ka_state = NULL;
InitializeObjectAttributes (&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
clientID.UniqueProcess = hProcessId;
clientID.UniqueThread = NULL;
__try{
Status = ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &clientID);
if(Status != STATUS_SUCCESS){
DbgPrint("Failed to open process\n");
DbgPrint("NtStatus: 0x%x", Status);
return;
}
Status = gZwQueryprocess(hProcessHandle, ProcessBasicInformation, (PVOID)&BasicInfoReal, …Run Code Online (Sandbox Code Playgroud) 我希望能够通过查看 PE 标头找出出现在入口点的代码的来源。
比如这段代码就是我的程序的起始代码(401000h)
00401000 >/$ 58 POP EAX ; kernel32.76E93677
00401001 |. 2D 77360100 SUB EAX,13677
00401006 |. BB 4A184000 MOV EBX,<JMP.&kernel32.VirtualProtect>
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码是从哪里来的。如何在不手动扫描我的文件的情况下找到它?(为了完成这个例子,这里有一个来自同一个文件的 hexdump,代码现在位于 200h)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000200 58 2D 77 36 01 00 BB 4A 18 40 00
Run Code Online (Sandbox Code Playgroud)
如何从虚拟入口点 (401000h) 到达原始入口点 (200h)?我当然尝试自己解决。但我错过了一些东西。一开始我是这么想的:
.text[ Entrypoint (1000h) - VirtualOffset (1000d) ] = 原始入口点,因为文件对齐 = 200,原始入口点位于我的 .text 部分的最开始,我想我可以将它用于所有可执行文件。
解决了,我在计算原始入口点时犯了愚蠢的错误
.text[ 入口点 - 虚拟偏移量 ] + 文件对齐 …