安界|自动重构Meterpreter绕过杀软·续( 四 )
这是最琐碎的部分 。 目的是用随机标识符替换AST中的MessageBoxA 。 此随机变量的初始化会在后续部分中完成 。 boolApiMatchHandler::handleCallExpr(constCallExpr*CallExpression,clang::ASTContext*constpContext){//generatearandomvariablenamestd::stringReplacement=Utils::translateStringToIdentifier(_ApiName);//injectRun-timedynamiclinkingif(!addGetProcAddress(CallExpression,pContext,Replacement,_ApiName))returnfalse;//MessageBoxA->randomidentifiergeneratedabovereturnreplaceIdentifier(CallExpression,_ApiName,Replacement);}
ReplaceTextClangAP用于重命名函数标识符:boolApiMatchHandler::replaceIdentifier(constCallExpr*CallExpression,conststd::string&ApiName,conststd::string&NewIdentifier){returnthis->ASTRewriter->ReplaceText(CallExpression->getBeginLoc(),ApiName.length(),NewIdentifier);}插入LoadLibrary/GetProcAddress
为我们要添加的API注入运行时动态链接是一个多步骤过程:我们可以选择将API原型插入翻译单元的顶部或封闭函数中 。 为了更方便简单 , 我们选择后者 , 但是我们需要确保它没有被添加 , 以防在同一个函数中多次调用该API(如果后面调用相同的API , 就会发生这种情况) 。 插入行HANDLE
LoadLibrary(
);插入对GetProcAddress的调用 。
当然 , 为了避免在执行此操作时插入明显的敏感字符串 , 必须将每个字符串写为堆栈字符串的形式 。 这会使代码阅读起来有些冗杂 , 但并太复杂:boolApiMatchHandler::addGetProcAddress(constclang::CallExpr*pCallExpression,clang::ASTContext*constpContext,conststd::string&NewIdentifier,std::string&ApiName){SourceRangeEnclosingFunctionRange=findInjectionSpot(pContext,clang::ast_type_traits::DynTypedNode(),*pCallExpression,0);std::stringstreamResult;//addfunctionprototypeifnotalreadyaddedif(std::find(TypedefAdded.begin(),TypedefAdded.end(),pCallExpression->getDirectCallee())==TypedefAdded.end()){Result<<"t"<<_TypeDef<<"n";}//addLoadLibrarywithobfuscatedstringsstd::stringLoadLibraryVariable=Utils::translateStringToIdentifier(_Library);std::stringLoadLibraryString=Utils::generateVariableDeclaration(LoadLibraryVariable,_Library);std::stringLoadLibraryHandleIdentifier=Utils::translateStringToIdentifier("hHandle_"+_Library);Result<<"t"<<LoadLibraryString<<std::endl;Result<<"tHANDLE"<<LoadLibraryHandleIdentifier<<"=LoadLibrary("<<LoadLibraryVariable<<");n";//addGetProcAddresswithobfuscatedstring:TypeDefNewIdentifier=(TypeDef)GetProcAddress(handleIdentifier,ApiName)std::stringApiNameIdentifier=Utils::translateStringToIdentifier(ApiName);std::stringApiNameDecl=Utils::generateVariableDeclaration(ApiNameIdentifier,ApiName);Result<<"t"<<ApiNameDecl<<"n";Result<<"t_"<<ApiName<<""<<NewIdentifier<<"=(_"<<ApiName<<")GetProcAddress("<<LoadLibraryHandleIdentifier<<","<<ApiNameIdentifier<
getDirectCallee());//addeverythingatthebeginningofthefunction.return!(ASTRewriter->InsertText(EnclosingFunctionRange.getBegin(),Result.str()));}测试gitclonehttps://github.com/scrt/avcleanermkdiravcleaner/CMakeBuild&&cdavcleaner/CMakeBuildcmake..makecd..
- 极客码头|想更新时还能手动更新,比第三方好用,无后门禁用Win10自动更新
- 裁员|英工程师为公司奉献20年,疫情期间被裁,补偿仅为两支自动铅笔
- 兵器数据库|撑死一年也就130架,为何不能自动化生产?,F-35脉动生产线
- 产业气象站|为什么有时候自动广告会比手动广告效果好?深入解析匹配逻辑
- 天下快谈|欠费3个月后,别以为会被自动注销,使用“实名制”的手机卡
- 中国信息报道|力争成为国内自动灭火装备领域的领导品牌,国安达成功过会
- 微信支付|正式确认!微信这项功能要关闭,避免自动扣钱,望周知
- 幸运番茄|让冠军车手的大脑来改变自动驾驶
- 汽车之家|微博暗示造车 藏33传感器 拥有L4级自动驾驶,索尼剑指特斯拉
- 聚成教育|Excel表格技巧—如何根据单元格大小自动调整文字大小