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

    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个字符串,因而判断序列号是否正确的函数一会儿就找到了。php

    接下来固然是研究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,就会终止启动。




web

一番调试能够发现,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,就大功告成了。.net

    修改点总结以下3d