Project.exe中0x00406A09抛出异常:0xC0000005:访问冲突执行位置0x00406A09

时间:2016-11-04 15:10:53

标签: assembly masm masm32 irvine32

这可能是什么原因?我是汇编(asm)编程的新手,我对代码中发生的事情感到沮丧,因为我一直试图弄清楚它几个小时。

$access_token ="token_here";

$verify_token = "my_password";
$hub_verify_token = "my_password";
fwrite ( $fl, json_encode($_REQUEST));
if (isset ( $_REQUEST ['hub_challenge'] )) {
    $challenge = $_REQUEST ['hub_challenge'];
    $hub_verify_token = $_REQUEST ['hub_verify_token'];
}
$fl = fopen ( "request.txt", "a" );
 fwrite ( $fl, json_encode($_REQUEST));


$fh = fopen ( "/testbot/log.txt", "a" );

if ($hub_verify_token === "my_password") {
    echo $challenge;//exit;
}

我很确定代码正常运行,它会正常运行直到返回部分。 PS:我还有其他代码,其中将调用wordMatching PROC。

1 个答案:

答案 0 :(得分:0)

在代码的开头放置一个断点(在执行push EDX之前),记下堆栈地址esp加上堆栈中的值(返回给调用者的地址)。

然后在ret处设置一个断点。运行代码。检查esp

(你永远不会执行pop EDX,你在代码中有它,但它在对je + jne后面,所以实际上无法访问)。

关于比较的逻辑,你可以简化它:

.code
    push EDX
    mov EDX, OFFSET stringInput
    mov ECX, inputSize
    call readString

    mov   EBX, OFFSET wrongInput
loopWord:
    mov   AL, [ESI]
    cmp   AL, [EDX]
    jne   loopWord_wrongInput ; first difference -> wrongInput
    inc   ESI
    inc   EDX
    test  AL,AL
    jnz   loopWord    ; until 0 is found in both strings
; here is the branch for correct word
    mov   EBX, OFFSET correctInput ; no difference -> switch result string
loopWord_wrongInput:
    ; display result string
    mov   EDX,EBX
    call  WriteString
    pop   EDX           ; your missing "pop EDX" fixed here
    ret

编辑:我忘了在第一个版本中增加esi / edx,现在修复。