1、PEID查无壳
不管是PEID还是什么查壳软件,或者直接OD分析,确实无壳。
image-20220322210126922.png (1.14 MB, 下载次数: 2)
下载附件
2022-3-23 02:54 上传
未注册会有这种状态和提示:
image-20220322210308096.png (707.22 KB, 下载次数: 2)
下载附件
2022-3-23 02:54 上传
关于和退出提示
image-20220322210335044.png (89.25 KB, 下载次数: 2)
下载附件
2022-3-23 02:55 上传
image-20220322210414309.png (105.46 KB, 下载次数: 2)
下载附件
2022-3-23 02:55 上传
2、OD
经过分析了整体过程,比如使用了API Monitor,但是最后找到了一个非常好用的办法,如下:
首先查看分析字符串,您也可以使用【中文搜索引擎】,ASCII
image-20220322210734413.png (117.6 KB, 下载次数: 1)
下载附件
2022-3-23 03:07 上传
然后发现有一些关键词:
image-20220322210928898.png (937.27 KB, 下载次数: 2)
下载附件
2022-3-23 02:57 上传
我们根据下面的“IsRegistered”双击进入,并按F2下断点,运行程序
image-20220322211042397.png (331.5 KB, 下载次数: 1)
下载附件
2022-3-23 02:57 上传
会有多次断点被断下,每次断下来之后(应该是多次用到这个函数验证),该处是个函数内部,
程序是在此处判断是否已注册,并将返回值返回(函数返回值保存在EAX中);
按CTRL+F9(执行到返回),再按F8来到这里:
image-20220322212941920.png (366.23 KB, 下载次数: 2)
下载附件
2022-3-23 02:58 上传
EAX是刚才函数的返回值,cmp判断返回值是否为3,下面接了个jnz跳转,自然我们就可以在jnz这里下手,将其修改为jz,使跳转不成立,(此处埋下伏笔:如果返回值eax为0x3是否直接成功?)
然后保存文件,测试即可。
image-20220322213412279.png (119.91 KB, 下载次数: 2)
下载附件
2022-3-23 02:58 上传
此时,该软件已无提示信息,软件菜单和文件菜单也没有需要注册字样,关于如图所示:
image-20220322213554231.png (377.62 KB, 下载次数: 1)
下载附件
2022-3-23 02:59 上传
关闭软件时,也没有退出提示弹窗了,至此过程结束。
3、判断函数
刚才很明显我们改变了一个跳转,还记得跳转前的cmp eax, 0x3吗?这个判断上面是个call函数
此函数多次被断下,那么一定与注册检测有关系,
我们是否可以通过修改函数内部返回值也可以实现这个功能呢?来试试!
我们依然来到断点处:
00419A79 |. 68 B8006100 push Uninstal.006100B8 ; IsRegistered
代码如下,太乱没关系,后面有IDA:
00419A76 /$ 53 push ebx
00419A77 |. 56 push esi
00419A78 |. 57 push edi
00419A79 |. 68 B8006100 push Uninstal.006100B8 ; IsRegistered
00419A7E |. 8BF1 mov esi,ecx
00419A80 |. 33DB xor ebx,ebx
00419A82 |. E8 88FCFFFF call Uninstal.0041970F
00419A87 |. 59 pop ecx ; 002025E0
00419A88 |. 8BF8 mov edi,eax
00419A8A |. 8BCE mov ecx,esi
00419A8C |. 57 push edi
00419A8D |. E8 5FFEFFFF call Uninstal.004198F1
00419A92 |. 8BF0 mov esi,eax
00419A94 |. 85F6 test esi,esi
00419A96 |. 74 0E je short Uninstal.00419AA6
00419A98 |. 68 C8006100 push Uninstal.006100C8 ; result
00419A9D |. 8BCE mov ecx,esi
00419A9F |. E8 7A030000 call Uninstal.00419E1E
00419AA4 |. 8BD8 mov ebx,eax
00419AA6 |> 85FF test edi,edi
00419AA8 |. 74 09 je short Uninstal.00419AB3
00419AAA |. 8B17 mov edx,dword ptr ds:[edi] ; Uninstal.0060FE48
00419AAC |. 8BCF mov ecx,edi
00419AAE |. 6A 01 push 0x1
00419AB0 |. FF52 3C call dword ptr ds:[edx+0x3C]
00419AB3 |> 85F6 test esi,esi
00419AB5 |. 74 09 je short Uninstal.00419AC0
00419AB7 |. 8B06 mov eax,dword ptr ds:[esi] ; Uninstal.0060FE48
00419AB9 |. 8BCE mov ecx,esi
00419ABB |. 6A 01 push 0x1
00419ABD |. FF50 3C call dword ptr ds:[eax+0x3C]
00419AC0 |> 5F pop edi ; 002025E0
00419AC1 |. 5E pop esi ; 002025E0
00419AC2 |. 8BC3 mov eax,ebx
00419AC4 |. 5B pop ebx ; 002025E0
00419AC5 \. C3 retn
然后打开IDA查看伪代码:
int sub_419A76()
{
int v0; // ebx@1
int v1; // edi@1
int v2; // esi@1
// v0为返回值
v0 = 0;
v1 = sub_41970F("IsRegistered");
v2 = sub_4198F1(v1);
if ( v2 )
// 此处修改过v0
v0 = sub_419E1E("result");
if ( v1 )
(*(void (__thiscall **)(int, signed int))(*(_DWORD *)v1 + 60))(v1, 1);
if ( v2 )
(*(void (__thiscall **)(int, signed int))(*(_DWORD *)v2 + 60))(v2, 1);
return v0;
}
可以看见v0就是返回值,初始化时等于0,在
if ( v2 )
v0 = sub_419E1E("result");
这里修改过,我们在OD(老崩溃,所以用了x32_dbg,和OD一样)跟过去后,
发现v0 = sub_419E1E("result");这个函数的返回值依然是0。
image-20220323013406904.png (526.77 KB, 下载次数: 2)
下载附件
2022-3-23 03:00 上传
唯一可以改变返回值v0的位置就是:
if ( v2 )
v0 = sub_419E1E("result");
那么我们将v0修改为0x3会如何?修改为0x3的原因是因为之前的判断,cmp eax,0x3。
那么想个办法,让eax保持为0x3即可。
因为mov eax, 0x3需要5字节,为了节省字节,所以这里使用的是
先push 0x3,再pop eax,所以改动如下:
...
00419A9 | E8 7A 03 00 00 | call uninstalltool.419E1E |
;00419AA | 8B D8 | mov ebx,eax |
00419AA | 6A 03 | push 3 |
4、最终效果如下
image-20220323024256287.png (398.82 KB, 下载次数: 2)
下载附件
2022-3-23 03:00 上传
5、补充:x64位处理
有楼下朋友说x64搜索不到字符串或者疑似的问题,我们接着弄一下x64的,x64下请使用x64dbg。
这里注意:根据个人分析,x64位程序有些区别:
1、程序(UninstallTool.exe)启动后,会运行UninstallToolHelper.exe(根据x64 API Monitor)
image-20220324012737181.png (28.13 KB, 下载次数: 2)
下载附件
2022-3-24 01:48 上传
2、UninstallToolHelper.exe该进程用于第二次启动UninstallTool.exe(个人推理,没检测到)
所以,我们不能直接将UninstallTool.exe直接载入到x64dbg,因为主线程会自动退出(RtlExitUserThread)。
我们先运行程序,然后使用x64dbg附加该进程,如果您找不到被调试的进程,请使用管理员方式打开x64dbg,就可以看到了。
image-20220324012857994.png (187.77 KB, 下载次数: 1)
下载附件
2022-3-24 01:48 上传
附加后,点击符号,找到uninstalltool.exe,右键在反汇编中转到
image-20220324013131974.png (192.68 KB, 下载次数: 2)
下载附件
2022-3-24 01:49 上传
然后也是搜索字符串:IsRegistered
image-20220324013227213.png (359.57 KB, 下载次数: 2)
下载附件
2022-3-24 01:49 上传
image-20220323183850412.png (94.92 KB, 下载次数: 2)
下载附件
2022-3-24 01:49 上传
可以看到和x86代码一样,只是64位寄存器了,
这里和x86调用的函数有些变化,不过大概还是能够找到位置:
image-20220324013402745.png (230.6 KB, 下载次数: 2)
下载附件
2022-3-24 01:49 上传
注意:这里我尝试过直接将call uninstalltool.140232C78修改为mov eax,3,结果是不行!!程序会崩溃,因为该call函数中被调用了更多功能。
所以这里我找了一块空白区域,CTRL+B搜索0000000
image-20220324013626859.png (47.2 KB, 下载次数: 2)
下载附件
2022-3-24 01:50 上传
随便找了一块空间,当然了此处的区段是可执行的
image-20220324013743635.png (97.29 KB, 下载次数: 3)
下载附件
2022-3-24 01:50 上传
image-20220324013808605.png (105.05 KB, 下载次数: 2)
下载附件
2022-3-24 01:50 上传
好了,直接从原来的地方跳过来,修改返回值,再调回去即可:
image-20220324014047632.png (153.84 KB, 下载次数: 2)
下载附件
2022-3-24 01:50 上传
image-20220324014209504.png (253.24 KB, 下载次数: 2)
下载附件
2022-3-24 01:51 上传
此时,我们回到软件,直接点击帮助,关于我们查看
image-20220324014413868.png (270.11 KB, 下载次数: 2)
下载附件
2022-3-24 01:51 上传
打补丁保存!
image-20220324014456734.png (208.35 KB, 下载次数: 2)
下载附件
2022-3-24 01:51 上传
运行查看:
image-20220324014615776.png (256.1 KB, 下载次数: 2)
下载附件
2022-3-24 01:51 上传
完工!
image-20220324014634404.png (288.12 KB, 下载次数: 1)
下载附件
2022-3-24 01:51 上传
感谢各位看官老爷!
此处是原文件,大家可以试试。
x86:
UninstallTool.zip
(1.58 MB, 下载次数: 181)
2022-3-23 03:02 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB
x64:
UninstallTool.zip
(1.9 MB, 下载次数: 719)
2022-3-24 01:55 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB
当然了您也可以直接去官网下载,https://crystalidea.com/uninstall-tool/download
所有资料下载:https://wwm.lanzoub.com/illgZ01y4cpc