xqyqx 发表于 2022-11-4 13:33

一个MFC写的CrackMe,无壳无花无反

应该会很简单吧

成熟的美羊羊 发表于 2022-11-4 15:13

本帖最后由 成熟的美羊羊 于 2022-11-4 15:59 编辑

小菜没写过注册机,勉强做了一个半成品凑合一下吧
爆破

00402117BE 9F521062mov esi,6210529Fesi参与了弹窗字符串的运算
0040211C90nop 修改成00402178判断的操作数就好了
0040211D90nop

0040211E90nop



sub_401E10这个call计算了代码端的机器码(类似于crc32)参与了正确密码的计算
int sub_401E10(void* begin , int length)这个call是__fastcall , 调用规则:规定将前两个参数由寄存器ecx和edx来传递,其余参数还是通过堆栈传递(从右到左)。返回值贮存在eax寄存器中
00401F588B7411 24mov esi,dword ptr ds:[ecx+edx+24esi:sub_401000
00401F5C8B5411 20mov edx,dword ptr ds:[ecx+edx+20代码段的粗略大小
00401F6003F0add esi,eaxesi:sub_401000
00401F628BCEmov ecx,esiesi:sub_401000,GetModuleHandleW
00401F64E8 A7FEFFFFcall <crackme_cracked.E_sub_401E10>


sub_00401CB0:Unicode_2_Ascii,就是将Unicode字符转化成Ascii的字符

00401F698B97 D8000000mov edx,dword ptr ds:[edi+D8edx:L"ZhouQing", :L"ZhouQing"
00401F6F8D8D A8FDFFFFlea ecx,dword ptr ss:[ebp-258]

00401F758985 C4FDFFFFmov dword ptr ss:[ebp-23C],eax

00401F7BE8 30FDFFFFcall <crackme_cracked.Unicode_2_Ascii>

00401F808B8F D8000000mov ecx,dword ptr ds:[edi+D8:L"ZhouQing"
00401F868378 14 10cmp dword ptr ds:[eax+14,10eax:"ZhouQing"

计算用户名的机器码,好像这么叫不对,不管了


00401F8C8B00mov eax,dword ptr ds:[eaxeax:"ZhouQing"
00401F8E <crackme_cracked.loc_401F8E>8B51 F4mov edx,dword ptr ds:[ecx-Cedx=8
00401F918BC8mov ecx,eaxecx:"ZhouQing", eax:"ZhouQing"
00401F93E8 78FEFFFFcall <crackme_cracked.E_sub_401E10>

00401F988B95 BCFDFFFFmov edx,dword ptr ss:[ebp-244]eax=80C13D6D


长成这样的汇编代码就没有执行过


00401FA372 31jb <crackme_cracked.loc_401FD6>

00401FA58B8D A8FDFFFFmov ecx,dword ptr ss:[ebp-258]

00401FAB42inc edx

00401FAC8BC1mov eax,ecx

00401FAE81FA 00100000cmp edx,1000

00401FB472 16jb <crackme_cracked.loc_401FCC>

00401FB68B49 FCmov ecx,dword ptr ds:[ecx-4

00401FB983C2 23add edx,23

00401FBC2BC1sub eax,ecx

00401FBE83C0 FCadd eax,FFFFFFFC

00401FC183F8 1Fcmp eax,1F

00401FC476 06jbe <crackme_cracked.loc_401FCC>

00401FC6FF15 48A14000call dword ptr ds:[<&_invalid_parameter_noinfo_noreturn>

00401FCC <crackme_cracked.loc_401FCC>52push edxloc_401FCC
00401FCD51push ecx

00401FCEE8 25670000call <crackme_cracked.sub_4086F8>

00401FD383C4 08add esp,8



取password


00402067C645 FC 04mov byte ptr ss:[ebp-4],4取password


password到整数



004020FE8378 14 10cmp dword ptr ds:[eax+14,10password
0040210272 02jb <crackme.loc_402106>

004021048B00mov eax,dword ptr ds:[eax如果字符串长度>10
00402106 <crackme.loc_402106>6A 10push 10loc_402106
004021086A 00push 0

0040210A50push eax

0040210BFF15 18A14000call dword ptr ds:[<&strtol>字符串到整数
004021118B95 BCFDFFFFmov edx,dword ptr ss:[ebp-244]



关键算法


004021178BF0mov esi,eaxesi = password_int ^ (代码段机器码^用户名)
0040211933B5 C4FDFFFFxor esi,dword ptr ss:[ebp-23C]if(esi == 0x6210529F) =>正确


00402178 <crackme.loc_402178>81FE 9F521062cmp esi,6210529Floc_402178
0040217E75 36jne <crackme.loc_4021B6>



所以我们如果要求正确的密码,算法应该是这样。关闭alsr,似乎会出现溢出的情况。不管了
密码 = (代码段机器码 ^ 用户名) ^ 0x6210529F;爆破图

csjczj 发表于 2022-11-14 17:39

这个是成功了吗? 乱码

爱书不爱输 发表于 2022-11-8 08:42

wdslr 发表于 2022-11-8 09:29

小白学习中

ly20034244 发表于 2022-11-4 23:42

byh3025 发表于 2022-11-4 14:59
这里是乱码,没有成功呢?

我的也是乱码,乱码是根据输入的内容不同而不同,所以感觉前面应该还有地方没分析到的内容。

byh3025 发表于 2022-11-4 14:59

这里是乱码,没有成功呢?

长得帅活得久 发表于 2022-11-5 20:37

poiuyt 发表于 2022-11-6 17:37

感谢分享!

xaolong621 发表于 2022-11-14 01:19

大神。收下我的敬仰
页: [1] 2
查看完整版本: 一个MFC写的CrackMe,无壳无花无反