oCam v515.0去广告方法和Reverse分析

╄→гoц情女王★ 提交于 2020-11-09 07:21:45

    oCam为Delphi开发,未注册版的主界面下方会有广告,关闭主界面后会出现一个弹窗,这个弹窗要等待3秒才能关闭,关闭弹窗后又会在默认浏览器中打开他们的网站。如果直接用OllyDbg或者x32dbg打开oCam.exe,然后用F8单步执行,若不加任何断点,要不了几步就会提示“已停止,调试结束”,这是oCam刻意加入的反调试技术,可能和812C75处的CreateMutexW有关,我没有深入研究,采取另外一种方法绕过:直接启动oCam,然后用OllyDbg或x32dbg去附加,(使用x32dbg时要注意勾选 调试>高级>隐藏调试器(PEB),否则容易出现异常)。附加后,点击菜单>注册,电子邮箱和序列号随便填,比如都填1,点击“确定”会报“无效的邮件地址”,把邮箱地址改为1@x.com,再点“确定”就会报“无效用户名或注册码”,在报错的同时也会有系统提示音。这个提示音就是PoJie的起点。使用bp MessageBeep命令下断点,点击“确定”后观察栈的内容,可以找到来自79F8A3的调用。79F8A3下方不远处(79F8B2)又有对CreateMessageDialog的调用,说明79F8A3和79F8B2所在的函数79F838就是用来带提示音报错的,在IDA或x32dbg中查找对79F838的引用,发现只有两处引用,其中一处引用是_TfrmRegister_btnOKClick+282,这个函数名称的含义非常明显了。而x32dbg中则能看到"Congratulations"、"InvalidSerialNumber"、"InvalidEMailAddress"这3个字符串,于是判断序列号是否正确的函数一下子就找到了。

    接下来当然是研究7A78D0(_TfrmRegister_btnOKClick)了,如果邮箱格式不正确,7A791C处就会跳到7A7BB2。7A7955处 cmp dword ptr [ebp-18h], 13h就是判断序列号的长度是不是13h(十进制19),若不是13h则会跳到7A7B81。经过一番调试,可发现7A79BA处 call dword ptr [edx+13Ch]是在联网验证序列号是否正确,运行时[edx+13Ch]=5E596C,再经过层层跳转会到达7A6550(_TfrmInternetAuth_FormActivate),在这个函数里又可以看到两个很显眼的字符串,FF-FF-FF-FF-FF-FF和http://ohsoft.net/php/AuthManager/register.php?value=,看到这个网址,很自然会想到搜索一下ohsoft的这个字符串,不仅要搜ASCII形式(单字节),还要搜Unicode形式(双字节),否则会有遗漏。还可搜出如下网址,
    http://ohsoft.net/php/AuthManager/auth.php?value=
    http://ohsoft.net/update/ohupdate.php
    http://ohsoft.net/update/website.php?product=
    https://ohsoft.net/link.php?lang=
当然也可以使用Fiddler之类的抓包工具来抓取网址。auth是authenticate的简写,AuthManager肯定是验证序列号是否正确的,update肯定是检查更新的。通过观察引用这些网址的地方,同时下断点,可以发现,在_TfrmMain_FormCreate(7D4964)中,7D49FD处引用“……/ohupdate.php”,即在启动时检查更新,而在oCam的“菜单”>“选项”中,找不到检查更新和下载更新之类的选项,再根据我长期使用的经验,oCam检查更新和下载更新都是强制的,无法通过“选项”关闭。这就意味着如果你改了软件的其它地方实现了去广告,但没有去掉检查更新,那么下次更新后你的这些PoJie就会丢失,又得重新做一遍。既然已经找到了检查更新的网址,那么阻止它检查更新就很简单了,首先想到的是在"C:\Windows\System32\drivers\etc\hosts"中添加一行127.0.0.1 ohsoft.net,阻止oCam联网,结果发现在oCam启动时,还会检查hosts文件是否加了屏蔽规则,如果在hosts文件中检查到ohsoft.net,就会终止启动。




一番调试可以发现,7D49C5处call  sub_7DE6FC就是检查hosts文件是否被篡改的。 这个函数里面的7DE740处call  GetSystemDirectoryW十分显眼,

在Visual Studio中运行下面的C语言代码,显示内容是C:\Windows\system32,也证明了sub_7DE6FC的作用。

#include<stdio.h>
#include<Windows.h>
void main() {
	LPWSTR path = (LPWSTR)malloc(2 * MAX_PATH);
	GetSystemDirectoryW(path, MAX_PATH);
	wprintf(L"%s\n", path);
}

call  sub_7DE6FC之后立刻就是cmp al,1和jnz  short loc_7D49F0,如果跳转不发生(即检测到hosts文件被篡改),就会执行7D49E5  call GetCurrentProcess和7D49EB call  TerminateProcess。那么我们可以把jnz  short loc_7D49F0改成jmp  short loc_7D49F0。或者不修改hosts文件,而是直接把7D4E70处的检查更新的网址给改掉,比如ohsoft改成nhsoft、update改成upupup等。上述两种方法都能去掉强制更新。

    在_TfrmMain_FormCreate(7D4964)中继续向下看,7D4B68处又有一个TerminateProcess,无需多想,把它前面的7D4B14 jnz  short loc_7D4B6D改成jmp  short loc_7D4B6D肯定不会错。继续向下,7D4BEA处call  sub_7DF02C,sub_7DF02C里面又有FF-FF-FF-FF-FF-FF和http://ohsoft.net/php/AuthManager/auth.php?value=,说明这个函数是在启动时联网检查序列号是否正确(此函数也是通过对引用……/auth.php网址的地方下断点找到的)。call  sub_7DF02C之后不远处有一个跳转,7D4C2A  jnz  short loc_7D4C59,大胆猜测,这个跳转就是决定主窗体是否显示广告的地方,jnz改成jmp后,广告果然消失。

    不过这样修改后,关闭主窗体后还是会有一个窗口弹出来,等待3秒才能关闭。前面已经发现了_TfrmMain_FormCreate之类的含义明确的名称,那么在IDA的Functions窗口(快捷键Shift + F3)肯定能找到更多有用的信息,不妨在其中搜索一下Close,很快就能看到_TfrmMain_FormCloseQuery(7D4880),用OllyDbg或者x32dbg附加后在7D4880处下断点,调试一番可以发现,7D4949处call  sub_7DDCDC,sub_7DDCDC里面调用了GetTickCount(获取自系统启动以来经过的毫秒数),还有两处cmp  eax, 0BB8h,BB8h化成十进制正好是3000,这就是等待3秒(3000ms)的源头,所以不能执行call  sub_7DDCDC。把7D48A4处的cmp  byte ptr [eax], 1改成cmp  byte ptr [eax], 0,或者把紧接着的7D48A7 jnz  loc_7D4960改成jmp  loc_7D4960,就大功告成了。

    修改点总结如下


 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!