zoukankan      html  css  js  c++  java
  • Delphi 编译出来的程序被小红伞报病毒 TR/Spy.Banker.Gen4 [trojan]

          今天碰到非常奇怪的问题,正常开发的单元代码,在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同样会出现

  • 相关阅读:
    【剑指offer】面试题40:数组中只出现一次的数字
    【剑指offer】面试题39扩展:平衡二叉树
    【剑指offer】面试题39:二叉树的深度
    【剑指offer】面试题38:数字在排序数组中出现的次数
    【剑指offer】面试题37:两个链表的第一个公共结点
    【剑指offer】面试题36:数组中的逆序对
    剑指Offer
    设计模式
    ACM
    算法设计与分析
  • 原文地址:https://www.cnblogs.com/caibirdy1985/p/5834587.html
Copyright © 2011-2022 走看看