对于可能在x86或x86-x64系统上触发意外行为的交叉修改代码有哪些想法,其中一切都在交叉修改代码中正确完成,除了在执行处理器之前在执行处理器上执行序列化指令之外修改过代码?
如下所述,我有一个Core 2 Duo E6600处理器进行测试,明确提到它是一个容易出现问题的处理器.我会在这台机器上测试与我分享的任何想法并提供更新.
在x86和x64系统上,编写交叉修改代码的官方指南是执行以下操作:
; Action of Modifying Processor
Store modified code (as data) into code segment;
Memory_Flag ? 1;
; Action of Executing Processor
WHILE (Memory_Flag ? 1)
Wait for code to update;
ELIHW;
Execute serializing instruction; (* For example, CPUID instruction *)
Begin executing modified code;
Run Code Online (Sandbox Code Playgroud)
某些处理器的勘误表中明确提到了序列化指令.例如,Intel Core 2 Duo E6000系列有以下错误:(来自http://www.mathemainzel.info/files/intelX6800andintelE6000.pdf)
一个处理器或系统总线主控器将数据写入第二处理器的当前执行的代码段以使第二处理器将该数据作为代码执行的动作称为交叉修改代码(XMC).在执行新代码之前不强制第二处理器执行同步指令的XMC称为非同步XMC.
使用非同步XMC修改处理器的指令字节流的软件可以从执行修改代码的处理器看到意外或不可预测的执行行为.
如果在http://linux.kernel.narkive.com/FDc9TB0d/patch-linux-kernel-markers上没有使用序列化指令,可能会出现意外执行行为的原因:
当完成i-fetch并且微操作在跟踪高速缓存中时,原始机器指令边界和微操作之间不再存在直接关联.这是由于优化.例如(用于说明目的的人工):
mov eax,ebx
mov memory,eax
mov eax,1
(使用英特尔符号而不是ATT - 习惯的力量)
在跟踪缓存中,没有微操作可以使用ebx更新eax.
动态地将"mov eax,ebx"改为"mov ecx,ebx"会使优化的跟踪缓存无效,因此onlhy求助是一个GPF.如果修改不会使跟踪缓存无效,则不会使用GPF.问题是:"我们可以预测跟踪缓存未被无效的情况",并且由于微架构不公开,因此答案通常是否定的.但可以猜测,在中断指令(int3)中修改单字节操作码不会导致无法处理的不一致.这就是英特尔证实的.继续存储int3而不需要同步(即强制刷新跟踪缓存).
https://sourceware.org/ml/systemtap/2005-q3/msg00208.html上还有更多信息: …
我试图弄清楚如何在Windows中找到特定线程的入口点.我知道获取进程入口点的各种方法,但不知道线程的入口点.我已经看了一些可能能够访问它的不同结构/方法(TIB,PEB和GetThreadContext),但它们看起来并不像.我还检查了CREATE_THREAD_DEBUG_INFO信息结构 - 它可以访问启动例程 - 但似乎填充它的唯一方法是主动调试进程和调用WaitForDebugEvent.有任何想法吗?
谢谢!
我想知道如何将Python中的字符串转换为相应的整数值,如下所示:
>>>print WhateverFunctionDoesThis('\x41\x42')
>>>16706
我已经四处寻找,但一直没能找到一个简单的方法来做到这一点.
谢谢.