ASM 中字符串常量的错误编译
Faulty compilation of string constant in ASM
我正在编写一个程序来获取 ASM 中某些函数名称的哈希值。
获取字符串常量的函数如下:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "LoadLibraryA"
db 0x00
这会在字节码(xxd 输出)中产生以下字符串常量:
...
00000040: 2424 61c3 e8bc ffff ff5e 83c6 09eb 7d4c $$a......^....}L
00000050: 6f61 644c 6962 7261 7279 4100 .... .... oadLibraryA.
OllyDBG 解释为:
ASCII "dLibraryA",0
当我将代码更改为以下内容时:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "Jibberish"
db 0x00
db "LoadLibraryA"
db 0x00
编译完成"right"(如我所料)。
xxd 输出:
...
00000050: 0000 4a69 6262 6572 6973 6800 4c6f 6164 ..Jibberish.Load
00000060: 4c69 6272 6172 7941 00.. .... .... .... LibraryA.
LoadLibraryA 字符串文字前面不再有
7d
字节。
当然,调试器现在看到的字符串应该是这样的
ASCII "Jibberish",0
ASCII "LoadLibraryA",0
这是 cygwin NASM 编译器表现怪异还是我慢慢变疯了?
正如 Lurker 和 Michael 在评论中指出的那样:
除了我的调试器试图将 "LoadLibraryA" 的 "Loa" 部分解释为实际指令之外,没有 问题 因为我已经将字符串文字放在 .text(代码)部分。
在第二个示例中,这不会在 "Jibberish" 字符串中重现为 "Jib",无法翻译成指令。
通过将文字放入 .data 部分(它们 属于)解决了问题。
在代码中,片段:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "LoadLibraryA"
db 0x00
现在变成:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
[SECTION .data]
db "LoadLibraryA"
db 0x00
我正在编写一个程序来获取 ASM 中某些函数名称的哈希值。
获取字符串常量的函数如下:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "LoadLibraryA"
db 0x00
这会在字节码(xxd 输出)中产生以下字符串常量:
...
00000040: 2424 61c3 e8bc ffff ff5e 83c6 09eb 7d4c $$a......^....}L
00000050: 6f61 644c 6962 7261 7279 4100 .... .... oadLibraryA.
OllyDBG 解释为:
ASCII "dLibraryA",0
当我将代码更改为以下内容时:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "Jibberish"
db 0x00
db "LoadLibraryA"
db 0x00
编译完成"right"(如我所料)。
xxd 输出:
...
00000050: 0000 4a69 6262 6572 6973 6800 4c6f 6164 ..Jibberish.Load
00000060: 4c69 6272 6172 7941 00.. .... .... .... LibraryA.
LoadLibraryA 字符串文字前面不再有
7d字节。
当然,调试器现在看到的字符串应该是这样的
ASCII "Jibberish",0 ASCII "LoadLibraryA",0
这是 cygwin NASM 编译器表现怪异还是我慢慢变疯了?
正如 Lurker 和 Michael 在评论中指出的那样:
除了我的调试器试图将 "LoadLibraryA" 的 "Loa" 部分解释为实际指令之外,没有 问题 因为我已经将字符串文字放在 .text(代码)部分。
在第二个示例中,这不会在 "Jibberish" 字符串中重现为 "Jib",无法翻译成指令。
通过将文字放入 .data 部分(它们 属于)解决了问题。
在代码中,片段:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
db "LoadLibraryA"
db 0x00
现在变成:
get_strings:
call get_curr_addr
pop esi
add esi, 9
jmp str_return
[SECTION .data]
db "LoadLibraryA"
db 0x00