xyx0826 发表于 2020-4-8 05:02

绕过 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:30

本帖最后由 冥界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;

hdzrmlm 发表于 2020-4-8 05:45

谢谢分享,学习了

wapjcxz 发表于 2020-4-8 06:33

感谢分享,学习一下

ms8557 发表于 2020-4-8 06:36

为防止大面积传播,该功能远程控制,网络验证成功才可使用,开发者保留随时全网禁用的权利

kkklj 发表于 2020-4-8 06:59

Adobe 的远程验证是挺麻烦的

为你而战 发表于 2020-4-8 07:04

谢谢分享

wjwddd 发表于 2020-4-8 07:11

谢谢楼主辛苦分享!

RZJ-YQJY 发表于 2020-4-8 07:16

66666666666666666骚操作

TYUTlfx 发表于 2020-4-8 07:22

相当给力嗷{:1_921:}

zkq970413 发表于 2020-4-8 07:28

厉害了!膜拜大佬
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 绕过 Adobe Audition 登录和许可验证