考虑我有一个打印变量值的程序。让我们将该变量称为“i”。二进制文件为“.exe”格式。如何确定“i”的值并了解该特定值是“.exe”格式中变量“i”的值?
我在Mssql中有一个列类型为TimeStamp的表,并使用hibernate(逆向工程)生成了pojo。在生成的Pojo中,时间戳字段被标记为byte []。
在调试过程中,我发现TimeStamp sqlType代码为“-2”,即Hibernate类型中的Binary Type,Hibernate二进制类型相当于java中的byte[]。
Java、hibernate 和 sql server 的时间戳数据类型
Mssql Hibernate Java Type
----- --------- ---------
Timestamp Binary byte[]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在 Hibernate 中只有 mssql 类型的 TimeStamp 与 Binary 映射。但在其他数据库中,如 Postgres、oracle、mysql...timestamp 被映射到 hibernate 时间戳类型。
我可以通过将 sql 时间戳映射到 hibernate 时间戳来在 hibernate.reveng.xml 中添加类型映射来解决此问题。不知道进一步还会出现什么问题。
java sql-server hibernate reverse-engineering hibernate-tools
IDR是反编译Delphi应用程序的好工具,但是我如何知道分配给消息处理程序的Windows消息的ID号呢?
例如,从IDR反编译中,我看到:
procedure sub_004D2398(var Msg: TMsg);dynamic;
Run Code Online (Sandbox Code Playgroud)
原来的源代码是:
procedure Name_procedure(var Msg: TMsg); message 1028;
Run Code Online (Sandbox Code Playgroud)
在对 IDR 中的代码进行逆向工程时,如何知道消息号 1028?
我正在挂接 Frida 中的某个函数,该函数使用以下代码:
this.carrier.getId()
Run Code Online (Sandbox Code Playgroud)
然而,此时this.carrier尚未设置,这会导致应用程序崩溃。
所以我正在考虑在类的当前函数中手动设置这个成员。因此,当代码发生时,该载体就会存在。
问题是我这样做遇到了问题。
到目前为止,这就是我得到的:
Java.perform(function () {
var SignUpActivity = Java.use('com.app.features.authentication.SignUpActivity');
SignUpActivity.validatePhoneNumber.implementation = function() {
var Carrier = Java.use("com.app.Carrier");
this.carrier = Carrier.$new();
console.log(this.carrier) // This prints "[object Object]"
console.log(this.carrier.setId) // This prints "undefined"
this.carrier.setId(123); // crashes
};
});
Run Code Online (Sandbox Code Playgroud)
承运人代码:
package com.app;
import android.os.Parcel;
import android.os.Parcelable;
public class Carrier implements Parcelable {
private int id;
private String name;
private String officeTerminalAddress;
public Carrier() {
}
protected Carrier(Parcel parcel) {
this.id = parcel.readInt();
this.name = parcel.readString(); …Run Code Online (Sandbox Code Playgroud) 我有一个指令块,我想知道电脑寄存器是如何工作的。维基百科上说,pc 寄存器保存下一条要执行的指令的值,但是,查看二进制忍者的反汇编图以查找同一指令块,似乎这并不完全正确。
这是二进制忍者的反汇编图的一部分,其中每个内存加载前面都写入了加载发生的内存地址。

000080ec ldr r3, [pc, #76] -> 0x813c = 0x80f0 + 0x4c -> pc = 80f0 ?? (shouldnt it be 80ee).
000080ee cmp r3, #0
000080f0 it eq
000080f2 ldreq r3, [pc, #68] -> 0x8138 = 0x80f4 + 0x44 -> pc = 80f4 (this makes sense).
000080f4 mov sp, r3
000080f6 sub.w sl, r3, #65536 (edited)
Run Code Online (Sandbox Code Playgroud)
这也发生在代码中,并不总是电脑保存下一条要执行的指令的地址..有什么我应该考虑的吗?
我正在为游戏编写一些代码,并尝试编写一个辅助函数来返回对象内的字符串:
const char* getGhostName(GhostAI* ghostAI)
{
if (ghostAI) {
GhostInfo* ghostInfo = getGhostInfo(ghostAI);
const auto ghostName = ghostInfo->fields.u0A6Du0A67u0A74u0A71u0A71u0A66u0A65u0A68u0A74u0A6Au0A6F.u0A65u0A66u0A6Eu0A67u0A69u0A74u0A69u0A65u0A74u0A6Fu0A67;
const char* name = il2cppi_to_string(ghostName).c_str();
return name;
}
return "UNKNOWN";
}
Run Code Online (Sandbox Code Playgroud)
这是il2cppi_to_string函数:
std::string il2cppi_to_string(Il2CppString* str) {
std::u16string u16(reinterpret_cast<const char16_t*>(str->chars));
return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16);
}
std::string il2cppi_to_string(app::String* str) {
return il2cppi_to_string(reinterpret_cast<Il2CppString*>(str));
}
Run Code Online (Sandbox Code Playgroud)
当我调用 时getGhostName,我最终得到一个空字符串。现在我确实收到了来自 ReSharper 的警告,其中写着:
支持指针的对象将在完整表达式的末尾被销毁。
getGhostName调用时,这会出现在以下行中il2cppi_to_string:
const char* name = il2cppi_to_string(ghostName).c_str();
Run Code Online (Sandbox Code Playgroud)
我不完全确定这意味着什么或如何修改代码来修复它。我绝对讨厌在 C++ 中使用字符串。
我只是想知道,在 Windows 上是否有任何更改可以操作它或破坏它?
例如 ivgot 的代码如下:
while (1)
{
auto v6 = __rdtsc();
switch (v6 & 0xF)
{
case 1ui64:
something();
break;
case 2ui64:
something2();
break;
default:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
并且请求很简单,只需打破唯一的 2ui64 情况即可。
我一直在对 Java 应用程序进行逆向工程,并且偶然发现了一些有趣的东西。我发现的字节码似乎违反了规则,因为没有首先在构造函数中初始化超类。
我正在尝试弄清楚这怎么可能。这可能是Java编译器的正常行为,还是某种偷偷摸摸的混淆技术(注:值得一提的是,原始类名尚未被混淆器剥离,这表明混淆过程可能不是很彻底。因此,字节码结构不太可能是故意混淆的结果。)
任何人都可以提供一些关于生成这种非常规字节码的原始代码是什么样子的见解吗?我渴望了解并解开这个谜团。非常感谢!
这是字节码。
final class a/ka$a extends java/lang/Thread {
<ClassVersion=51>
<SourceFile=CLThreadPool.java>
private synthetic a.ka a;
public ka$a(a.ka arg0, java.lang.String arg1, boolean arg2) { // <init> //(La/ka;Ljava/lang/String;Z)V
<localVar:index=0 , name=this , desc=La/ka$a;, sig=null, start=L0, end=L4>
<localVar:index=2 , name=name , desc=Ljava/lang/String;, sig=null, start=L0, end=L4>
<localVar:index=3 , name=daemon , desc=Z, sig=null, start=L0, end=L4>
L0 {
aload 0 // reference to self
aload 1 // reference to arg0
putfield a/ka$a.a:a.ka
}
L1 {
aload 0 // reference to self
aload 1 …Run Code Online (Sandbox Code Playgroud) 我正在和一个客户一起重振他14年前使用Foxpro2.6开发的旧软件.我的问题是客户端只有源代码(以.prg文件的形式)和数据库文件,但源代码中既没有任何文档也没有注释来指导我做什么...甚至数据库文件都没有正确命名.我在这种情况下的唯一选择似乎是通过.prg文件,并了解哪个命令更新哪个数据库记录和如何....但有大约300 .prg文件,我根本不知道Fox Pro(我的意思是我当这个东西变得过时时,它已经达到了第9个标准!).
任何建议或想法使这项工作变得简单,也许是一个.prg到C转换器,它可以帮助我很多.
请帮助....它正在成为一场噩梦
PS:我没有数据库转换的问题,但前端和功能源代码也写在FoxPro2.6并保存为.prg扩展是问题,因为我不知道语言,没有文档.