?
某过期不给用一例逆向过程记录
目录
某过期不给用一例逆向过程记录????1
1、目标功能受限????1
2、看看PE信息:????1
3、查看未注册或受限时显示方式。????1
4、直接载入,看看入口点。????1
5、接下来,首选字符串查找法。????1
6、看看过期后会咋样????1
7、同步骤5查找字符串????1
8、暂停程序回溯堆栈????1
9、以上就是去掉时间检测的逆向。????1
10、后记????1
11、其他????1
?
?
SQL浏览器3.5.7
1、目标功能受限
如下图:只有30天过期后不能用的限制,必须购买使用,或者不用扔到垃圾筐里。
?
2、看看PE信息:
?
?
Oep大,节区清晰,但额外信息显示有压缩迹象,有可能加了壳,另外有个debug区???也太大了,难道把什么都包括进去了。
?
3、查看未注册或受限时显示方式。
直接用OllyDbg打开也行。欢迎界面显示剩余天数,猜测字符串格式为"Trial version, %d days remaining"。注意,这块地方的剩余天数肯定是计算得来,然后写上去。所以猜测流程肯定是这样:每次打开时,先检查是否注册,未注册,获取本机时间,和第一次记录的比较,再把结果展示。现在根据方法,我们有4种方法来找到关键过程语句:一是最简单的查找字符串,二是下界面显示文件的API(标准控件,SetWindowText或SetDlgItemText;GDI或DX界面的写文字方法,没遇到过,可能需要去查下),个人觉得这个离关键语句近,而且带字符串,可条件断点;三是加载资源的LoadResource,LoadString等,四是这个界面出现[F12]暂停回溯堆栈,
4、直接载入,看看入口点。
一切OK,没有可疑的地方。
5、接下来,首选字符串查找法。
序模块-cpu窗口-右键菜单-查找-所有被引用的字符串(自带的貌似只能是"push 立即数"或"move 寄存器 立即数"形式,常是SetWindowText(xx, "string")这种写法,资源形式动态的了,可能setWindowText(xx, pszString/arrayString) 这种写法),并开始[Ctrl+F]打字搜索"Trial version"就行了,不必全部,再[Ctrl+L],嗯,只有一处。
?
?
双击目标或者焦点在目标上时回车,到CPU窗口定位,很快发现其他关键信息:"注册给"字符串。两个之前都有可以跳过的跳转。
我这里第一处跳:MOV EBX,EAX改为MOV BL,1
第二处跳修改;JNZ 00AE618D改为JMP 00AE618D
右键菜单-编辑-复制所有修改到可执行文件-弹窗后再右键菜单-保存文件...-改名保存
6、看看过期后会咋样
我们先把系统时间调整到30天后,然后打开之前修改的文件。提示已经过期,并且是以第二个弹窗:给出三个选择,一个是购买,一个是注册,一个是关闭程序。除了第二个再弹窗,其他都会结束程序。
这里有一点不好,OllyDbg打开重命名的可执行程序,原程序信息缓存不能用。
7、同步骤5查找字符串
这个对话框和前一个有很大不同,这个显示都是固定不变的。找到字符串位置了可能看不到关键跳转,也许这个地方是关键跳转的下一级调用或者回调。
很明显这些文字都是静态显示,没有条件判断。
USER32.dll模块里
回调类似带有这样的lpDialogFunc对话框。
?
非模态对话框
HWND CreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
HWND CreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit);
模态对话框
int DialogBoxIndirectParam( HINSTANCE hInstance, LPCDLGTEMPLATE hDialogTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
int DialogBoxParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, PARAM dwInitParam);
?
以上两个非模态对话框或两个模态对话框的创建不管是ASCII还是UNICODE版都会调用CreateDialogIndirectParamAorW或DialogBoxIndirectParamAorW,全都调用CreateWindowEx。
HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
我们在已经导入的创建对话框函数上打断点,结果无反应。再在CreateWindowEx上打断,不过比可能较多,因为控件等窗口比仅一个对话框来的多。所以可先在USER32.CreateWindowEx下个[Shift+F2]条件断点UNICODE[[ESP+8]] == "Register."。因为CreateWindowEx有导入。
还有可能按钮标题可能后添加上去的,如调用
BOOL USER32.SetWindowTextW(hWnd,Text),它会调用SendMessage。
LRESULT WINAPI SendMessage( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam);
#define WM_SETTEXT 0x000C
user32.TranslateMessage BOOL WINAPI TranslateMessage( _In_ const MSG *lpMsg);
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG, *LPMSG;
?
如上,可能很慢定位。
8、暂停程序回溯堆栈
此外还可以通过出现注册对话框,按[F12]暂停,回溯调用堆栈。我们在第三个回溯找到了关键调用,这个调用阻塞了后面,即按钮后做出什么处理。
其实在前面我们查找字符串时已经可以看到的,就是往下滚动看看就看到和这个图一样的东西。
?
和前面一个预想的差不多,我们从[Alt+K]调用堆栈窗口,双击进入发起调用这个过程的地方,点击调用从。我们是断在这个proc_012ED3C4过程里的,从调用堆栈窗口看,CALL 012ED3C4是在过程proc_012EF64C里被调用的。
?
调用图如下,流程由堆栈记录,call(push),retn(pop),可在CPU窗口右下角堆栈里查看:
?
来到上一级调用后,看到有个跳转可以跳过,我们直接改为jmp跳,此为第三处检测跳。[F9]运行直接跳过弹窗来到主界面,限制就破除了。
?
9、以上就是去掉时间检测的逆向。
前面有注册窗口,我们还可以进行注册码逆向。这个比修改文件难,需要分析算法。
先这样。
10、后记
最后,我的OllyDbg有问题啊,第一次修改两处保存运行没问题,第二次修改两处就有问题,老是异常,找了好久,跟踪发现没有运行第二次修改,而在开始就崩溃了,不可能啊,郁闷好久。
由图也可以看出,前面debug节如此大就是包含了调试信息。
每次老以为修改处毛病,所以修改一处保存一下,不过文件较大比较辛苦。后来不时fc命令比较下,并且在ollydbg右键菜单-查找-所有修改:发现好多处,多了6、7处我未做的修改。靠坑爹啊。。。。
我记得某人说过ollydbg保存会有问题。
?
11、其他
判断文件存在很多方法CreateFile,FindFirstFile,FindNextFile,GetFileAttributesEx等。
BOOL kernel32.GetFileAttributesExW(FileName,InfoLevel,pFileinfo){
CALL ntdll.RtlDosPathNameToNtPathName_U
CALL ntdll.NtQueryFullAttributesFile
}
?
?
?
?