【反汇编练习】160个CrackME中的158 一字节爆破
【反汇编练习】160个CrackME 中的158160个CrackMe的打包文件下载地址:
https://www.lanzoub.com/ipwFHha3bbcc52pj
看了158的破解链接:http://www.52pojie.cn/forum.php? ... 470028&pid=12114184 @反沉沦
发现写出了算法,但我用他的keygen 跑步来的code点了没反应.. 那我来个爆破的方法吧~
首先OD载入,查找字符串
发现REGISTERED可疑。 点开跟进去
进入该函数看了下,应该是一个弹窗
汇编不太行,直接载入IAD看伪代码吧.... 刚拿到IDAPRO8.3试试 效果,里面预装了CHATGPT插件,可以分析函数
IDA进入 00401509 地址
F5 反编译成C代码,
然后直接 GPT插件无脑翻译下看看..
// ---GPT_START---
// 预期目的:该函数的预期目的是更新totalSum的值,然后根据totalSum和dword_409784的比较结果来进行一系列操作。
//
// 参数的作用:参数hDlg是窗口的句柄,参数hInstance是模块的实例句柄。
//
// 详细功能:首先计算totalSum并判断其值是否超过0x7FFFFFFF,然后更新dword_409770的值为totalSum。接着如果dword_409784的值等于totalSum,则将字符串"aRegistered"写入到byte_409800中,并设置窗口的文本为该字符串。然后获取窗口中ID为1004的控件的句柄并启用该控件,接着调用DialogBoxParamA函数显示一个对话框,并禁用窗口中ID为1003的控件。
//
// 新的函数名字:updateRegistrationStatus
// ---GPT_END---
void __cdecl sub_4014E0(HWND hDlg, HINSTANCE hInstance)
{
int totalSum; // ecx
HWND regControl; // eax
HWND control; // eax
totalSum = dword_4097AC + dword_409770;
if ( (unsigned int)(dword_4097AC + dword_409770) > 0x7FFFFFFF )
totalSum -= 0x7FFFFFFF;
dword_409770 = totalSum;
if ( dword_409784 == totalSum )
{
wsprintfA(byte_409800, aRegistered);
SetDlgItemTextA(hDlg, 1006, byte_409800);
regControl = GetDlgItem(hDlg, 1004);
EnableWindow(regControl, 1);
DialogBoxParamA(hInstance, (LPCSTR)0x68, hDlg, DialogFunc, 0);
control = GetDlgItem(hDlg, 1003);
EnableWindow(control, 0);
}
}
改函数的功能:首先计算totalSum并判断其值是否超过0x7FFFFFFF,然后更新dword_409770的值为totalSum。接着如果dword_409784的值等于totalSum,则将字符串"aRegistered"写入到byte_409800中,并设置窗口的文本为该字符串。然后获取窗口中ID为1004的控件的句柄并启用该控件,接着调用DialogBoxParamA函数显示一个对话框,并禁用窗口中ID为1003的控件。
也就是说,key成功匹配后,点击确定就会弹窗出来。现在我们想办法跳转到这里就行!
直接看401509的汇编, 然后结合下上下文。
意思就是如果不相等 这个JNZ就会跳走。
我们直接nop掉就OK , 只需要改这里一下
点了确定之后, 之前的确定按钮会变灰, 功能没
此处注册状态是字符串常量,用IDA翻一下rdata,从调用往回看流程图的跳转能快很多
https://attach.52pojie.cn//forum/202403/07/161622f8cufordczof9bcf.png?l
无保护可以直接用IDA下断,有GPT分析直接断到伪代码上也许更方便
原贴那个keygen能用,但有些类型要手动补一下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
char szVolumeName = { 0 };
char szName = { 0 };
char szCompany = { 0 };
char szSerial = { 0 };
unsigned int nNameLength, nValue, nCompanyLength, i, m, n, k, nGroupValue, nTimeValue;
char p[] = "?Etn5Pnc5AXi1DFlkYqnujsXNmvHdbcrqOoT8aaV5DkaymMRkPkoQ.";
char q[] = "fQObVwNOankJ5skqJvae3Ae5jdoETu5n02J6Ez85430PNSDAPjDrYgFaze9VDRjq";
char szMonth[] = ".9803D2F7404E";
char szDay[] = ".F3A4BF3B0503FB8BCB4F49803D5C740";
SYSTEMTIME st;
GetLocalTime(&st);
nTimeValue = szMonth;
nTimeValue *= ((unsigned int)szDay);
printf("请输入Name:");
gets_s(szName, 32);
nNameLength = (UINT32)strlen(szName);
if (1 > (UINT32)nNameLength)
{
printf("\r\n输入Name的长度必须大于0\r\n");
system("pause");
return 0;
}
printf("请输入Group:");
gets_s(szCompany, 32);
nCompanyLength = (UINT32)strlen(szCompany);
if (1 > (UINT32)nCompanyLength)
{
printf("\r\n输入group的长度必须大于0\r\n");
system("pause");
return 0;
}
nGroupValue = 0;
for (i = 0; i < nCompanyLength - 1; i++)
{
k = szCompany;
m = q;
n = p;
k *= m * n;
k *= (i + 1);
nGroupValue += k;
}
nValue = 0;
for (i = 0; i < nNameLength - 1; i++)
{
k = (UINT8)szName;
m = (UINT8)q;
n = p;
k *= m * n;
k *= (i + 1);
nValue += k;
}
nValue += nGroupValue + nTimeValue;
if (nValue > 0x7FFFFFFF)
nValue -= 0x7FFFFFFF;
printf("%d\r\n", nValue);
system("pause");
return 0;
}
我不会逆算法只能下断拿key,什么时候能才能和大佬一样变成key的生产者_(:3」∠)_
想问楼主的GPT插件怎么开的,我也是在这个贴里面下的但是没有,外面搜到的插件是直接要token的 yingzi4f 发表于 2024-3-6 13:25
https://www.lanzoub.com/ipwFHha3bbc 52pj
非常感谢 分开好看多了 谢谢,学到了 yingzi4f 发表于 2024-3-6 13:25
https://www.lanzoub.com/ipwFHha3bbc 52pj
非常感谢 感谢大佬分享! 文件分享取消了,麻烦重新分享一下,谢谢 dewei_k 发表于 2024-3-6 13:16
文件分享取消了,麻烦重新分享一下,谢谢
https://www.lanzoub.com/ipwFHha3bbc 52pj 谢谢 有用的着{:1_893:} 谢谢 有用的着 谢谢有用 非常有用!!感谢!!{:301_978:}