反汇编一道题求助~

CheeRok 2013-10-11 10:57:51
http://pan.baidu.com/s/1kSfhr

这是一道有关反汇编的题目。LZ初学汇编,基础很烂……

学长又丢下这样一道BUG的题给我……

关键语句已经找出来。就是关键call怎么都看不懂……(004016A3就是验证密码的call。这个call里有4个call,第4个不用管……关键在前3个call里)

不求各位大神给我答案,帮我找出怎么通过call的验证和设计到算法的部分就OK了

(如果能找到答案更加感谢……)

还有一个小小的请求就是,希望能给我讲解下……不想只看答案……
...全文
419 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿蚁新醅酒 2013-10-16
  • 打赏
  • 举报
回复
UINT A = 0; for(int i = 0;i<USERNAME.LENGTH;i++) A += (char)USERNAM[i] ^ ((char)(0x30 + i)); -------------------------------------------------------- 是用户名的每一个字符和后一个字符加上多少进行XOR运算……有人说48,为什么是48.不是30? 48就是0x30.不过不是和常量0x30亦或,是 (0x30 + i),要加上i的
zara 2013-10-16
  • 打赏
  • 举报
回复
48 不就是 30h 么,一个十进制,一个是十六进制
CheeRok 2013-10-16
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
看不懂怎么处理的,这个就有些麻烦了,初涉其中的话,也只有一条指令一条指令的运行,看具体是怎么操作的那些字符了,不过由于源程序应该是由 c 类的高级语言写的吧,所以汇编看着有不少的废话,反而会迷糊思路。
现在看得差不多了。就差第一个call里用户名的处理值是什么……是用户名的每一个字符和后一个字符加上多少进行XOR运算……有人说48,为什么是48.不是30?
CheeRok 2013-10-16
  • 打赏
  • 举报
回复
引用 8 楼 u011275002 的回复:
这个crack挺容易的,先给一个注册码: 721243641812146652 ,密码123456 00401960 /> \55 push ebp 00401961 |. 8BEC mov ebp,esp 00401963 |. 83EC 58 sub esp,58 00401966 |. 53 push ebx 00401967 |. 56 push esi 00401968 |. 57 push edi 00401969 |. 8D7D A8 lea edi,[local.22] 0040196C |. B9 16000000 mov ecx,16 00401971 |. B8 CCCCCCCC mov eax,CCCCCCCC 00401976 |. F3:AB rep stos dword ptr es:[edi] 00401978 |. 8B45 10 mov eax,[arg.3] 0040197B |. 3B45 14 cmp eax,[arg.4] 0040197E |. 7E 08 jle short GUI.00401988 00401980 |. 8B4D 10 mov ecx,[arg.3] 00401983 |. 894D EC mov [local.5],ecx 00401986 |. EB 06 jmp short GUI.0040198E 00401988 |> 8B55 14 mov edx,[arg.4] 0040198B |. 8955 EC mov [local.5],edx 0040198E |> 837D EC 14 cmp [local.5],14 ; 用户名长度必须小于等于20 00401992 |. 7E 04 jle short GUI.00401998 00401994 |. 33C0 xor eax,eax 00401996 |. EB 6A jmp short GUI.00401A02 00401998 |> 8B45 10 mov eax,[arg.3] 0040199B |. 3B45 14 cmp eax,[arg.4] 0040199E |. 7D 08 jge short GUI.004019A8 004019A0 |. 8B4D 10 mov ecx,[arg.3] 004019A3 |. 894D E8 mov [local.6],ecx 004019A6 |. EB 06 jmp short GUI.004019AE 004019A8 |> 8B55 14 mov edx,[arg.4] 004019AB |. 8955 E8 mov [local.6],edx 004019AE |> 837D E8 06 cmp [local.6],6 ; 密码长度必须大于等于6 004019B2 |. 7D 04 jge short GUI.004019B8 004019B4 |. 33C0 xor eax,eax 004019B6 |. EB 4A jmp short GUI.00401A02 004019B8 |> 8B45 10 mov eax,[arg.3] 004019BB |. 50 push eax 004019BC |. 8B4D 0C mov ecx,[arg.2] 004019BF |. 51 push ecx 004019C0 |. E8 72F6FFFF call GUI.00401037 ; 对用户名处理得到一个数值A 004019C5 |. 83C4 08 add esp,8 004019C8 |. 8945 F4 mov [local.3],eax 004019CB |. 837D F4 00 cmp [local.3],0 004019CF |. 7D 04 jge short GUI.004019D5 004019D1 |. 33C0 xor eax,eax 004019D3 |. EB 2D jmp short GUI.00401A02 004019D5 |> 8B55 14 mov edx,[arg.4] 004019D8 |. 52 push edx 004019D9 |. 8B45 08 mov eax,[arg.1] 004019DC |. 50 push eax 004019DD |. E8 5AF6FFFF call GUI.0040103C ; 对密码处理得到一个数值B 004019E2 |. 83C4 08 add esp,8 004019E5 |. 8945 F0 mov [local.4],eax 004019E8 |. 837D F0 00 cmp [local.4],0 004019EC |. 7D 04 jge short GUI.004019F2 004019EE |. 33C0 xor eax,eax 004019F0 |. EB 10 jmp short GUI.00401A02 004019F2 |> 8B4D F0 mov ecx,[local.4] 004019F5 |. 51 push ecx 004019F6 |. 8B55 F4 mov edx,[local.3] 004019F9 |. 52 push edx 004019FA |. E8 33F6FFFF call GUI.00401032 ; A^B = C;,如果C等0x71则注册成功! 004019FF |. 83C4 08 add esp,8 00401A02 |> 5F pop edi 00401A03 |. 5E pop esi 00401A04 |. 5B pop ebx 00401A05 |. 83C4 58 add esp,58 00401A08 |. 3BEC cmp ebp,esp 00401A0A |. E8 91000000 call GUI.00401AA0 00401A0F |. 8BE5 mov esp,ebp 00401A11 |. 5D pop ebp 00401A12 \. C3 retn call GUI.00401037 ; 对用户名处理得到一个数值A 对用户名处理,这里需要用户名是字母或数字. 假设用户名字符串为 USERNAME UINT A = 0; for(int i = 0;i<USERNAME.LENGTH;i++) A += (char)USERNAM[i] ^ ((char)(0x30 + i)); call 0040103C 是对密码进行处理得到B B的要求数值,后一个数字必须必前数字大. 计算方法是 计算所有数值的ACII码的和B 最后如果A^B等于0x71.则注册成功.
A的值是用户名每个字母 异或 每个字母的序号加上48么。是的话为什么是48?
绿蚁新醅酒 2013-10-15
  • 打赏
  • 举报
回复
这个crack挺容易的,先给一个注册码: 721243641812146652 ,密码123456 00401960 /> \55 push ebp 00401961 |. 8BEC mov ebp,esp 00401963 |. 83EC 58 sub esp,58 00401966 |. 53 push ebx 00401967 |. 56 push esi 00401968 |. 57 push edi 00401969 |. 8D7D A8 lea edi,[local.22] 0040196C |. B9 16000000 mov ecx,16 00401971 |. B8 CCCCCCCC mov eax,CCCCCCCC 00401976 |. F3:AB rep stos dword ptr es:[edi] 00401978 |. 8B45 10 mov eax,[arg.3] 0040197B |. 3B45 14 cmp eax,[arg.4] 0040197E |. 7E 08 jle short GUI.00401988 00401980 |. 8B4D 10 mov ecx,[arg.3] 00401983 |. 894D EC mov [local.5],ecx 00401986 |. EB 06 jmp short GUI.0040198E 00401988 |> 8B55 14 mov edx,[arg.4] 0040198B |. 8955 EC mov [local.5],edx 0040198E |> 837D EC 14 cmp [local.5],14 ; 用户名长度必须小于等于20 00401992 |. 7E 04 jle short GUI.00401998 00401994 |. 33C0 xor eax,eax 00401996 |. EB 6A jmp short GUI.00401A02 00401998 |> 8B45 10 mov eax,[arg.3] 0040199B |. 3B45 14 cmp eax,[arg.4] 0040199E |. 7D 08 jge short GUI.004019A8 004019A0 |. 8B4D 10 mov ecx,[arg.3] 004019A3 |. 894D E8 mov [local.6],ecx 004019A6 |. EB 06 jmp short GUI.004019AE 004019A8 |> 8B55 14 mov edx,[arg.4] 004019AB |. 8955 E8 mov [local.6],edx 004019AE |> 837D E8 06 cmp [local.6],6 ; 密码长度必须大于等于6 004019B2 |. 7D 04 jge short GUI.004019B8 004019B4 |. 33C0 xor eax,eax 004019B6 |. EB 4A jmp short GUI.00401A02 004019B8 |> 8B45 10 mov eax,[arg.3] 004019BB |. 50 push eax 004019BC |. 8B4D 0C mov ecx,[arg.2] 004019BF |. 51 push ecx 004019C0 |. E8 72F6FFFF call GUI.00401037 ; 对用户名处理得到一个数值A 004019C5 |. 83C4 08 add esp,8 004019C8 |. 8945 F4 mov [local.3],eax 004019CB |. 837D F4 00 cmp [local.3],0 004019CF |. 7D 04 jge short GUI.004019D5 004019D1 |. 33C0 xor eax,eax 004019D3 |. EB 2D jmp short GUI.00401A02 004019D5 |> 8B55 14 mov edx,[arg.4] 004019D8 |. 52 push edx 004019D9 |. 8B45 08 mov eax,[arg.1] 004019DC |. 50 push eax 004019DD |. E8 5AF6FFFF call GUI.0040103C ; 对密码处理得到一个数值B 004019E2 |. 83C4 08 add esp,8 004019E5 |. 8945 F0 mov [local.4],eax 004019E8 |. 837D F0 00 cmp [local.4],0 004019EC |. 7D 04 jge short GUI.004019F2 004019EE |. 33C0 xor eax,eax 004019F0 |. EB 10 jmp short GUI.00401A02 004019F2 |> 8B4D F0 mov ecx,[local.4] 004019F5 |. 51 push ecx 004019F6 |. 8B55 F4 mov edx,[local.3] 004019F9 |. 52 push edx 004019FA |. E8 33F6FFFF call GUI.00401032 ; A^B = C;,如果C等0x71则注册成功! 004019FF |. 83C4 08 add esp,8 00401A02 |> 5F pop edi 00401A03 |. 5E pop esi 00401A04 |. 5B pop ebx 00401A05 |. 83C4 58 add esp,58 00401A08 |. 3BEC cmp ebp,esp 00401A0A |. E8 91000000 call GUI.00401AA0 00401A0F |. 8BE5 mov esp,ebp 00401A11 |. 5D pop ebp 00401A12 \. C3 retn call GUI.00401037 ; 对用户名处理得到一个数值A 对用户名处理,这里需要用户名是字母或数字. 假设用户名字符串为 USERNAME UINT A = 0; for(int i = 0;i<USERNAME.LENGTH;i++) A += (char)USERNAM[i] ^ ((char)(0x30 + i)); call 0040103C 是对密码进行处理得到B B的要求数值,后一个数字必须必前数字大. 计算方法是 计算所有数值的ACII码的和B 最后如果A^B等于0x71.则注册成功.
zara 2013-10-15
  • 打赏
  • 举报
回复
看不懂,干看是不行的,要通过实际的数据跟进去,观测数据处理的过程和变化。
CheeRok 2013-10-15
  • 打赏
  • 举报
回复
引用 5 楼 u011275002 的回复:
LZ,你玩的是CARCK啊.这个是很简单crackme.... 下GetDlgItemTextA断点就很容易找到的 4016AD 那句NOP就暴力破解了 关键CALL 是4016A3 这个函数,该函数返回至非0的话就注册成功,算法部分应该很简单的...
爆破通过验证我会……就是004016A3这个函数内的内容看不懂……求指导
CheeRok 2013-10-15
  • 打赏
  • 举报
回复
引用 8 楼 u011275002 的回复:
这个crack挺容易的,先给一个注册码: 721243641812146652 ,密码123456 00401960 /> \55 push ebp 00401961 |. 8BEC mov ebp,esp 00401963 |. 83EC 58 sub esp,58 00401966 |. 53 push ebx 00401967 |. 56 push esi 00401968 |. 57 push edi 00401969 |. 8D7D A8 lea edi,[local.22] 0040196C |. B9 16000000 mov ecx,16 00401971 |. B8 CCCCCCCC mov eax,CCCCCCCC 00401976 |. F3:AB rep stos dword ptr es:[edi] 00401978 |. 8B45 10 mov eax,[arg.3] 0040197B |. 3B45 14 cmp eax,[arg.4] 0040197E |. 7E 08 jle short GUI.00401988 00401980 |. 8B4D 10 mov ecx,[arg.3] 00401983 |. 894D EC mov [local.5],ecx 00401986 |. EB 06 jmp short GUI.0040198E 00401988 |> 8B55 14 mov edx,[arg.4] 0040198B |. 8955 EC mov [local.5],edx 0040198E |> 837D EC 14 cmp [local.5],14 ; 用户名长度必须小于等于20 00401992 |. 7E 04 jle short GUI.00401998 00401994 |. 33C0 xor eax,eax 00401996 |. EB 6A jmp short GUI.00401A02 00401998 |> 8B45 10 mov eax,[arg.3] 0040199B |. 3B45 14 cmp eax,[arg.4] 0040199E |. 7D 08 jge short GUI.004019A8 004019A0 |. 8B4D 10 mov ecx,[arg.3] 004019A3 |. 894D E8 mov [local.6],ecx 004019A6 |. EB 06 jmp short GUI.004019AE 004019A8 |> 8B55 14 mov edx,[arg.4] 004019AB |. 8955 E8 mov [local.6],edx 004019AE |> 837D E8 06 cmp [local.6],6 ; 密码长度必须大于等于6 004019B2 |. 7D 04 jge short GUI.004019B8 004019B4 |. 33C0 xor eax,eax 004019B6 |. EB 4A jmp short GUI.00401A02 004019B8 |> 8B45 10 mov eax,[arg.3] 004019BB |. 50 push eax 004019BC |. 8B4D 0C mov ecx,[arg.2] 004019BF |. 51 push ecx 004019C0 |. E8 72F6FFFF call GUI.00401037 ; 对用户名处理得到一个数值A 004019C5 |. 83C4 08 add esp,8 004019C8 |. 8945 F4 mov [local.3],eax 004019CB |. 837D F4 00 cmp [local.3],0 004019CF |. 7D 04 jge short GUI.004019D5 004019D1 |. 33C0 xor eax,eax 004019D3 |. EB 2D jmp short GUI.00401A02 004019D5 |> 8B55 14 mov edx,[arg.4] 004019D8 |. 52 push edx 004019D9 |. 8B45 08 mov eax,[arg.1] 004019DC |. 50 push eax 004019DD |. E8 5AF6FFFF call GUI.0040103C ; 对密码处理得到一个数值B 004019E2 |. 83C4 08 add esp,8 004019E5 |. 8945 F0 mov [local.4],eax 004019E8 |. 837D F0 00 cmp [local.4],0 004019EC |. 7D 04 jge short GUI.004019F2 004019EE |. 33C0 xor eax,eax 004019F0 |. EB 10 jmp short GUI.00401A02 004019F2 |> 8B4D F0 mov ecx,[local.4] 004019F5 |. 51 push ecx 004019F6 |. 8B55 F4 mov edx,[local.3] 004019F9 |. 52 push edx 004019FA |. E8 33F6FFFF call GUI.00401032 ; A^B = C;,如果C等0x71则注册成功! 004019FF |. 83C4 08 add esp,8 00401A02 |> 5F pop edi 00401A03 |. 5E pop esi 00401A04 |. 5B pop ebx 00401A05 |. 83C4 58 add esp,58 00401A08 |. 3BEC cmp ebp,esp 00401A0A |. E8 91000000 call GUI.00401AA0 00401A0F |. 8BE5 mov esp,ebp 00401A11 |. 5D pop ebp 00401A12 \. C3 retn call GUI.00401037 ; 对用户名处理得到一个数值A 对用户名处理,这里需要用户名是字母或数字. 假设用户名字符串为 USERNAME UINT A = 0; for(int i = 0;i<USERNAME.LENGTH;i++) A += (char)USERNAM[i] ^ ((char)(0x30 + i)); call 0040103C 是对密码进行处理得到B B的要求数值,后一个数字必须必前数字大. 计算方法是 计算所有数值的ACII码的和B 最后如果A^B等于0x71.则注册成功.
恩。谢谢了。这个是对的。 不过我回去看反汇编代码A 和B的计算还是不太懂……能否细说 麻烦了………………
绿蚁新醅酒 2013-10-14
  • 打赏
  • 举报
回复
LZ,你玩的是CARCK啊.这个是很简单crackme.... 下GetDlgItemTextA断点就很容易找到的 4016AD 那句NOP就暴力破解了 关键CALL 是4016A3 这个函数,该函数返回至非0的话就注册成功,算法部分应该很简单的...
CheeRok 2013-10-13
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
看不懂怎么处理的,这个就有些麻烦了,初涉其中的话,也只有一条指令一条指令的运行,看具体是怎么操作的那些字符了,不过由于源程序应该是由 c 类的高级语言写的吧,所以汇编看着有不少的废话,反而会迷糊思路。
zara 2013-10-12
  • 打赏
  • 举报
回复
看不懂怎么处理的,这个就有些麻烦了,初涉其中的话,也只有一条指令一条指令的运行,看具体是怎么操作的那些字符了,不过由于源程序应该是由 c 类的高级语言写的吧,所以汇编看着有不少的废话,反而会迷糊思路。
CheeRok 2013-10-12
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
这个,可能也比较简单吧,第一个好像是对用户名进行处理,生成一个 dword,第二个是处理的密码,第二个是进行关系判断;用调试软件载入这个程序,分别在这三个 call 上断点,看看具体怎么处理的就是了。
就是怎么处理的不懂……求指导
zara 2013-10-11
  • 打赏
  • 举报
回复
这个,可能也比较简单吧,第一个好像是对用户名进行处理,生成一个 dword,第二个是处理的密码,第二个是进行关系判断;用调试软件载入这个程序,分别在这三个 call 上断点,看看具体怎么处理的就是了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧