-
-
[旧帖] [原创][申请邀请码]对一个reverseMe的简单破解 0.00雪花
-
发表于: 2011-3-14 15:46 1266
-
【题目】reverseMe的简单破解
【作者】后恋
【工具】OD,vc
【软件】无壳,代码简洁
是个很简单的软件因为初学逆向,水平比较菜希望能申请一个邀请码。
运行后提示:
看来是要求制作一个文件。OD载入发现代码非常简单。直接往下拉就来到如下CreateFileA函数:
明显是要读入一个keyfile.dat文件,其中因为CreateFileA函数调用失败则返回-1,而且函数调用的返回值都是存放在EAX中,故若EAX等于-1则弹出对话框提示失败(就是刚开始直接点击出现的错误)。
首先我们制作一个命名为keyfile.dat的文件放在软件同目录下。继续看代码:
0040109A > \6A 00 push 0 ; /pOverlapped = NULL
0040109C . 68 73214000 push 00402173 ; |pBytesRead = reverseM.00402173
004010A1 . 6A 46 push 46 ; |BytesToRead = 46 (70.)
004010A3 . 68 1A214000 push 0040211A ; |Buffer = reverseM.0040211A
004010A8 . 50 push eax ; |hFile
004010A9 . E8 2F020000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile 读取文件放在缓冲区0X00402173H处
004010AE . 85C0 test eax, eax ;判断读取文件内容是否成功
004010B0 . 75 02 jnz short 004010B4
004010B2 . EB 43 jmp short 004010F7
004010B4 > 33DB xor ebx, ebx ; ebx清零
004010B6 . 33F6 xor esi, esi ; esi清零
004010B8 . 833D 73214000>cmp dword ptr [402173], 10 ; kefile文件字符数小于16则失败
004010BF . 7C 36 jl short 004010F7 ; 跳转到失败
004010C1 > 8A83 1A214000 mov al, byte ptr [ebx+40211A] ; 取keyfile的字符
004010C7 . 3C 00 cmp al, 0 ; 字符串是否取完
004010C9 . 74 08 je short 004010D3 ; 取完全部字符,跳出循环
004010CB . 3C 47 cmp al, 47 ; 是否为G
004010CD . 75 01 jnz short 004010D0
004010CF . 46 inc esi ; 若该字符是G则ESI+1
004010D0 > 43 inc ebx
004010D1 .^ EB EE jmp short 004010C1
004010D3 > 83FE 08 cmp esi, 8 ; 可以看出应该有至少8个G
004010D6 . 7C 1F jl short 004010F7 ; 若esi<8前8个字符如果有空格则失败
004010D8 . E9 28010000 jmp 00401205 ; 完成则成功
以上是一个循环体,是kefile文件的关键。用c语言表示类似为
********************************************
char a[] = “111GGGGGGGGGGGG”;
int j=0,i=0;
for (i=0;a[i] !=’\0’;i++)
{
if(a[i] == ‘G’)
j++;
}
if(j>=8)
printf(“success”);
else
printf(“failed”);
********************************
00401205 > \6A 00 push 0 ; |/Style = MB_OK|MB_APPLMODAL
00401207 . 68 00204000 push 00402000 ; ||Title = " Key File ReverseMe"
0040120C . 68 DE204000 push 004020DE ; ||Text = "You really did it! Congratz !!!"
00401211 . 6A 00 push 0 ; ||hOwner = NULL
00401213 . E8 4F010000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
00401218 . E8 9C000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
如此我们便可以自己写出一个keyfile.dat条件如下:
1、不小于16个字符;
2、有至少8个G;
故制作自己的keyfile.dat如下:
1111111GGGGGG11GG
再次运行软件成功:
菜鸟水平,在论坛里混了老久了,依然是初级新人。惭愧啊。千万别笑话我,我真的很认真的在学习了。
【作者】后恋
【工具】OD,vc
【软件】无壳,代码简洁
是个很简单的软件因为初学逆向,水平比较菜希望能申请一个邀请码。
运行后提示:
看来是要求制作一个文件。OD载入发现代码非常简单。直接往下拉就来到如下CreateFileA函数:
明显是要读入一个keyfile.dat文件,其中因为CreateFileA函数调用失败则返回-1,而且函数调用的返回值都是存放在EAX中,故若EAX等于-1则弹出对话框提示失败(就是刚开始直接点击出现的错误)。
首先我们制作一个命名为keyfile.dat的文件放在软件同目录下。继续看代码:
0040109A > \6A 00 push 0 ; /pOverlapped = NULL
0040109C . 68 73214000 push 00402173 ; |pBytesRead = reverseM.00402173
004010A1 . 6A 46 push 46 ; |BytesToRead = 46 (70.)
004010A3 . 68 1A214000 push 0040211A ; |Buffer = reverseM.0040211A
004010A8 . 50 push eax ; |hFile
004010A9 . E8 2F020000 call <jmp.&KERNEL32.ReadFile> ; \ReadFile 读取文件放在缓冲区0X00402173H处
004010AE . 85C0 test eax, eax ;判断读取文件内容是否成功
004010B0 . 75 02 jnz short 004010B4
004010B2 . EB 43 jmp short 004010F7
004010B4 > 33DB xor ebx, ebx ; ebx清零
004010B6 . 33F6 xor esi, esi ; esi清零
004010B8 . 833D 73214000>cmp dword ptr [402173], 10 ; kefile文件字符数小于16则失败
004010BF . 7C 36 jl short 004010F7 ; 跳转到失败
004010C1 > 8A83 1A214000 mov al, byte ptr [ebx+40211A] ; 取keyfile的字符
004010C7 . 3C 00 cmp al, 0 ; 字符串是否取完
004010C9 . 74 08 je short 004010D3 ; 取完全部字符,跳出循环
004010CB . 3C 47 cmp al, 47 ; 是否为G
004010CD . 75 01 jnz short 004010D0
004010CF . 46 inc esi ; 若该字符是G则ESI+1
004010D0 > 43 inc ebx
004010D1 .^ EB EE jmp short 004010C1
004010D3 > 83FE 08 cmp esi, 8 ; 可以看出应该有至少8个G
004010D6 . 7C 1F jl short 004010F7 ; 若esi<8前8个字符如果有空格则失败
004010D8 . E9 28010000 jmp 00401205 ; 完成则成功
以上是一个循环体,是kefile文件的关键。用c语言表示类似为
********************************************
char a[] = “111GGGGGGGGGGGG”;
int j=0,i=0;
for (i=0;a[i] !=’\0’;i++)
{
if(a[i] == ‘G’)
j++;
}
if(j>=8)
printf(“success”);
else
printf(“failed”);
********************************
00401205 > \6A 00 push 0 ; |/Style = MB_OK|MB_APPLMODAL
00401207 . 68 00204000 push 00402000 ; ||Title = " Key File ReverseMe"
0040120C . 68 DE204000 push 004020DE ; ||Text = "You really did it! Congratz !!!"
00401211 . 6A 00 push 0 ; ||hOwner = NULL
00401213 . E8 4F010000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
00401218 . E8 9C000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
如此我们便可以自己写出一个keyfile.dat条件如下:
1、不小于16个字符;
2、有至少8个G;
故制作自己的keyfile.dat如下:
1111111GGGGGG11GG
再次运行软件成功:
菜鸟水平,在论坛里混了老久了,依然是初级新人。惭愧啊。千万别笑话我,我真的很认真的在学习了。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
- [求助]求助upx壳怎么脱 10270
- [求助]关于如何修复输入表 4319
- [求助]能给壳分个级别吗? 2978
- python如何内联汇编啊? 8014
- win7下如何使用od 4699
看原图
赞赏
雪币:
留言: