标识 Unknown Packer-Protector 我不确定 这个是否还存在壳
这里我相信 不止我一个人有这种问题 前提是你得单步单脱
手拖是会这样,因为壳的数据还在。如果你能精准剔除这些数据,应该就不会报告未知壳了。
压缩壳之类的壳将代码区段压缩后的内容的熵值很高,有可能是因为这个原因报告的。
这里呢 我是2个都下过断 是先运行的 dbox 的创建窗口 然后运行的 通关中文搜索找到的 文字这个地方 但是中介 隔了 有一点久 我在压栈里面 翻到底了 才找到 1BD0 压栈 而且 我也不知道 这个方法 可不可行 因为我觉得这2个应该是挨在一起的 所以应该距离比较近
DialogBoxParam
函数有一个参数是 lpDialogFunc
,OD 里显示的是 DlgProc
。通常窗口建立后的初始化代码会在这里处理(例如 WM_INITDIALOG
事件)。
不过这整个方法都是右下角弹窗的窗口处理事件,如果需要完美去除的话需要找到在哪建立这个窗口。
对着你找到的这个函数进行分析,一路回溯 + 查找引用,可以看到这样的内容:
int __thiscall sub_401C00(LPARAM *this)
{
char v3[16]; // [esp+4h] [ebp-10h] BYREF
CDialog::OnInitDialog(this);
dlg_set_icon__401f30(this, this[75], 1);
dlg_set_icon__401f30(this, this[75], 0);
dlg_set_url_4017D0((this + 46), L"http://www.52pojie.cn/portal.php", v3, v3, v3, v3);// 设置窗体的 IE 控件地址
proc_elevate_SeDebugPrivilege_401910(); // 提权到调试权限
proc_set_homepage__4019D0(); // 改首页
CreateThread(0, 0, sub_401BD0, 0, 0, 0); // 在新的线程内处理弹窗
return 1;
}
其中对 CreateThread
接口的调用就是建立线程。
这个线程启动后会等待 20s 然后建立“广告弹窗”窗口:
void __stdcall sub_401BD0()
{
HMODULE hModule; // eax
Sleep(20000u); // 等待 20 秒
hModule = GetModuleHandleW(NULL);
DialogBoxParamW(hModule, 0x84, NULL, DialogFunc__401B00, NULL);
}
那么 我又有一个萌生的想法 那就是 能不能通过 这个网页的地址 倒推 这个 内嵌窗口的call 直接 ret 或者 nop 这个网页窗口 直接让他不创建 行不行
嵌入控件到窗口一般有两个方法,一个是在 EXE 资源里面添加,随着窗口建立由 Windows 的系统组件来建立对应的控件;或是窗口建立后手动调用 CreateWindowExW
(或 CreateWindowExA
)来建立。前者可以用使用 Resource Hacker 之类的工具直接编辑,后者找到对应的 CALL 将其屏蔽(记得对其堆栈)并替换返回值为 EAX
(或 RAX
,如果是 64 位)为 0 避免意外更改其它控件(因为返回值 0 代表窗口控件建立失败)。
这个课件是前者,因此教程视频是直接将其改成了不可见的状态然后把对应的导航方法导航到空的网址。你如果 NOP 处理掉这个 CALL,就会变成默认的无网页的状态。
_00401C58:
add esp, 14 ; 平衡堆栈
or eax, eax ; 随便找个 2 字节长度的 NOP 替代