绕过 Adobe Audition 登录和许可验证
本帖最后由 xyx0826 于 2020-4-9 15:14 编辑此破解不完全,仍处于试用期的话不能完全屏蔽弹窗。请继续阅读@冥界3大法王的续传
自古以来,A厂全家桶都是以CS(Creative Suite)的形式发售。破解CS系列非常简单,替换`AMTLib.dll`即可。
但是近几年A厂把这些程序搬到了CC(Creative Cloud)云平台上,下载安装运行需要注册,云同步和授权验证也需要联网。
在被Audacity的上古界面折腾得受不了以后,我把眼光转向了Audition。(A厂真香!)
在试用过期以后,打开Audition最明显的特征就是会出现一个遮蔽窗口,要求登录:
关掉窗口以后Audition就会直接退出。用Process Hacker定位到这个窗口以后尝试设置不可见,然而Audition的主界面仍然不可点击。
看来需要对Audition的逻辑进行分析。
使用`CreateWindow`系列API作为切入点。这个登录窗口的类名(Class name)为`EmbeddedWB`:
搜索Audition的所有模块,果然发现`AuUI.dll`里有这个字符串。
这块逻辑里加载了这个字符串,然后把它当作窗口类名(第二个参数,RDX)直接传入`CreateWindowExW`,正如我们所猜测。
向上看看这个函数的其余部分,发现有个字符串叫`EMBEDDED_BROWSER_AUTH_WORKFLOW`(嵌入式浏览器认证流),说明这个函数已经深入授权逻辑。
这个负责弹窗的函数并不是我们想找的。如果能绕过整个授权逻辑,而不只是跳过这个弹窗,岂不美哉?
下面要做的就是看调用堆栈,一层一层往上找。最后来到一个函数,它的开头是这样的:
是一个导出函数,名字翻译成C++就是`private: virtual void __cdecl aui::Application::DoIdle(void) __ptr64`,看起来是UI主循环一类。所以这个函数不能跳过去。
回到我们跟踪调用堆栈找到的弹窗`call`。
`call`之后`test` `RAX`里的值,如果是1就跳转,如果是0就继续执行。继续执行什么呢?下面写着`"AuLog.Shutdown"`,关闭程序了。
往下翻翻,还有一行日志:
“程序关闭,因为授权无效。”这部分肯定要跳过去了。
因为关掉授权窗口会导致`AL`变成0,直接退出程序,所以我们把弹窗的`call`改成`mov al,1`,令`AL`总是为1,退出程序的逻辑就一定会被跳过去。成功!
本帖最后由 冥界3大法王 于 2020-4-8 17:34 编辑
@xyx0826
好,确实是那里
这个工具有几个不错的地方
能看目标进程的上下层对应关系
网络端口,连网地址 ,比如这个程序 Adobe Audition.exe (7124), license.codegear.com, 53303, license.codegear.com, 53302, TCP, Established,
查看窗口功能和类名不如其他工具直白,有点绕路。
不过比任务管理器强姥姥去了,是个破解好助手。
我给我的x32dbg辅助伴侣又加了几个功能
if (GetAsyncKeyState(VK_MENU) < 0) and (GetAsyncKeyState(Ord('A')) < 0) then //Alt+A (先把x64dbg中的热键清掉,得到激活窗口的PID
begin
h := GetForegroundWindow; //这个是句柄
GetWindowThreadProcessId(h, @pid);
pHandle := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
GetModuleFileNameEx(pHandle, 0, buf, Length(buf));
GetWindowText(h, @arr, SizeOf(arr));
Application.MessageBox(arr, '当前激活的窗口标题', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
GetClassName(h, ps, 255); //得到激活的窗口类名
Application.MessageBox(ps, '窗口类名', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
path := GetProcessExePath(h); //得到激活窗口的完整路径
Application.MessageBox(PChar(path), '激活窗口的完整路径', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST);
//ShowMessage('当前窗口的句柄为:' + IntToStr(h));//这个是 10 进制的
Application.MessageBox(PChar(IntToHex(StrToInt(IntToStr(h)))), '当前窗口的句柄为(16进制的):', MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON3 + MB_TOPMOST); //这个是转换成16进制的
{
begin //遍历打开的全部窗口
h := GetWindow(Handle, GW_HWNDFIRST);
while h <> 0 do
begin
if GETWindowText(h, @Text, 255) > 0 then //判断得到的窗口标题
if (POS('分析模块', Text) > 0) then //判断得到的局部窗口标题
begin
//ShowMessage(Text);
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);//激活窗口
end;
h := GetWindow(h, GW_HWNDNEXT);
end;
end;}
//ShowMessage(IntToHex(StrToInt(Format('%u',)), 4)); //再转换成 16进制,因为x32dbg/x64dbg 附加进程用到的是 16进制数
Clipboard.AsText := 'AttachDebugger ' + IntToHex(StrToInt(Format('%u', )), 4) + ',' + IntToHex(StrToInt(IntToStr(h)));
SendMyPress(Clipboard.ToString);
// ShowMessage('回到X64dbg中并在命令行处开心的粘贴吧!' + #13#10 + '命令行代码为:' + Clipboard.AsText + #13#10 + '你会发现程序已神奇的附加了!');
CloseHandle(pHandle);
MediaPlayer1.FileName := ExtractFileDir(Application.Exename) + '\Sound\已经复制到剪贴板.wav';
MediaPlayer1.Open;
MediaPlayer1.Play;
end; 谢谢分享,学习了 感谢分享,学习一下 为防止大面积传播,该功能远程控制,网络验证成功才可使用,开发者保留随时全网禁用的权利 Adobe 的远程验证是挺麻烦的 谢谢分享 谢谢楼主辛苦分享! 66666666666666666骚操作 相当给力嗷{:1_921:} 厉害了!膜拜大佬