破解-小甲鱼笔记-15

通过设置killtimer关键字函数断点进行寻找突破口

断点设置完成之后,开始运行软件,直到运行到我们想看到的输入注册码窗口,后输入错误的注册码,进行测试

输入完成之后OD上显示断点的位置如下:

004DC19D > \83F8 03 cmp eax,0x3
004DC1A0 . 75 1E jnz short DVDMenuS.004DC1C0
004DC1A2 . 8B57 1C mov edx,dword ptr ds:[edi+0x1C] ; Case 3 of switch 004DBDA4
004DC1A5 . 50 push eax ; /TimerID = 0x3
004DC1A6 . 52 push edx ; |hWnd = 00080D4C ('DVD Menu Studio - [Untitled]',class='Afx:400000:8:10003:0:1560cb3')
004DC1A7 . FF15 B4575E00 call dword ptr ds:[<&USER32.KillTimer>] ; \KillTimer
004DC1AD . 6A 00 push 0x0
004DC1AF . 6A 00 push 0x0
004DC1B1 . 68 5C666400 push DVDMenuS.0064665C ; ASCII "The registration code seems to be not valid.\nPlease check if you didn't made any mistake."
004DC1B6 . E8 919D0D00 call DVDMenuS.005B5F4C
004DC1BB . E9 B7000000 jmp DVDMenuS.004DC277
004DC1C0 > 83F8 04 cmp eax,0x4
004DC1C3 . 75 1E jnz short DVDMenuS.004DC1E3
004DC1C5 . 50 push eax ; /TimerID = 0x3; Case 4 of switch 004DBDA4
004DC1C6 . 8B47 1C mov eax,dword ptr ds:[edi+0x1C] ; |
004DC1C9 . 50 push eax ; |hWnd = 00000003
004DC1CA . FF15 B4575E00 call dword ptr ds:[<&USER32.KillTimer>] ; \KillTimer
004DC1D0 . 6A 00 push 0x0
004DC1D2 . 6A 00 push 0x0
004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."
004DC1D9 . E8 6E9D0D00 call DVDMenuS.005B5F4C
004DC1DE . E9 94000000 jmp DVDMenuS.004DC277
004DC1E3 > 83F8 05 cmp eax,0x5
004DC1E6 . 75 15 jnz short DVDMenuS.004DC1FD

此时发现注册成功的标志位置:

004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."

那通过观察上下汇编指令,可知要让其在等于4的时候成立,做到jnz指令不跳转从而实现破解成功。

这是主体实现破解成功思路。

通过分析,我门要找其根源,那么我们就跟进下去,从比较条件为3的时候向上跟踪。

004DC19D > \83F8 03 cmp eax,0x3

从此处开始, 发现其跳转来自eax=00000003
跳转来自 004DC04C

通过操作跳转如下:

004DC049 > \83F8 02 cmp eax,0x2
004DC04C . 0F85 4B010000 jnz DVDMenuS.004DC19D

再根据其条件不等于2 查看跳转来自的地址进行回溯跟踪。

004DC049 > \83F8 02 cmp eax,0x2
eax=00000003
跳转来自 004DBE01

跳转到下面

004DBDFE > \83F8 07 cmp eax,0x7
004DBE01 . 0F85 42020000 jnz DVDMenuS.004DC049

同上

004DBDFE > \83F8 07 cmp eax,0x7
eax=00000003
跳转来自 004DBDA9

跳转如下:

004DBDA4 . 83F8 01 cmp eax,0x1 ; Switch (cases 1..B)
004DBDA7 . 8BF9 mov edi,ecx
004DBDA9 . 75 53 jnz short DVDMenuS.004DBDFE
004DBDAB . 50 push eax ; /TimerID = 0x3; Case 1 of switch 004DBDA4

此时发现跳转到程序的开头入口点

使用的是switch 语句结构进行跳转,跳转条件从1-B

在程序的开头设置断点,重新跑程序,查看程序运行过程的eax的值这么发送变化的。

观察可知,程序通过switch循环,进行判断,当输入错误的注册码时,eax=3,那么程序运行到这个位置和3进行比较相等,那么就跳转,
执行到错误提示的位置如下:

004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."

那么此处突破口的关键位置如下:

004DBD9E . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004DBDA1 . 53 push ebx ; DVDMenuS.004DBD80
004DBDA2 . 56 push esi
004DBDA3 . 57 push edi
004DBDA4 . 83F8 01 cmp eax,0x1 ; Switch (cases 1..B)

上述理论上通过更改 004DBD9E . 8B45 08 mov eax,dword ptr ss:[ebp+0x8] 为 mov eax, 4
便可得到破解的目的,但通过测试发现,如果这样修改第一个会导致增加后源程序多了两个字节的数据,这样就会导致堆栈不对称平衡,
从而影响整个程序运行,或者运行不正常,那么我们就不能这样修改,所以此处要用到经典的破解手法就是内联补丁。

内联补丁:表示就是通过找到程序中没有实际代码指令的位置,添加要破解的指令,通过互相跳转来实现不影响程序运行的目的实现最终的破解。

制作内联补丁(内嵌补丁)

005E47C0 00 db 00
005E47C1 00 db 00
005E47C2 00 db 00
005E47C3 00 db 00
005E47C4 00 db 00
005E47C5 00 db 00
005E47C6 00 db 00
005E47C7 00 db 00
005E47C8 00 db 00
005E47C9 00 db 00
005E47CA 00 db 00
005E47CB 00 db 00
005E47CC 00 db 00
005E47CD 00 db 00
005E47CE 00 db 00
005E47CF 00 db 00
005E47D0 00 db 00
005E47D1 00 db 00
005E47D2 00 db 00

类似找到上面没有编写汇编指令的代码处,在内嵌补丁的过程中 尽量不要在刚开始的位置进行内嵌,要尽量空出几行进行,

那么从地址 005E47D0 开始

根据下面的关键代码位置进行更改

004DBD9E > . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004DBDA1 . 53 push ebx ; DVDMenuS.004DBD80
004DBDA2 . 56 push esi
004DBDA3 . 57 push edi

更改如下:

005E47D0 > B8 04000000 mov eax,0x4
005E47D5 53 push ebx ; DVDMenuS.004DBD80
005E47D6 56 push esi
005E47D7 00 db 00

然后到 地址 004DBD9E 处将其更改为 jmp 005E47D0

让程序运行到此处跳转至我们设置好的内嵌补丁

然后在地址 005E47D7 添加jmp 004DBDA3 让其跳转至正常程序的下面代码执行后面的流程,如下:

004DBD9E > /E9 2D8A1000 jmp <DVDMenuS.添加内嵌补丁的开头位置>
004DBDA3 . |57 push edi

上面操作 导致一个死循环,还没有完全破解。

所以通过整体观察,发现switch在跳转到B的时候,就会跳出循环,最终将其改为如下:

005E47D0 B8 0B000000 mov eax,0xB
005E47D5 . 53 push ebx
005E47D6 . 56 push esi
005E47D7 .^ E9 C775EFFF jmp DVDMenuS.004DBDA3

将005E47D0 B8 0B000000 mov eax,0xB 改为等于B 就跳出循环,成功破解。

005ABE4D $ B8 442D5E00 mov eax,DVDMenuS.005E2D44

004DC0D1 . E8 77FD0C00 call DVDMenuS.005ABE4D

执行完整个程序,堆栈的调用过程

调用堆栈: 主线程
地址 堆栈 函数过程 / 参数 调用来自 结构
0018FA60 758C7C1D user32.758C78C2 user32.758C7C18 0018FA7C
0018FA80 005B044F user32.GetMessageA DVDMenuS.005B0449 0018FA7C
0018FA84 00662858 pMsg = DVDMenuS.00662858
0018FA88 00000000 hWnd = NULL
0018FA8C 00000000 MsgFilterMin = 0x0
0018FA90 00000000 MsgFilterMax = 0x0
0018FA9C 005AF0A2 包含DVDMenuS.005B044F DVDMenuS.005AF09F
0018FAC0 005ABF2E DVDMenuS.005AEFC8 DVDMenuS.005ABF29
0018FAFC 004DC0D6 ? DVDMenuS.005ABE4D DVDMenuS.004DC0D1

我们查找的话,也要查找最后的那个调用来自, 要从这里找,找到调用nag窗口的来源地址,然后双击,进入

当找到这个关键的地址,就要在这个关键位置的上下文的开始下个断点进行跟进

另一种方法,牛逼而且简单,待强化

将004DBDC5 /75 1F jnz short DVDMenuS.004DBDE6

修改为nop保存即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容