Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么写入程序集中的代码段时会收到访问冲突?_Windows_Assembly_Nasm_Portable Executable_Malware - Fatal编程技术网

Windows 为什么写入程序集中的代码段时会收到访问冲突?

Windows 为什么写入程序集中的代码段时会收到访问冲突?,windows,assembly,nasm,portable-executable,malware,Windows,Assembly,Nasm,Portable Executable,Malware,我正在做加密PE代码段的实验,用一些键值对每个字节进行异或运算。到目前为止,我成功地对这个段进行了异或运算,并在代码段的末尾注入二进制代码,该代码通过再次使用相同的值进行异或运算进行解码。当然,我也更新了入口点的地址,使之等于解码器的地址 但当我计算要进行异或运算的第一个字节的地址时,它等于解码器之前的第一个字节——因为我将上升,我尝试这样做,我收到了访问冲突 详情如下: 作为一个测试,我使用一些简单的C语言的超级简单控制台hello world应用程序++ 2注入的解码器代码在NASM汇编程序

我正在做加密PE代码段的实验,用一些键值对每个字节进行异或运算。到目前为止,我成功地对这个段进行了异或运算,并在代码段的末尾注入二进制代码,该代码通过再次使用相同的值进行异或运算进行解码。当然,我也更新了入口点的地址,使之等于解码器的地址

但当我计算要进行异或运算的第一个字节的地址时,它等于解码器之前的第一个字节——因为我将上升,我尝试这样做,我收到了访问冲突

详情如下:

作为一个测试,我使用一些简单的C语言的超级简单控制台hello world应用程序++

2注入的解码器代码在NASM汇编程序中编写,然后组装成二进制,然后在测试PE的.text部分末尾注入。其代码如下:

    call    get_proc            ; push return address

get_proc:
    pop     esi                 ; pop current address
    sub     esi, 0x5            ; esi = address of injected code, 0x5 = size of call instruction

    xor     ebx, ebx            ; clear registers
    xor     ecx, ecx            ;

    mov     bl,  <DECODER_KEY>  ; decoder key
    mov     ecx, <CODE_SIZE>    ; encoded code size

    sub     esi, ecx            ; esi = address of encoded code

decoder_loop:
    mov     edx, esi            ; construct encoded byte address
    add     edx, ecx            ;
    dec     edx                 ;
    xor     byte [cs:edx], bl   ; decode
    loop    decoder_loop        ; loop back

    jmp     esi                 ; jump back to decoded code
3和在使用正确的值进行组装之前被另一个正在进行注入的应用程序替换

4当通过第一个循环迭代时,最终的EDX值等于调用get_proc之前的字节地址,并由调试器检查

5在这里,我发布了一个屏幕截图,展示了当我试图对第一个字节执行XOR时出现访问冲突的情况,我用红线标记了我在开始时执行的注入代码

6我知道,默认情况下,代码段只有可读性和可执行性,但我的注入应用程序也增加了写权限

7我正在使用Windows 8.1 64位

最后是问题:

一个代码正在做我希望它做的事情吗

B向代码段添加写权限是否足以执行此操作?我知道有一些写保护机制,但我不知道任何细节

漏洞攻击经常使用这种技术,或者至少他们以前使用过,所以我想知道为什么这种技术不起作用。此外,我必须告诉大家,当我只删除XOR操作时,程序运行良好,所以计算出的地址是正确的

编辑:
下面是PEdump结果的链接:

我找到了问题的解决方案。一般来说:在xor操作中,汇编代码引用[cs:edx]是错误的,应该是[edx]。为什么?

现在看来,段寄存器并没有像我们或者至少我认为的那样做。我听说以前它们被用作每个段的基址,指令[cs:addr]是代码段内的偏移量

但是,当您仔细查看我提供的照片中的段寄存器值时,您会发现这些寄存器实际上是一些主要引用0xFFFFFF地址的描述符!当我从指令中删除cs时,它工作了!但随后我将二进制文件加载到调试器中,令人惊讶的是,它被翻译成ds:[edx]!再说一遍,为什么要使用DS数据段?那个我不知道。但这个问题的教训应该是不要使用这些寄存器


如果您不同意或有任何澄清,请对此答案进行评论。

您声称您的注射应用程序添加了写入权限,但没有显示任何证据。XOR引发AV的事实表明它实际上是不可写的。另外请注意,写入代码段可能会导致您的程序被标记为恶意软件。我现在能想到的唯一证据是指向PEdump结果的链接:另外,我在测试时关闭了AV。但是你在我的代码或其他假设中看到任何逻辑错误了吗?你的dbg说AV正在读取地址0xFFFFFF。怎么样?顺便说一句,你要破坏所有的重新定位,所以使用IMAGE_FILE_RELOCS_STRIPPED标志。这个0xffffff是另一个好问题,我不知道为什么会这样。。。我对汇编程序很陌生,可能有一些错误。如果你是汇编程序新手,我建议你用比代码修补更简单的东西来发展你的技能。这就像获得驾驶学习者的许可并决定驾驶F1赛车一样。在Win32中,cs、ds和es段选择器都映射到完整的地址空间,但是cs可能有一个标志集,阻止使用该选择器进行写入。