a621460 发表于 2023-8-20 05:33

来写一下学习PJ的心得 第二课

我发第一课的时候有人说我用小号顶 我自己的贴子 其实我就只是想写给自己看的第一个作为一个 自己学习的记录第二呢 这个教程是很早就发的 现在去咨询大佬第一 已经过去很久了第二也不能确定 大佬是否有空
发这个贴子也是想一个是自己能看看做一个学习经验 记录发现问题 解决问题其次如果有人跟我有一样的问题 或者类似的问题也可以一起学习交流    我不需要什么 热心 或者什么B之类的 真不用顶也可以不回复 除非有需要问题或者 确实帮助到你本人了 对你有帮助 帮助到你了
在一个 我学这个只是想吧曾经 想做的事情现在执行下去正好现在没上班学点东西 也没有什么不好   虽然不知道能学多久 或者学到哪里   
本来想 23 一起发的结果2课 脱壳 回顾第一课的时候 发现不少问题 而且 后续也出现了很多问题自己研究 处理问题 花了很久 很long tima
在一个这个课程是的确需要一些底子的   比如 汇编   正向写线程的   比如为什么要断 哪些api因为 你不管用什么 比如易语言 写 弹窗 都是需要用到那些个api 的哪怕你是易语言也是需要用到 api 的 可能你用的模块 只不过它把api写在模块里了 你看不见而已你不用模块写的试试

吐槽一下   就是有几个需要等待的 比如弹窗等待 或者提示框等待 有点 头疼不是很想等

笔记1    就是定位api函数 然后找到上层地址 nop代码或者 ret函数   
这个比较简单需要知道一点汇编基础比如汇编平衡之类的   
以下部分是为完全不懂的小白讲解的 也是自己的一个理解方式方法    如果您会可以跳过   
首先说一下 call   和push   push是把 push 的参数 给到call 里面   call 里面 在OD 右下角括号有几个参数 那么就在外面一定有几个 push   因为 这是一个函数
比如一个函数 让你去吃西瓜    你需要一个瓜并且 你需要知道瓜的大小 参数你怎么拿 怎么吃用哪个嘴吃给谁吃   call可以理解为 吃这个动作   而 瓜的大小 以及后后续说明 需要push   可以正向理解 或者逆向理解

ret   就是执行完毕反汇到上一个压栈   压栈就是   右下角call 进来以后 会传入 之前call 地址的下一段代码的地址   ret 是可以有参数的 ret 0*4 或者ret 0*8
无参call 的ret比方比如 要你去巡逻   这个call 要你 看房间   不需要你汇报只需要你进去转一圈这种call是没有传参的这种call可以直接进入call 内部 的第一句代码 ret      
有参call 的ret 比方   依旧要你去巡逻   这个call要你看房间   但是需要你汇报 有多少家具   你进去转一圈   然后汇报有多少家具   这种call是有传参的需要ret 0*4之类的   
上面理解了请在理解这里为了避免 不严谨      无参call也是有回执的   回执在eaxrax 里面   只不过 一般情况 这个 数据参数 不重要   忽略即可   04 就是按照   寄存器顺序依次axbxcxdx /64则是 raxrdx   然后是 什么+8 +c 好像 这个有点忘了
回执传参数据重不重要呢这个得看 call 内部   你想应付领导 你也不可能做一个 太离谱的数据把参数数据 一定得是合理范围内的   别把 0-255范围的参数你弄一个 longlong 的数据出来会崩的

笔记就暂时就这些但是问题 就有几个      如果您是大佬 正好在看这个贴子并且您正好会可以麻烦请您讲解一下 谢谢

第一个aps 脱壳      手托以后 是这个样子的   




然后 就在这里 直接 走了脱壳流程然后软件竟然打开了?很吃惊




标识 Unknown Packer-Protector我不确定 这个是否还存在壳   
这里我相信 不止我一个人有这种问题   前提是你得单步单脱


第二个问题就是小窗口的   按照视频流程走没问题 但是我有一个想法能不能用 压栈里面找到 上层dbox的函数地址



这里呢我是2个都下过断是先运行的 dbox 的创建窗口然后运行的 通关中文搜索找到的 文字这个地方 但是中介 隔了 有一点久   我在压栈里面 翻到底了 才找到1BD0 压栈 而且 我也不知道 这个方法 可不可行   因为我觉得这2个应该是挨在一起的所以应该距离比较近
这个只是一个尝试 如果有大佬有其他 方式方法 或者 除了在 已知API 在已知API 里面下段的方法    有没有别的办法 比如通过 已知可以视觉看到的参数 去找未知API
可能有点天方夜谭 不可理喻只是一个想法我个人能力有限有会的大佬 请教一下谢谢


第三个问题 跟第二个类似   



依旧按照视频的方法 确实可以达到 想要的效果   
那么 我又有一个萌生的想法   那就是 能不能通过这个网页的地址 倒推 这个 内嵌窗口的call   直接ret 或者 nop这个网页窗口 直接让他不创建 行不行   
我有试过 拦截 绘制窗口的函数我不确定是我不了解这个函数 函数 还是我找错了函数名字 我忘了也没有保存但是我可以记得 是在 下段以后的 运行的第三次 就开始现实的这个网页窗口   
如果有大佬知道函数 或者其他方法麻烦请教一下谢谢

爱飞的猫 发表于 2024-3-3 21:11

本帖最后由 爱飞的猫 于 2024-3-3 21:12 编辑

> 标识 Unknown Packer-Protector我不确定 这个是否还存在壳   
> 这里我相信 不止我一个人有这种问题   前提是你得单步单脱

手拖是会这样,因为壳的数据还在。如果你能精准剔除这些数据,应该就不会报告未知壳了。

压缩壳之类的壳将代码区段压缩后的内容的熵值很高,有可能是因为这个原因报告的。

> 这里呢我是2个都下过断是先运行的 dbox 的创建窗口然后运行的 通关中文搜索找到的 文字这个地方 但是中介 隔了 有一点久   我在压栈里面 翻到底了 才找到1BD0 压栈 而且 我也不知道 这个方法 可不可行   因为我觉得这2个应该是挨在一起的所以应该距离比较近

[`DialogBoxParam` 函数](https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-dialogboxparamw)有一个参数是 `lpDialogFunc`,OD 里显示的是 `DlgProc`。通常窗口建立后的初始化代码会在这里处理(例如 [`WM_INITDIALOG` 事件](https://learn.microsoft.com/zh-cn/windows/win32/dlgbox/wm-initdialog))。

不过这整个方法都是右下角弹窗的窗口处理事件,如果需要完美去除的话需要找到在哪建立这个窗口。

对着你找到的这个函数进行分析,一路回溯 + 查找引用,可以看到这样的内容:

```c
int __thiscall sub_401C00(LPARAM *this)
{
char v3; // BYREF

CDialog::OnInitDialog(this);
dlg_set_icon__401f30(this, this, 1);
dlg_set_icon__401f30(this, this, 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` 接口](https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread)的调用就是建立线程。

这个线程启动后会等待 20s 然后建立“广告弹窗”窗口:

```c
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 替代
```

![截图](https://imgsrc.baidu.com/forum/pic/item/060828381f30e9243b49fb0b0a086e061d95f71f.jpg)

adgjm22 发表于 2024-3-14 21:13

很好。谢谢。
页: [1]
查看完整版本: 来写一下学习PJ的心得 第二课