本帖最后由 eec 于 2021-6-11 15:57 编辑
网上下载了个看图的软件,发现每隔一段时间会弹广告,且开机会启动。
一、禁用开机启动
直接windows自带查找开机启动项无果,直接360开机加速...
发现不开机启动了,那么解决(不过软件的极速预览图片功能就失效了)。
(PS:使用火绒剑查找启动项,搜索{“fastpic”也可以定位启动项,所有的都禁用即可)
二、Patch代码
直接把fastpic.exe拖到IDA,发现是VC2005编译,找到wWinMain,F5转伪C代码,代码有点长,那么先放一放。
在IDA搜索字符串“kminisite”(热点广告)、“update”(更新程序)等,发现均未找到符合的,选择动态调试。
拖到x32dbg,Ctrl+G定位CtreateProcessA和W函数并下断(后续发现调用的是W的,因此取消A断点)。
然后运行程序,发现并没有断下,打开火绒剑监测软件目录(我安装在“E:\Fastpic”目录下):
点击开始监控,打开软件,发现确实没有启动更新或广告程序。
猜测软件做了优化:应该检测了系统时间,一个时间周期内仅第一次打开才执行,那么我们修改下系统时间到明天,再次拖到x32dbg运行。
这次成功断下,调用堆栈切至上层函数依次查看,可以发现 启动更新、广告程序和相关启动参数 的逻辑代码。
记住地址,去IDA中转到相应地址,按F5转伪C代码进行分析。
追随调用堆栈找到了疑似关键跳,然后Patch掉软件中启动进程调用函数看看(在sub_4CC94A函数内patch也是可以的):
那么来看下sub_4CC94A函数大概干了什么:
[C] 纯文本查看 复制代码 BOOL __cdecl sub_4CC94A(int a1)//根据push 1得知,a1变量为1
{
//省略无关代码...
int v13[3]; // [esp+30h] [ebp-244h] BYREF
//省略无关代码...
if ( a1 ){
v13[0] = 0;
//时间相关运算代码...
v13[0] = (int)((v2 + v12) * 24.0);
if ( (double)v13[0] < 1.0 ) return 0;//疑似为:如果和上次启动软件时间间隔小于1天,就直接返回。
}
sub_4CC86A();//此函数拼接启动参数,然后启动更新、广告等程序(CreateProcessW)
Filename = 0;
memset(v17, 0, sizeof(v17));
GetModuleFileNameW(0, &Filename, 0x104u);
PathRemoveFileSpecW(&Filename);
PathAppendW(&Filename, &off_6D2290);
if ( !PathFileExistsW(&Filename) )
return 0;
std::wstring::wstring(v14, &Filename);
v18 = 0;
std::wstring::append(v14, L" /from:17 /fast");
if ( !a1 )
std::wstring::append(v14, L" /manual");
sub_50B17D();
v4 = time32(0);
sub_509BBD(v4);
v5 = lpCommandLine[0];
if ( lpCommandLine[5] < (LPWSTR)8 )
v5 = (WCHAR *)lpCommandLine;
v6 = sub_4CBA17(v5);
v18 = -1;
v7 = v6;
std::wstring::~wstring(v14);
return v7;}
所以patch代码如下:
...
.text:0040AB86 push 1
.text:0040AB88 call sub_4CC94A //选择直接nop掉,懒得改内部代码。。
.text:0040AB8D pop ecx
...
修改为:
...
.text:0040AB86 push 1
.text:0040AB88 nop nop nop nop nop
.text:0040AB8D pop ecx
...
然后测试一下,发现运行正常,更新及广告代码移除成功。
(第一次发帖,内容比较简单,请大佬见谅) |