在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天碰到非常奇怪的问题,正常开发的单元代码,在A程序编译出来没有问题,将相同的单元引用到B程序编译出来就被小红伞报病毒TR/Spy.Banker.Gen4 [trojan],自动隔离删除。 今时今日的防病毒软件,实在是让人纠结不已,今天一个下午的排查代码,最后发现问题居然是出现在调用Windows API的地方,总体有两处代码会出现报病毒: 问题代码1: //单元1声明引用API函数 function GetCPInfoEx(CodePage: UINT; Flags:DWORD; var lpCPInfo: TCPInfoEx):BOOL;stdcall; external kernel32 Name {$IFDEF UNICODE} 'GetCPInfoExW'; {$ELSE} 'GetCPInfoExA'; {$ENDIF} //单元2 // 这里一旦写上调用 单元1的GetCPInfoEx 的代码,则编译后的EXE马上报病毒, if GetCPInfoEx(FCodePage, 0, LCPInfo) then // 而修改为调用Windows单元的 GetCPInfoEx 则不会 if Windows.GetCPInfoEx(FCodePage, 0, LCPInfo) then // 总得来说非常奇怪,难道在单元1引用GetCPInfoEx就会生成病毒特征码? 问题代码2: 单元3: //一旦写上调用EnumSystemCodePages的代码则编译后的EXE马上报病毒 Windows.EnumSystemCodePages(@DoEnumCodePageCallBackEx, dwFlag);
最后实在没辙了,全部改为动态加载DLL并调用API。 初步推断: 1)应该是Delphi在使用external引入DLL的接口时由编译器所生成的IAT表以及相关跳转代码刚好存在病毒的特征码 2)采用动态加载(LoadLibrary和GetProcAddress)则可以避免这些自动生成代码的发生,所以一切正常 3)此问题存在一定的偶然性,不一定是在每个程序中调用GetCPInfoEx和EnumSystemCodePages会出现该问题,也可能调用其他API同样会出现
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论