什么样的代码会产生带有大量跳转语句的程序集?

逆向工程 视窗 部件 dll 可执行程序
2021-06-21 03:38:32
00EE16CC   . E9 DFBB0000    JMP BinFile.00EED2B0
00EE16D1   . E9 64AF0000    JMP <JMP.&MSVCP140D.?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@>
00EE16D6   . E9 15DB0000    JMP BinFile.00EEF1F0
00EE16DB   . E9 D0D40000    JMP BinFile.00EEEBB0
00EE16E0   . E9 C9E60000    JMP <JMP.&KERNEL32.IsDebuggerPresent>
00EE16E5   . E9 D6AD0000    JMP BinFile.00EEC4C0
00EE16EA   . E9 C1510000    JMP BinFile.00EE68B0
00EE16EF   . E9 5CE70000    JMP BinFile.00EEFE50
00EE16F4   . E9 C7A50000    JMP BinFile.00EEBCC0
00EE16F9   . E9 A4E60000    JMP <JMP.&ucrtbased._wsplitpath_s>
00EE16FE   . E9 AD950000    JMP BinFile.00EEACB0
00EE1703   . E9 083B0000    JMP BinFile.00EE5210
00EE1708   . E9 BBAE0000    JMP <JMP.&MSVCP140D.?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ>
00EE170D   . E9 7EBA0000    JMP BinFile.00EED190
00EE1712   . E9 B9BA0000    JMP BinFile.00EED1D0
00EE1717   . E9 44870000    JMP BinFile.00EE9E60
00EE171C   . E9 AF5C0000    JMP BinFile.00EE73D0
00EE1721   $ E9 7A430000    JMP BinFile.00EE5AA0
00EE1726   . E9 07E70000    JMP <JMP.&KERNEL32.GetProcAddress>
00EE172B   . E9 E07C0000    JMP BinFile.00EE9410
00EE1730   . E9 6B520000    JMP BinFile.00EE69A0
00EE1735   . E9 EEAE0000    JMP <JMP.&MSVCP140D.?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std>
00EE173A   . E9 EDE60000    JMP <JMP.&KERNEL32.FreeLibrary>
00EE173F   . E9 DCCF0000    JMP BinFile.00EEE720
00EE1744   . E9 FDAE0000    JMP <JMP.&MSVCP140D.?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@>
00EE1749   . E9 42E70000    JMP BinFile.00EEFE90
00EE174E   . E9 41AF0000    JMP <JMP.&MSVCP140D.?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBED>
00EE1753   . E9 28860000    JMP BinFile.00EE9D80
00EE1758   . E9 03C20000    JMP BinFile.00EED960
00EE175D   . E9 FEBF0000    JMP BinFile.00EED760
00EE1762   . E9 29CB0000    JMP BinFile.00EEE290
00EE1767   . E9 C4510000    JMP BinFile.00EE6930

我正在对一个班级作业的 exe 进行逆向工程,我正在努力思考什么样的代码会产生这种类型的汇编代码。我已经做了几天了。我不是在寻找确切的答案,这会有所帮助,但更多的是关于如何解决像这样反转 exe 的问题。谢谢你的帮助,将不胜感激。如果有人想知道我在使用 OllyDB

2个回答

这看起来像 Visual C++ 链接器在增量链接模式下的输出在这种模式下,链接器在代码段 ( )的开头添加一个带有增量链接 thunk (ILT) 的段.text,每个 thunk 都是一个函数的相对跳转 (E9 xx xx xx xx)。

二进制文件中的所有函数调用都被重定向到相应的 ILT,而不是直接指向目标函数。如果源代码有微小的变化,这种方法允许链接器替换任何已更新的函数,只修补 ILT 跳转以指向新的函数体,而不必修补对函数的所有引用,加快了速度链接过程显着。

在调试版本中默认启用增量链接。

如果它们都是外部目标,那么它就是动态加载 dll 时外部函数的存根。

通过这种方式,您可以限制加载新 dll 时需要更新的页面数量。这让调用代码与调用目标的位置无关。对外部函数的调用被发送到该页面并转发到实际函数。

当 dll 被加载(在启动时、延迟加载时或显式加载时),页面将根据虚拟地址填充。当延迟加载函数被调用时,它会被转发到加载函数,然后加载函数转发到实际函数。