|
|
|
关于一个app的frida检测
改成 Module.findBaseAddress("libc.so").add(这儿是通过nm name.so | grep open找到的open的偏移地址); |
|
|
|
本人初中生在国外对黑客技术很感兴趣,想在这里拜个师,求求了,来个大佬请收我为徒吧,谢谢!
你人在国外如果是英语语系的国家那意味着你的英语能力估计不错, 而技术氛围比较好的很多是国外的论坛社区,你为啥要回国找人拜师?黑客技术学到深处几乎都得要看英语资料。我的意思是在国外就在国外找兴趣小组一起学那样成长更快, 国内很多人都是想搞钱的那技术上就没啥太大的长进除非是安全公司的大牛但这些大牛哪有时间教人而且又有几个是真大牛?
最后于 2024-1-19 09:25
被微启宇编辑
,原因:
|
|
[求助]jar文件中的class被加密了,请教!
估计就是在运行 PhoenixClient-8.1.2.jar 里的类之前先运行个载入程序,载入程序在要用到PhoenixClient-8.1.2.jar 里面的类文件时就读取然后把读取的数据流丢到解密方法里解密然后在用类加载器加载。 |
|
一段解密代码,求帮分析是什么算法
楼上的兄弟,chatgpt也是这样怼的。。。 顺便附加chatgpt对代码的解释 下面是对 __int64 __fastcall sub_140044770(__int64 *a1, unsigned __int64 a2, const char *a3) { int v5; // ecx __int64 result; // rax unsigned __int64 v7; // rsi __int64 v8; // rbp char *v9; // rsi int v10; // r11d int v11; // r10d int v12; // r9d int v13; // eax int v14; // r8d int v15; // r9d int v16; // r9d int v17; // edi int v18; // edx int v19; // r11d int v20; // r10d unsigned int v21; // [rsp+20h] [rbp-88h] char v22[48]; // [rsp+24h] [rbp-84h] BYREF unsigned __int64 v23; // [rsp+54h] [rbp-54h] __int64 v24; // [rsp+5Ch] [rbp-4Ch] // 根据输入字符串长度设置处理长度 if (strlen(a3) <= 0x20) v5 = strlen(a3); else v5 = 32; v21 = v5; // 复制输入字符串到本地数组 v22 memcpy(v22, a3, v5); // 调用子函数 sub_140044620 对输入字符串进行处理 result = sub_140044620(v22, v21); if (a1) { // 获取处理长度(除以16得到的整数部分) v7 = a2 >> 4; if ((int)v7 > 0) { v8 = (unsigned int)v7; do { // 初始化 v9 为固定数组 unk_1430C0DC0 的末尾 v9 = (char *)&unk_1430C0DC0; v23 = *a1; // 取 a1 所指向的 64 位数据 v10 = HIDWORD(v23); // 高 32 位 v24 = a1[1]; // 取 a1 所指向的下一个 64 位数据 v11 = HIDWORD(v24); // 高 32 位 v12 = v24 - dword_1430C0DCC; v13 = v23 - dword_1430C0DC8; do { v14 = v11; v11 = v12; v15 = v10; v10 = v13; v16 = v15 - *((_DWORD *)v9 + 1); v9 -= 8; // 一系列异或和位运算 v17 = __ROL4__(v11 * (2 * v11 + 1), 5); v18 = __ROL4__(v13 * (2 * v13 + 1), 5); v12 = v17 ^ __ROR4__(v16, v18 & 0x1F); v13 = v18 ^ __ROR4__(v14 - *((_DWORD *)v9 + 2), v17 & 0x1F); } while ((__int64)v9 >= (__int64)&unk_1430C0D28); v19 = v10 - dword_1430C0D20; v20 = v11 - dword_1430C0D24; v23 = __PAIR64__(v19, v13); LODWORD(v24) = v12; *a1 = __PAIR64__(v19, v13); HIDWORD(v24) = v20; result = v24; a1[1] = v24; a1 += 2; --v8; } while (v8); } } return result; } 此函数的主要功能是对输入数据进行一系列的处理,包括字符串长度的检查、字符串的复制和调用子函数 下面是对 void *__fastcall sub_140044290(int *a1, int *a2, int a3) { unsigned __int64 v3; // 存储长度 int *v4; // 源数据指针 void *result; // 返回结果 int v6; // 计数器 unsigned __int64 i; // 循环控制变量 __int64 *v8; // 用于异或运算 v3 = a3; // 数据长度 v4 = a1; // 目标数据指针 // 如果目标和源不一致,则进行数据复制 if (a1 != a2) result = memcpy(a1, a2, a3); v6 = 0; for (i = v3 >> 3; v6 < i; result = (void *)v6) { v8 = &qword_1430C2820; // 初始化异或运算使用的数据 do { // 一系列的异或运算 *v4 ^= *((_DWORD *)v8 + 1); v4[1] ^= *((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)*v4 + 786) + (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE1(*v4) + 530) ^ (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE2(*v4) + 274) + *((_DWORD *)&xmmword_1430C27E0 + HIBYTE(*v4) + 18))); int v9 = *v4; *v4 = v4[1]; v4[1] = v9; *v4 ^= *(_DWORD *)v8; v4[1] ^= *((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)*v4 + 786) + (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE1(*v4) + 530) ^ (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE2(*v4) + 274) + *((_DWORD *)&xmmword_1430C27E0 + HIBYTE(*v4) + 18))); int v10 = *v4; *v4 = v4[1]; v4[1] = v10; *v4 ^= *((_DWORD *)v8 - 1); v4[1] ^= *((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)*v4 + 786) + (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE1(*v4) + 530) ^ (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE2(*v4) + 274) + *((_DWORD *)&xmmword_1430C27E0 + HIBYTE(*v4) + 18))); int v11 = *v4; *v4 = v4[1]; v4[1] = v11; *v4 ^= *((_DWORD *)v8 - 2); v8 -= 2; v4[1] ^= *((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)*v4 + 786) + (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE1(*v4) + 530) ^ (*((_DWORD *)&xmmword_1430C27E0 + (unsigned __int8)BYTE2(*v4) + 274) + *((_DWORD *)&xmmword_1430C27E0 + HIBYTE(*v4) + 18))); int v12 = *v4; *v4 = v4[1]; v4[1] = v12; } while ((__int64)v8 > (__int64)&xmmword_1430C27E0); int v13 = *v4; *v4 = v12; ++v6; v4[1] = v13; v4 += 2; *(v4 - 1) = v13 ^ DWORD1(xmmword_1430C27E0); *(v4 - 2) ^= xmmword_1430C27E0; } return result; } 此函数的主要目的是对输入数据进行一系列的异或和位运算。在每个循环中,它通过固定的异或值进行操作,包括对源数据的异或、位运算等,最终将处理结果存储到目标数据中。这种操作可能是用于混淆或加密数据的一部分,但具体的算法细节需要参考其他相关代码或上下文信息。 以下是对 __int64 __fastcall sub_140044000(__int64 a1) { unsigned __int128 v2; // 用于存储一个128位整数 __int64 v3; // 用于存储计算结果的临时变量 int v4; // 计数器 __int64 v5; // 用于存储中间计算结果 __int64 v6; // 用于存储中间计算结果 int v7; // 计数器 int v8; // 用于存储中间计算结果 _DWORD *v9; // 指向 xmmword_1430C27E0 数组的指针 int v10; // eax __int128 *v11; // rbx unsigned int v12; // eax _DWORD *v13; // rbx __int64 result; // rax int v15; // [rsp+38h] [rbp+10h] BYREF unsigned int v16; // [rsp+40h] [rbp+18h] BYREF xmmword_1430C27E0 = xmmword_141E9CBB0; // 初始化 xmmword_1430C27E0 xmmword_1430C27F0 = xmmword_141E9CBC0; xmmword_1430C2800 = xmmword_141E9CBD0; qword_1430C2820 = 0x8979FB1B9216D5D9ui64; // 初始化 qword_1430C2820 xmmword_1430C2810 = xmmword_141E9CBE0; memcpy(&unk_1430C2828, &unk_141E9CC10, 0x1000ui64); // 复制数据到 unk_1430C2828 unsigned __int128 v2 = 8 * (unsigned __int128)4ui64; if (!is_mul_ok(8ui64, 4ui64)) *(_QWORD *)&v2 = -1i64; // 调用子函数 sub_14004F030 进行一些计算 v3 = sub_14004F030(v2, *((_QWORD *)&v2 + 1)); int v4 = 2; int v5 = 0i64; int v6 = v3; int v7 = 2; // 循环处理数据 do { HIBYTE(v15) = *(_BYTE *)((v7 - 2) % 32 + a1); BYTE2(v15) = *(_BYTE *)((v7 - 1) % 32 + a1); BYTE1(v15) = *(_BYTE *)(v7 % 32 + a1); int v8 = (v7 + 1) % 32; ++v5; v7 += 4; LOBYTE(v15) = *(_BYTE *)(v8 + a1); *(_DWORD *)(v6 + 4 * v5 - 4) = v15; } while (v5 < 8); _DWORD *v9 = (_DWORD *)&xmmword_1430C27E0 + 2; // 循环进行异或运算 do { *(v9 - 2) ^= *(_DWORD *)(v6 + 4i64 * ((v4 - 2) % 8)); *(v9 - 1) ^= *(_DWORD *)(v6 + 4i64 * ((v4 - 1) % 8)); *v9 ^= *(_DWORD *)(v6 + 4i64 * (v4 % 8)); v9[1] ^= *(_DWORD *)(v6 + 4i64 * ((v4 + 1) % 8)); v9[2] ^= *(_DWORD *)(v6 + 4i64 * ((v4 + 2) % 8)); v10 = (v4 + 3) % 8; v4 += 6; v9 += 6; *(v9 - 3) ^= *(_DWORD *)(v6 + 4i64 * v10); } while (v4 - 2 < 18); // 调用子函数 sub_14004F040 进行进一步处理 sub_14004F040(v6); v15 = 0; v16 = 0; __int128 *v11 = &xmmword_1430C27E0; // 循环进行子函数 sub_140044470 的调用和数据存储 do { sub_140044470(&v15, &v16); v17 = v16; *(_DWORD *)v11 = v15; *((_DWORD *)v11 + 1) = v17; v11 = (__int128 *)((char *)v11 + 8); } while ((__int64)v11 < (__int64)&unk_1430C2828); _DWORD *v18 = &unk_1430C282C; // 循环进行子函数 sub_140044470 的调用和数据存储 do { sub_140044470(&v15, &v16); result = v16; *(v18 - 1) = v15; *v18 = result; v18 += 2; } while ((__int64)v18 < (__int64)&unk_1430C382C); return result; } 在该函数中,首先对一系列数据进行初始化,然后通过多次异或和位运算的操作,对数据进行混淆。最后,调用了两次
最后于 2024-1-9 11:13
被微启宇编辑
,原因:
|
|
[原创]中兴ZTE ZX279128S芯片固件解密
wxnxwx 国内公司一般不都自动忽略这种请求嘛,不知道有成功案例没有。 github上那个我看过了只有openwrt的makefile,没有程序文件,里面引用的工具链和3.18版本内核不是主线内核,主线根本没有 ...有呀,之前不是闹得沸沸扬扬的那个程序员去某公司拿开源代码事件。给中兴写封英文邮件让中兴给内核源码, 中兴不给国内是怕培养竞争对手。 |
|
[原创]中兴ZTE ZX279128S芯片固件解密
wxnxwx 大佬您好,阅读您的帖子受益良多。 我手里有个光猫爆改的,移动免费送的“WIFI6”路由器,拆开一看是这个方案。 TTL进去有密码,UBOOT无法tftp回传,靠着毅力用脚本一行行把整个flas ...linux 内核使用的是强制开源的协议,你可以去找中兴要linux内核源码。这openwrt项目估计有 https://github.com/xuejian1354/openwrt_cc |
|
[讨论]如何让马云欠张三的钱
性质不一样。 女人被上后不管是自愿还是非自愿的都可以告男人强奸自己, 只要上了留下生物、音视频证据,女人就可以去告男人强奸自己,毕竟男人很难自证没有使用任何手段强奸女人的清白。 国内的法律体系是参考(抄作业)欧美的,而这类事欧美不是没发生过而且女人总是胜诉。既然法律体系是参考欧美的也有胜诉例子那国内女人钻法律bug是早晚的事。 记得欧美有过个女人自愿和男人约P,完事的几天后非常后悔就告男人强奸自己而且还胜诉了。
最后于 2023-12-26 09:24
被微启宇编辑
,原因:
|
|
懂stm32固件id绑定的老师帮忙看下
单片机逆向只是修改价格大概在3k+, 如果是逆向开发(根据逆向分析的结果写一个一模一样的可编译可运行的工程)5w+ |
|
|
|
|
|
|
|
安卓TV360APP脱壳
mb_haiqrhva http://itvuer.com/show/1/14539.html不用那么麻烦, 我脱360的壳都是hook art读写dex内存 地址的api。 |
|
|
|
[求助] 脱壳能看源码就行 不要求能运行 360加固
mb_zyrlygol 为啥脱壳后的文件 以下关键字都搜不到呢url:*/wfm/roc-service/getAllAppSwicthState请求内容:{"params":&q ... 这个app是用DCloud的uni-app把网站打包的,主要代码在 assets/apps/__UNI__987D089/www/app-service.js 里面和 assets/apps/__UNI__987D089/www 这个路径的js文件里。附件是脱壳后的dex
最后于 2023-12-1 01:53
被微启宇编辑
,原因:
|
|
安卓TV360APP脱壳
mb_haiqrhva https://www.zhihu.com/question/60591491 这篇文章也就是针对老版本且是免费版的360加固, 这个apk的是收费版已经把一些java的代码编译成c/c++了, 真按文章说的脱壳只能拿到半残版的dex想修复运行是不可能的。。。
最后于 2023-12-2 21:34
被微启宇编辑
,原因:
|
|
[原创] 想问一下贴吧自动发帖是什么原理
绕过web页面直接调用登录和发帖的api呗 |