在 OllyDbg 中查看导出的 DLL 函数 - 垃圾代码

逆向工程 拆卸 ollydbg dll 职能
2021-07-02 22:17:28

作为 RE 概念的新手,我想尝试看看我知道导出一些函数的一个 DLL 中的汇编代码。

首先,我使用这个工具 - http://www.nirsoft.net/utils/dll_export_viewer.html - 获取所述 DLL 中的导出列表。这些是一些功能:

GI_Call 0x100590a7  0x000590a7  2 (0x2) mydll.dll   I:\test\mydll.dll   Exported Function   
GI_CleanReturnStack 0x10058eae  0x00058eae  3 (0x3) mydll.dll  I:\test\mydll.dll    Exported Function   
GI_Cmd_Argc 0x10058bd4  0x00058bd4  4 (0x4) mydll.dll   I:\test\mydll.dll   Exported Function   
GI_Cmd_Argc_sv  0x10059593  0x00059593  5 (0x5) mydll.dll   I:\test\mydll.dll   Exported Function   

然而,当我在 OllyDbg 中加载 DLL 并浏览到这些地址中的任何一个时,我得到的指令并不像函数的开头,例如 GI_Call:

100590A7     10E9                ADC CL,CH
100590A9     CE                  INTO
100590AA     FC                  CLD
100590AB     FFFF                ???                                                        ; Unknown command
100590AD     FF75 10             PUSH DWORD PTR SS:[EBP+10]
100590B0     8D45 FC             LEA EAX,DWORD PTR SS:[EBP-4]
100590B3     50                  PUSH EAX
100590B4     57                  PUSH EDI

更令人费解的是,一旦我向上/向下滚动,代码实际上发生了变化——没有

100590A7     10E9                ADC CL,CH

再一次,它变成了一个完全不同的指令,那个地址也不见了。

难道我做错了什么?或者DLL可能被加密了?尽管如果是这样,DLL 导出查看器怎么能如此轻松地转储导出呢?

1个回答

由于ASLR,您的库可能会被加载到一个与它想要加载的位置完全不同的位置,即标题中的地址

此外,在加载 DLL 时,Ollydbg 不会直接加载 DLL;相反,它使用loaddll.exe. 这意味着,它启动可执行文件,但它设置的断点之前 loaddll有机会加载 DLL。

请尝试以下操作:

  • 设置断点LoadLibraryA:在CPU窗口中右键单击-转到-表达式LoadLibraryA--按F2
  • 对 LoadLibraryW 重复相同的操作(A 版本应该足够了,只是为了确保);
  • 运行程序;
  • 一旦你的断点到了,按CTRL- F9(执行直到返回);
  • 如果您的 DLL 依赖于其他人,您将再次遇到断点;否则你会在RET指令处遇到断点别担心,无论哪种情况,您的 DLL 都会被加载;
  • 使用 View->Memory 或 View->Executable Modules 了解您的 DLL 实际加载的位置。这可能与 DLL 导出查看器向您显示的地址相同,但通常会有所不同(两个 DLL 之间的地址冲突,在这种情况下必须重新定位一个,或 ASLR,如上所述);
  • 仅当地址匹配时:右键单击 -> 转到 -> 表达式 ->0x12345678或您想查看的任何地址;
  • 无论它们是否匹配:右键单击 -> 转到 -> 表达式 ->(函数名称)将滚动到该函数。

您的“消失”指令的原因是它位于另一条指令的中间。考虑这个函数启动:

10001280 > 53               PUSH EBX
10001281   56               PUSH ESI
10001282   57               PUSH EDI
10001283   8B7C24 10        MOV EDI,DWORD PTR SS:[ESP+10]
10001287   8BF1             MOV ESI,ECX
10001289   3BF7             CMP ESI,EDI
1000128B   0F94C3           SETE BL
1000128E   84DB             TEST BL,BL
10001290   75 32            JNZ SHORT 100012C4

字节的100012840x7c是在指令的一部分1001283但是如果你拆开10001284

10001284   7C 24            JL SHORT 100012AA
10001286   108B F13BF70F    ADC BYTE PTR DS:[EBX+FF73BF1],CL
1000128C   94               XCHG EAX,ESP
1000128D   C3               RETN
1000128E   84DB             TEST BL,BL
10001290   75 32            JNZ SHORT 100012C4

错误的字节被解释为指令。向上滚动几行后,Ollydbg 将再次正确同步 - 并显示“真实”指令。