某过期不给用一例逆向过程记录

?

某过期不给用一例逆向过程记录

目录

某过期不给用一例逆向过程记录????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

}

?

?

?

?

时间: 2024-10-03 16:45:04

某过期不给用一例逆向过程记录的相关文章

ios逆向过程中lldb调试技巧

在ios逆向过程中,善于运用lldb,会给逆向带来很大的方便 一般的命令: 1.image list -o -f  看看各个模块在内存中的基址 2.register read r0  读取寄存器r0的值.register read  读取所有寄存器的值 3.expression(或者缩写expr)  表达式 例子: expression $r6 = 1   // 设置r6寄存器的值 expression $r6       // 查看r6寄存器的值 expression username(源代码

一起数据库中过期用户数据堆积问题的排查过程

[文章摘要] 对于使用数据库来存放大量用户的软件来说,过期数据的清理机制需要慎重设计.如果设计不当,则会导致数据的误删除或清理不完全. 本文对某数据清理模块因参数配置不当而导致的过期用户数据堆积问题进行了详细的分析,为相关软件问题的分析及解决提供了有益的参考. 一.问题描述 在某软件系统中,为了让不同种类的用户享受对应的服务,引入了一个信箱服务等级的概念,即不同服务等级的用户具有不同的权限."一分钱,一分货",对于运营商来说,高服务等级的用户收取高的资费,提供高质量的服务. 为了维护不

ios逆向过程中lldb调试技巧-po篇

假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在使用老一点版本的xcode的话,你又GDB调试器.他们有一些基本的相同的命令,因此假如你的xcode使用的是"(gdb)"提示,而不是"(lldb)"提示的话,你也能够更随一起做,而没有问题. "po"命令是"print object&qu

用redis实现动态时间段内统计排序

问题描述 需要根据某类数据在动态时间段内的统计值对这些数据进行排名.例如按过去24小时内点赞数排名的帖子,每隔一小时计算一次结果.以下描述均针对这个例子展开. 解决思路 针对这种问题,我的第一反应是直接通过 mysql一张数据表记录所有数据的每一条统计值改变的行为,例如记下每个帖子在哪个时间点被谁点赞.排序结果直接通过 select + where + order_by + limit.简单粗暴,但效率低下,扩展性差,而且当数据量很多时,会导致数据库查询效率低下. 那么为了提高效率, mysql

web测试常用的用例及知识

  1.      Web测试中关于登录的测试... 1 2.      搜索功能测试用例设计... 2 3.      翻页功能测试用例... 3 4.      输入框的测试... 5 5.      Web测试的常用的检查点... 6 6.      用户及权限管理功能常规测试方法... 8 7.      Web测试之兼容性测试... 9 8.      Web测试-sql注入... 10 9.      Web测试中书写用例时要考虑的检查点... 11 10.        手机电子邮

《编写有效用例》阅读笔记之二

基 于数据库操作的小用力称为CRUD用例,每个小用例都表达了单独需求,在处理这种用例是会有两种不同的方法,可以将其分离或者先使用单个管理实体用例对其 处理.在提取系统用例时或有许多用例大致相同,对此可能会建立一种通用搜索机.用例每个目标步骤的命名类似于编程语言中的子过程调用,而且用例是有人而不 是计算机使用.搜索任何东西都会有相同的步骤,对此为了方便操作我们可以建立一个参数化用例,为每个用例起一个别名.然后将别名数据值划分为三个不同的精 度级别,可以在一定程度上简化用例描述. 当对业务过程进行建

IOS逆向分析——GL脚本的提取

总结:要逆一个程序必须清楚地知道程序的结构和常用的API函数,不清楚一个程序而去逆出结果是不可能滴 首先是glsl脚本运行的全过程,第一步是为shader的运行创建一个容器GLuint glCreateProgram(void),第二步是把编译好的shader附加到程序void glAttachShader(GLuint program, GLuint shader),编译好的shader可以是多个所以第二步可以重复多步把每一个编译好的一一附加到程序,顶点shader和像素shader一一成对,

Android UI自动化用例设计技巧

一.封装方法 1.编程如何越来越快: 首先,需要经验丰富,知识面广. 其次,每一个熟练编程的人员,都会有自己的一个库,解决各种问题.各种通用的方法函数. 同理,自动化脚本也是编程,测试用例则为需求,UI自动化编写虽然容易,但是界面变化快.维护庞大.所以封装通用方法,是最快最容易的途径. 2.哪些方法需要封装: 公共的操作方法 经常使用的步骤:超过两次以上 经常使用的组件:输入框.文本框.列表 经常操作的布局:多个组件组成通用的布局 经常操作的页面:ui页面由一个一个单独Activity组成,就可

精装友情通讯录算法逆向与注册机实现

精装友情通讯录 注册算法分析: 1.  注册码由三部分组成. 2. 注册码的第一部分是由订单号对0x6d取余 3. 注册码第二部分: 先将订单号与0XB25F1异或,将异或后的结果转换成十进制字符串后,在些字符串后面连接上两个字符. 而这两个字符分别由字符串的第0位,第1位和第2位,第3位计算而来.记为szTemp.算法如下 DWORD dwTemp2 = dwNum ^ 0xB25F1; TCHAR szTemp[20] = {0}; _sntprintf(szTemp, 20, "%d&qu