-
Notifications
You must be signed in to change notification settings - Fork 58
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
加油,我目前就是卡在不知道如何获取sign加密的值 #5
Comments
对于sign,具体的加密算法位于 |
对的 反编译也很少时候是能反出源码,没事楼主的想法也很好哈哈哈,看你了,等你成功了借用一下你的方式 |
安卓端的sign最终是调的native方法算的,在libRequestEncoder.so里面 |
我已经使用unidbg 补出了sign的生成 |
怎么生成的呢?能开源出来看看吗? |
下面是 unidbg 代码,其中的chararray 需要根据他说的新建一个 改改就行 但是不一定能用,我测试了登录貌似还是失败, import com.github.unidbg.AndroidEmulator; import java.io.File; public class Xiaoyuan extends AbstractJni {
} |
实在是太强了,比我厉害多了 |
我也只是照抄而已,不算的厉害 |
悲报,加密了( |
什么加密了,题目这些返回的数据吗 |
|
解密出sign就可以直接发包拿分了,期待大佬发力 |
发一下登录的网址 我看看 so算法我分析就差一段了 好像是aes |
|
关键函数 |
直接hook这个拿到第一个参数是接口名第二个参数是wdi4n2t8edr,但第三个int读不出来 |
我用的objection追到的,第三方参数有1,-1,空 三个选项 |
so实现伪代码555行实在没能力看逻辑 |
hook这个so中的这个函数 sub_43B54 就能看到最后的加密结果了 是个标准MD5 |
这个能看到但具体逻辑没办法,还是没法自己生成sign和对数据加密实现整个流程 |
密码这种加密无所谓 主要是so的sign 这个网页貌似没有sign参数 |
/leo-gateway/android/auth/password 这是我分析的 现在只有 3074026880171896034922881047576209528810400183074026880576209548017464801746181677721628810478167772164801746557620954172881047335544322400873173201164288104791757620952619134175762095179603492288104942881047826191349603492189603492717728810479288104787174801746576209517288104941728810464320116418517320116528810478288104172881046432011652881047842881047822161902881047817335544322881047822161902400873181778326d1162fb5f38730d95b2fd7286c14 |
sub_43b54是啥,我这勾的是sub_61BD4,能拿到那个salt |
是so函数的偏移地址,拿到salt没用啊,他盐java层就已经给传入了 |
time那个参数你追到过吗 |
用的dump脚本
|
你是说so层获取时间戳的地方吗 |
SIGN的类是 |
在 package com.fenbi.android.leo.utils;
/* loaded from: classes3.dex */
public class e {
static {
System.loadLibrary("RequestEncoder");
}
public static native String sdwioxccsd();
public static native String zcvsd1wr2t(String str, String str2, int i11);
} |
这行代码的pcVar22指向的应该就是rc4加密的密匙了,但计算太复杂了,g |
可以问一下text段的具体地址么,用IDA Pro 8逆向出来sub名不一样 |
理论上找到核心函数和依赖函数的伪代码,再编一个x86的lib是不是就可以直接拿去给python和java用了) |
我补的哪个地方有问题,返回结果为null D:\Java\jdk-22\bin\java.exe "-javaagent:D:\JetBrains\IntelliJ IDEA 2024.1.2\lib\idea_rt.jar=23287:D:\JetBrains\IntelliJ IDEA 2024.1.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath F:\unidbg-master\unidbg-android\target\classes;F:\unidbg-master\unidbg-api\target\classes;C:\Users\Administrator.m2\repository\com\github\zhkl0228\unicorn\1.0.14\unicorn-1.0.14.jar;C:\Users\Administrator.m2\repository\org\scijava\native-lib-loader\2.3.5\native-lib-loader-2.3.5.jar;C:\Users\Administrator.m2\repository\com\github\zhkl0228\capstone\3.1.8\capstone-3.1.8.jar;C:\Users\Administrator.m2\repository\net\java\dev\jna\jna\5.10.0\jna-5.10.0.jar;C:\Users\Administrator.m2\repository\com\github\zhkl0228\keystone\0.9.7\keystone-0.9.7.jar;C:\Users\Administrator.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;C:\Users\Administrator.m2\repository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;C:\Users\Administrator.m2\repository\commons-io\commons-io\2.11.0\commons-io-2.11.0.jar;C:\Users\Administrator.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\Administrator.m2\repository\com\alibaba\fastjson\1.2.83\fastjson-1.2.83.jar;C:\Users\Administrator.m2\repository\com\github\zhkl0228\demumble\1.0.4\demumble-1.0.4.jar;C:\Users\Administrator.m2\repository\net\dongliu\apk-parser\2.6.10\apk-parser-2.6.10.jar;F:\unidbg-master\backend\unicorn2\target\classes;C:\Users\Administrator.m2\repository\org\slf4j\slf4j-api\2.0.5\slf4j-api-2.0.5.jar Main Process finished with exit code 0 |
根据文章创建Chararray了吗 |
|
package com.github.unidbg.linux.android.dvm.array;
import com.github.unidbg.Emulator;
import com.github.unidbg.linux.android.dvm.VM;
import com.github.unidbg.pointer.UnidbgPointer;
import com.sun.jna.Pointer;
public class CharArray extends BaseArray<char[]> implements PrimitiveArray<char[]> {
public CharArray(VM vm, char[] value) {
super(vm.resolveClass("[C"), value);
}
@Override
public int length() {
return value.length;
}
public void setValue(char[] value) {
super.value = value;
}
@Override
public void setData(int start, char[] data) {
System.arraycopy(data, 0, value, start, data.length);
}
@Override
public UnidbgPointer _GetArrayCritical(Emulator<?> emulator, Pointer isCopy) {
if (isCopy != null) {
isCopy.setInt(0, VM.JNI_TRUE);
}
UnidbgPointer pointer = this.allocateMemoryBlock(emulator, value.length * 4);
pointer.write(0, value, 0, value.length);
return pointer;
}
@Override
public void _ReleaseArrayCritical(Pointer elems, int mode) {
switch (mode) {
case VM.JNI_COMMIT:
this.setValue(elems.getCharArray(0, this.value.length));
break;
case 0:
this.setValue(elems.getCharArray(0, this.value.length));
case VM.JNI_ABORT:
this.freeMemoryBlock(elems);
break;
}
}
} |
不好意思,我复制您的代码依然不起作用 |
你可以尝试检验下你的 java层的代码 可能是哪里误写错了 |
您使用的是什么版本的小猿口算呢,我复制您写的代码也是一样为null |
3.84.1 |
我用的是最新版本的3.93.4,可能是版本更新的原因 |
可以吧so上传网盘发我,我来补一下 |
用这个 https://4275.com/ 百度太恶心人了 |
好的 |
应该是你代码写错了 package com.xiaoyuan;
import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.Emulator;
import com.github.unidbg.Module;
import com.github.unidbg.debugger.Debugger;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.linux.android.dvm.array.ArrayObject;
import com.github.unidbg.linux.android.dvm.array.CharArray;
import com.github.unidbg.linux.android.dvm.wrapper.DvmInteger;
import com.github.unidbg.memory.Memory;
import com.sun.jna.Pointer;
import net.dongliu.apk.parser.bean.CertificateMeta;
import java.io.File;
import java.io.IOException;
public class Xiaoyuan extends AbstractJni {
private final AndroidEmulator emulator;
private final VM vm;
private final Module module;
public DvmClass EClass;
public String apkPath = "/Users/jiangxia/unidbg/apks/xyks.apk";
Xiaoyuan() {
emulator = AndroidEmulatorBuilder.for32Bit().build();
final Memory memory = emulator.getMemory();
memory.setLibraryResolver(new AndroidResolver(23));
vm = emulator.createDalvikVM(new File(apkPath));
vm.setVerbose(true);
DalvikModule dm = vm.loadLibrary(new File("/Users/jiangxia/unidbg/apks/libRequestEncoder1.so"), true); // 加载so到虚拟内存
vm.setJni(this);
module = dm.getModule();
dm.callJNI_OnLoad(emulator);
EClass = vm.resolveClass("com/fenbi/android/leo/utils/e");
Debugger debugger = emulator.attach();
// debugger.addBreakPoint(module.base + 0x43434+ 1);
}
public void call_zcvsd1wr2t() {
String methodId = "zcvsd1wr2t(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;";
EClass.callStaticJniMethodObject(
emulator, methodId,
new StringObject(vm, "/leo-gateway/android/auth/password"),
new StringObject(vm, "wdi4n2t8edr"),
-28673
);
}
public static void main(String[] args) {
Xiaoyuan getSign = new Xiaoyuan();
getSign.call_zcvsd1wr2t();
getSign.destroy();
}
private void destroy() {
try {
emulator.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public int getStaticIntField(BaseVM vm, DvmClass dvmClass, String signature) {
return 27;
}
@Override
public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
switch (signature) {
case "com/fenbi/android/leo/activity/HomeActivity->b()Landroid/app/Application;":
return vm.resolveClass("android/app/Application").newObject(null);
}
return super.callStaticObjectMethodV(vm, dvmClass, signature, vaList);
}
@Override
public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
switch (signature) {
case "android/app/Application->getBaseContext()Landroid/content/Context;":{
return vm.resolveClass("android/content/Context").newObject(null);
}
case "android/content/pm/Signature->toChars()[C":{
CertificateMeta certificateMeta = (CertificateMeta) dvmObject.getValue();
byte[] bytes = certificateMeta.getData();
char[] chars = new char[bytes.length];
for (int i = 0; i < bytes.length; i++) {
chars[i] = (char) bytes[i];
}
return new CharArray(vm,chars);
}
}
return super.callObjectMethodV(vm, dvmObject, signature, vaList);
};
} |
我找到原因了,多谢大佬
然后根据报错将write改为
就可以得出运行结果了
|
只能用于辅助分析算法,如果有技术,您可以尝试搭建服务测试能不能使用,我直接替换sign好想不太行同 |
我发现第一个传参为空时,加密后的字符串跟hook结果一致,不为空反而不一致 |
能给出截图或者一些关键代码吗 第一个参数应该是urlpath吧 |
你们apk在哪下的?怎么我看库是32位的,我自己下载的是64位的? |
|
|
用 python 写的,伪代码读着真累 |
|
市面上的ocr或者是简单的抓包版本都太拉跨了,还是要最终模拟人写。我分析完了,目前就卡在sign的值。逆向工程我不是很懂,这方面就等楼主了。知道了sign的值,就可以提前知道考试的答案和题目,也可以提交答案。但是获取答案的sign和提交答案的sign不一样,得逆向明白到底是如何加密的
The text was updated successfully, but these errors were encountered: