大家好,我是朽木QQ200655307 今天给大家做个教程 破解外挂的教程
汇编的教程 大家看我的操作吧.
现在给希望成为高手的菜鸟们做些高手基础教程。
首先就做破解教程吧。
学会了破解,那些所谓木马免杀就纯粹小菜一碟。
而且能深刻理解计算机的原理和编程实现。
废话不说,就拿看雪的一个程序来做例子。。。
工具准备:
ollydbg
和少许的汇编知识
bad serial,sorry
现在就查找这个
查找文本参考
00401154 |> \6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
00401156 |. 68 35304000 PUSH crackme.00403035 ; |Title = "Crackme 1.0"
0040115B |. 68 22304000 PUSH crackme.00403022 ; |Text = "Bad Serial, Sorry!"
00401160 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hOwner = NULL
00401166 |. E8 23000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
显然这里是错误提示,弹出的对话框。
由红色的那条线看到,是由00401135 |. /75 1D |JNZ SHORT crackme.00401154
跳到错误提示的。
00401122 |. B9 08000000 MOV ECX,8
00401127 |. BE 44304000 MOV ESI,crackme.00403044
0040112C |. BF 08304000 MOV EDI,crackme.00403008
00401131 |> 8A06 /MOV AL,BYTE PTR DS:[ESI]
00401133 |. 3A07 |CMP AL,BYTE PTR DS:[EDI]
00401135 |. 75 1D |JNZ SHORT crackme.00401154
显然这里是校验注册码。逐位校验,一共8位(MOV ECX,8),若有一位不同就说明注册码不对了。
现在看看输入的数据保存在哪里?利用getdlgitemtext这个函数做中断
00401099 |. 6A 0A PUSH 0A ; /Count = A (10.)
0040109B |. 68 44304000 PUSH crackme.00403044 ; |Buffer = crackme.00403044
004010A0 |. 68 B80B0000 PUSH 0BB8 ; |ControlID = BB8 (3000.)
004010A5 |. FF35 54304000 PUSH DWORD PTR DS:[403054] ; |hWnd = NULL
004010AB |. E8 D2000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040109B |. 68 44304000 PUSH crackme.00403044这个是保存数据的参数 地址是:00403044
004010D0 |. B9 08000000 MOV ECX,8
004010D5 |. BE 44304000 MOV ESI,crackme.00403044
004010DA |> 8036 32 /XOR BYTE PTR DS:[ESI],32
004010DD |. 46 |INC ESI
004010DE |.^ E2 FA \LOOPD SHORT crackme.004010DA
004010E0 |. BE 44304000 MOV ESI,crackme.00403044
004010E5 |. B9 04000000 MOV ECX,4
004010EA |> 8A06 /MOV AL,BYTE PTR DS:[ESI]
004010EC |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1]
004010EF |. 32C3 |XOR AL,BL
004010F1 |. 8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL
004010F7 |. 83C6 02 |ADD ESI,2
004010FA |. 47 |INC EDI
004010FB |.^ E2 ED \LOOPD SHORT crackme.004010EA
004010FD |. BE 4C304000 MOV ESI,crackme.0040304C
00401102 |. 8A06 MOV AL,BYTE PTR DS:[ESI]
00401104 |. 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
00401107 |. 32C3 XOR AL,BL
00401109 |. 8A5E 02 MOV BL,BYTE PTR DS:[ESI+2]
0040110C |. 8A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040110F |. 32D9 XOR BL,CL
004010DA |> /8036 32 /XOR BYTE PTR DS:[ESI],32 ; 第一次处理
004010DD |. |46 |INC ESI
004010DE |.^\E2 FA \LOOPD SHORT crackme.004010DA
应该看得懂这几句的意思吧,就是把输入的注册码12345678对应的ascii码31,32,33,34,35,36,37,38分别和32H异或运算
运算后是:3,0,1,6,7,4,5,a
004010E5 |. B9 04000000 MOV ECX,4
004010EA |> 8A06 /MOV AL,BYTE PTR DS:[ESI] ; 第二次处理
004010EC |. 8A5E 01 |MOV BL,BYTE PTR DS:[ESI+1]
004010EF |. 32C3 |XOR AL,BL
004010F1 |. 8887 4C304000 |MOV BYTE PTR DS:[EDI+40304C],AL
004010F7 |. 83C6 02 |ADD ESI,2
004010FA |. 47 |INC EDI
004010FB |.^ E2 ED \LOOPD SHORT crackme.004010EA
这里是把与32h异或运算后的结果,每两位异或然后保存在40304c中即8位变4位
004010FD |. BE 4C304000 MOV ESI,crackme.0040304C ; 第三次处理
00401102 |. 8A06 MOV AL,BYTE PTR DS:[ESI]
00401104 |. 8A5E 01 MOV BL,BYTE PTR DS:[ESI+1]
00401107 |. 32C3 XOR AL,BL
00401109 |. 8A5E 02 MOV BL,BYTE PTR DS:[ESI+2]
0040110C |. 8A4E 03 MOV CL,BYTE PTR DS:[ESI+3]
0040110F |. 32D9 XOR BL,CL
00401111 |. 32C3 XOR AL,BL
这里4位变2位
最后变一位保存在al中,最后al的值是8
最后这里00401113 |. B9 08000000 MOV ECX,8
00401118 |. BE 44304000 MOV ESI,crackme.00403044
0040111D |> 3006 /XOR BYTE PTR DS:[ESI],AL
0040111F |. 46 |INC ESI
00401120 |.^ E2 FB \LOOPD SHORT crackme.0040111D
是将每一位跟al异或
保存在BYTE PTR DS:[ESI]
数据将变成b,8,9,e,f,c,d,2
总的来讲流程是:
1 原始数据
与32h异或 31,32,33,34,35,36,37,38
2 异或后8》4,4》2,2》1 保存在al,这个数据时al=8
3 与al异或
生成与注册码用同样方法生成的数据比较,敏合即注册码正确
我们来看看结果00403044这里保存了运算结果,看结果跟我们前面说的一样。b,8,9,e,f,c,d,2
好了我们看看正确的结果是什么?
0040112C |. BF 08304000 MOV EDI,crackme.00403008
00403008保存了正确的结果:分别是:71,18,59,1b,79,42,45,4c
那么如何从这些数据得到正确的注册码呢?
对了,就像是数学中类似的反函数了,就是将数据反过来运算一次就能得到原始数据
将71,18,59,1b,79,42,45,4c
进行第二部2 异或后8》4,4》2,2》1 保存在al,此时al为19
将71,18,59,1b,79,42,45,4c 与19异或
将71,18,59,1b,79,42,45,4c与 32异或(注意这里32,19和其他数字都是16进制的)
最后得到 5a,33,72,30,52,69,6e,67
对应ascii:Z,3,r,0,R,i,n,g(Z3r0Ring)
我们试试看。。。。。。。。。。。
破解成功了。