-
-
一个vb程序的破解过程。新手
-
发表于:
2004-8-19 14:14
9232
-
我也不知道这是什么游戏的外挂,也不知道效果怎么样
先脱壳我用的是trw2000手工脱壳
跟到入口点00401490处
0177:00401490 6840304000 PUSH DWORD 00403040 //通常这就是入口了
0177:00401495 E8F0FFFFFF CALL `MSVBVM60!ThunRTMain`
0177:0040149A 0000 ADD [EAX],AL
makepe抓出文件。
重新载入newpe.exe(既刚才抓出的pe文件)
g执行进入界面,调整大小在文本框里输入77587758
Ctrl+N下断点bpx __vbastrcmp
g执行,不断的有中断产生,没办法了
只有bd *之后回到程序界面看看,(我怀疑:是不是有定时器在运行然后不断在调用某一函数)
点了一下停止,在下断点ok没有多余的垃圾中断产生。
点击注册,来到这里,
0177:0040BFCB 6AFF PUSH BYTE -01
0177:0040BFCD 6A01 PUSH BYTE +01
0177:0040BFCF FF1500114000 CALL `MSVBVM60!__vbaFileOpen`
0177:0040BFD5 8D7E3C LEA EDI,[ESI+3C]
0177:0040BFD8 6A01 PUSH BYTE +01
0177:0040BFDA 57 PUSH EDI
0177:0040BFDB FF1520104000 CALL `MSVBVM60!__vbaLineInputStr`
0177:0040BFE1 6A01 PUSH BYTE +01
0177:0040BFE3 FFD3 CALL EBX
0177:0040BFE5 8B0F MOV ECX,[EDI]
0177:0040BFE7 8B5634 MOV EDX,[ESI+34]
0177:0040BFEA 51 PUSH ECX
0177:0040BFEB 52 PUSH EDX
0177:0040BFEC FF1594104000 CALL `MSVBVM60!__vbaStrCmp`
0177:0040BFF2 85C0 TEST EAX,EAX/////pmodule后来到这里
0177:0040BFF4 0F8581000000 JNZ NEAR 0040C07B////多么经典的判断啊,改了他
0177:0040BFFA 8B06 MOV EAX,[ESI] ////就注册成功了,
0177:0040BFFC 56 PUSH ESI
0177:0040BFFD FF DB FF
0177:0040BFFE 90 NOP
0177:0040BFFF B8 DB B8
更改标志位ZF为1,结果成功注册,到着已经查不多了,看到0040BFEA上的ECX了吗?里面装的就是正确序列号的地址啊,
d ecx就能看到了,但是我发现0177:0040BFCF有点不对劲,分析了一下发现他是把注册码写到文件里在从文件中读出来比较,
而且每次启动都会判断,不过我们已经把注册码读出来了,不是吗?所以再启动程序时它发现不是正确的又会让你注册这时输入
正确的注册码,到这里大家可能以为会到此结束了吧。没有,还没有结束,现在这道程序还没有完整的破解好,要改成无论输入什么
序列号都正确,这样才是暴破嘛,刚开始打算改装程序,让他显示正确的注册码可是这样也还是要输入一边,能不能只输入一边任意字
符就达到把正确的注册码写入文件的的功能呢? 答:能
我决定从这里下手:
0177:0040BF80 7D12 JNL 0040BF94//////////////跳到BF94处(向文件里写如你输入的注册码)
0177:0040BF82 68A0000000 PUSH DWORD A0
0177:0040BF87 687C3F4000 PUSH DWORD 00403F7C
0177:0040BF8C 57 PUSH EDI
0177:0040BF8D 50 PUSH EAX
0177:0040BF8E FF154C104000 CALL `MSVBVM60!__vbaHresultCheckObj`
0177:0040BF94 8B45E8 MOV EAX,[EBP-18]////到这里把我们输入的注册码的地址传到eax在压栈,
0177:0040BF97 50 PUSH EAX ////而此时正确的注册码地址在004264D8处,
0177:0040BF98 6A01 PUSH BYTE +01
0177:0040BF9A 68B83E4000 PUSH DWORD 00403EB8
0177:0040BF9F FF15D4104000 CALL `MSVBVM60!__vbaPrintFile`
我们这样做,在程序其他空白处写如下代码
:push 004264D8 //为什么要替换挪走两条语句呢。因为
: push 001
: jmp 0040BF9A
让程序执行到0040BF94时跳到这里在,我们处理好堆栈后在跳到他的下一句(既:0040BF9A)
我们为什么要替换掉两条语句呢。因为我们写在0040BF94处的jmp语句要占5个字节,所以如此
这样头一步0040BFF4处的jnz我们就不用改了,因为它注册整体思路是这样的:
取我们的注册码写入"c:\wuying.dll"中
再打开"c:\wuying.dll"取出注册码
和正确的比较给出结果
并且每次启动程序时都会检查
因为我们在第一个环节就把正确的注册码写入到文件里了,所以后面的就不用管了,
重新加壳压缩(当然如果你的硬盘超大也可以不压,我的硬盘可不行,才10G(路人做不屑状))
到这才是真正的结束了,
挺简单的一个教程,大家不要笑话
小破孩附件:WYJ-XP.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)