【问题标题】:How to translate "aKernel32_dll_0: unicode 0, <KERNEL.32>, 0" into a legal declaration?如何将“aKernel32_dll_0: unicode 0, <KERNEL.32>, 0”翻译成法律声明?
【发布时间】:2014-03-17 01:53:45
【问题描述】:

我使用 IDA Pro 在 Windows 7 32 位上反汇编 SPEC 2006 二进制文件。

它会生成一个声明如下的变量:

aKernel32_dll_0 unicode 0, <KERNEL32.DLL>,0

在 .text 部分,我发现这个变量的用法如下:

push    offset aKernel32_dll_0
call    ds:__imp__GetModuleHandleW@4
......

我想做的是让这些代码/数据重新组合。

所以我的问题是:

  1. 所以基本上像**aKernel32_dll_0 unicode 0, ,0 **这样的声明不能直接被masm/nasm重新组装,应该如何调整呢?

  2. 我简单地调整成aKernel32_dll_0 dd 0,代码是这样的:

而且每次调用ds:__imp__GetModuleHandleW@4

之后都会遇到奇怪的情况

与使用 Ollydbg 的原始二进制文件进行比较:

所以看起来 aKernel32_dll_0 实际上是一个外部变量?那么 delete the declaration 和 extern 声明这个变量的正确方法是什么?如果是这样,那么这个变量的名称是什么?我不认为它是 aKernel32_dll_0,因为它看起来像是 IDA Pro 生成的随机名称。

谁能帮帮我?谢谢!

【问题讨论】:

    标签: winapi assembly reverse-engineering ida kernel32


    【解决方案1】:

    您当然可以将源材料中的任何字节复制为DB 数组。 也就是说,我们知道 GetModuleHandleW 将 unicode 模块名称作为参数。在 nasm 语法中,它可能看起来像:

    aKernel32_dll_0 DW __utf16__('KERNEL32.DLL'), 0
    

    【讨论】:

    • masm 似乎不支持开箱即用的 utf16,但有宏库支持。但是,对于这个简单的 ascii 字符串,您可以手动插入 0 个字节,例如 aKernel32_dll_0 DB 'K', 0, 'E', 0 ... 您明白了。应该以 3 个零结尾(一个是最后一个 wchar 的高字节,另外两个是终止符)。或者,您可以将其存储为 ansi 并将函数调用切换为使用 GetModuleHandleA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2015-10-28
    • 2017-12-06
    • 1970-01-01
    相关资源
    最近更新 更多