本帖最后由 Y4Ng 于 2012-5-6 21:23 编辑
使用工具:Peid,OllyDbg,Python
说明:本方法使用于极速软件的各种格式转换器,其他软件的方法和本方法类同。
Peid 查壳,无壳,语言:Borland Delphi 6.0 - 7.0
OD载入mp4.exe,F9运行,弹出试用或者输入注册码的窗口,
软件注册-用假注册码去试试有什么提示,
弹出“注册码错误,请重新输入用户名和注册码!”的对话框
OD中搜索字符串注册码错误,找到上面的提示,双击。停在004C1FA8004C1FA1 > \6A 40 PUSH 40
004C1FA3 . 68 C4204C00 PUSH 004C20C4 ; register
004C1FA8 . 68 D0204C00 PUSH 004C20D0 ; 注册码错误,请重新输入用户名和注册码!
向上观察反汇编代码004C1EB9 . E8 B2FEFFFF CALL 004C1D70 ; 注册码在这个CALL里面 F7
004C1EBE . 84C0 TEST AL,AL
004C1EC0 . 0F84 DB000000 JE 004C1FA1 ; 关键跳,如果成功跳转,就跳到注册码错误
在004C1EB9 CALL 004C1D70下断点,再次用假注册码试着注册一下,OD断在004C1EB9 CALL 004C1D70处F7进入这个CALL ,
...004C1D9B |. E8 8054FAFF CALL 00467220 ; 取假注册码
004C1DA0 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004C1DA3 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
004C1DA6 |. E8 296DF4FF CALL 00408AD4
004C1DAB |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004C1DAE |. 50 PUSH EAX
004C1DAF |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
004C1DB2 |. 8B86 04030000 MOV EAX,DWORD PTR DS:[ESI+304]
004C1DB8 |. E8 6354FAFF CALL 00467220 ; 取用户名
004C1DBD |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
004C1DC0 |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
004C1DC3 |. E8 0C6DF4FF CALL 00408AD4
004C1DC8 |. 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
004C1DCB |. 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
004C1DCE |. 8BC6 MOV EAX,ESI
004C1DD0 |. E8 EBFCFFFF CALL 004C1AC0 ; 这个CALL生成真注册码 F7进入
004C1DD5 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
F7进入004C1DD0 CALL 004C1AC0
以下直接看注释!004C1B0C |> /8D4D EC /LEA ECX,DWORD PTR SS:[EBP-14]
004C1B0F |. |8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4]
004C1B12 |. |0FB64418 FF |MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
004C1B17 |. |33D2 |XOR EDX,EDX
004C1B19 |. |E8 3273F4FF |CALL 00408E50 ; hex4Uname = 把用户名转换成十六进制
004C1B1E |. |8B55 EC |MOV EDX,DWORD PTR SS:[EBP-14]
004C1B21 |. |8D45 F8 |LEA EAX,DWORD PTR SS:[EBP-8]
004C1B24 |. |E8 CB2AF4FF |CALL 004045F4
004C1B29 |. |43 |INC EBX
004C1B2A |. |4E |DEC ESI
004C1B2B |.^\75 DF \JNZ SHORT 004C1B0C
004C1B40 |> /8B45 F8 /MOV EAX,DWORD PTR SS:[EBP-8]
004C1B43 |. |E8 A42AF4FF |CALL 004045EC
004C1B48 |. |2BC3 |SUB EAX,EBX
004C1B4A |. |8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8]
004C1B4D |. |8A1402 |MOV DL,BYTE PTR DS:[EDX+EAX] ; reOrdHex4Uname = 逆序用户名的ASCII码的每一位
004C1B50 |. |8D45 E8 |LEA EAX,DWORD PTR SS:[EBP-18]
004C1B53 |. |E8 A029F4FF |CALL 004044F8
004C1B58 |. |8B55 E8 |MOV EDX,DWORD PTR SS:[EBP-18]
004C1B5B |. |8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
004C1B5E |. |E8 912AF4FF |CALL 004045F4
004C1B63 |. |43 |INC EBX
004C1B64 |. |4E |DEC ESI
004C1B65 |.^\75 D9 \JNZ SHORT 004C1B40
004C1B80 |. 50 PUSH EAX
004C1B81 |. B9 04000000 MOV ECX,4
004C1B86 |. BA 05000000 MOV EDX,5
004C1B8B |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; key = 取string2的前八位
004C1B8E |. E8 B92CF4FF CALL 0040484C
004C1B93 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; key1 = key的前四位
004C1B96 |. E8 512AF4FF CALL 004045EC
004C1B9B |. 83F8 04 CMP EAX,4 ; 判断key1是否大于4
004C1B9E |. 7D 2F JGE SHORT 004C1BCF
004C1BCF |> \8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; key2 = key的后四位
004C1BD2 |. E8 152AF4FF CALL 004045EC
004C1BD7 |. 83F8 04 CMP EAX,4 ; 判断key2是否大于4
004C1C0B |> \8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] ; ↓↓↓下面的是一个字符串常量 下面称为mp4str
004C1C0E |. BA 981C4C00 MOV EDX,004C1C98 ; mp46687i686c
004C1C13 |. E8 9027F4FF CALL 004043A8
004C1C18 |. 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
004C1C1B |. 50 PUSH EAX
004C1C1C |. B9 04000000 MOV ECX,4
004C1C21 |. BA 01000000 MOV EDX,1
004C1C26 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004C1C29 |. E8 1E2CF4FF CALL 0040484C
004C1C2E |. FF75 DC PUSH DWORD PTR SS:[EBP-24] ; mp4str的前四位
004C1C31 |. 68 B01C4C00 PUSH 004C1CB0 ; -
004C1C36 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; key1
004C1C39 |. 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
004C1C3C |. 50 PUSH EAX
004C1C3D |. B9 05000000 MOV ECX,5
004C1C42 |. BA 05000000 MOV EDX,5
004C1C47 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
004C1C4A |. E8 FD2BF4FF CALL 0040484C
004C1C4F |. FF75 D8 PUSH DWORD PTR SS:[EBP-28] ; mp4str的5位至9位
004C1C52 |. 68 B01C4C00 PUSH 004C1CB0 ; -
004C1C57 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; key2
004C1C5A |. 8BC7 MOV EAX,EDI ; ↑↑↑以上就可以组成正确的注册码了。
至此注册码已经分析完成。
输入分析出来的注册码将会发现,这次没有提示注册码错误了,
但是在帮助文件-关于里面可以看到这只是一个Demo版本。
而且标题栏还有“(试用版只能转换源文件30秒的时间!)”
搜索字符串,
004C60C3 . 80B8 A5050000>CMP BYTE PTR DS:[EAX+5A5],0 ; 此处cmp,判断下面的je是否跳转
004C60CA . 74 29 JE SHORT 004C60F5
004C60CC . 8D55 B0 LEA EDX,DWORD PTR SS:[EBP-50]
004C60CF . A1 38DE4D00 MOV EAX,DWORD PTR DS:[4DDE38]
004C60D4 . E8 4711FAFF CALL 00467220
004C60D9 . 8D45 B0 LEA EAX,DWORD PTR SS:[EBP-50]
004C60DC . BA B8674C00 MOV EDX,004C67B8 ; (试用版只能转换源文件30秒的时间!)
004C60E1 . E8 0EE5F3FF CALL 004045F4
在004C60C3 . 80B8 A5050000>CMP BYTE PTR DS:[EAX+5A5],0 ; 此处cmp,判断下面的je是否跳转
按F2下断点,用OD重新载入软件, F9运行,停在004C60C3
在信息栏可以看到
DS:[00A62CB5]=01
右键它,跟随地址到数据窗口
选中00A62CB5地址的“01” 下硬件写入Byte断点。
按Ctrl+F2重新开始。
按两次F9运行,004C5D7F . C680 A5050000>MOV BYTE PTR DS:[EAX+5A5],0 ; 此时把“1”传给00A62CB5,就是Demo版本,如果把“0”传给00A62CB5,就是正式版。
004C5D86 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 按两次F9停在这里
所以修改004C5D7F MOV BYTE PTR DS:[EAX+5A5],1
为
004C5D7F MOV BYTE PTR DS:[EAX+5A5],0
然后保存,再次打开就是正式版了。
提供一组可用注册码:
用户名:吾爱专版
用户名:mp46-6E0B687i6-8A7D
注册机(python)#!/usr/bin/env python
import binascii
class JiSuMp4:
def __init__(self, userName):
self.userName = userName
print("UserName is:%s" % self.userName)
hex4Uname = binascii.b2a_hex(self.userName).upper()
reOrdHex4Uname = hex4Uname[::-1]
key = reOrdHex4Uname[0:8]
print("key is:mp46-%s%s%s%s687i6-%s%s%s%s" % (key[0], key[1], key[2], key[3], key[4], key[5], key[6], key[7]))
def main():
username = raw_input("Please enter username(Length>=4):")
JiSuMp4(username)
if __name__ == '__main__':
main()
http://115.com/file/dpp7zhp9#极速mp4视频格式转换器吾爱专版.7z
|